【基础课—机器学习项目】第二周第一节:数据预处理

内容简介

任务简介:数据的处理与数据的EDA和数据的基本的处理方式
详细说明:这节课中我们将要学习的内容如下:
1、数据EDA探索(数据可视化探索)发现数据里包含的内容
2、数据的特征工程(特征处理、特征选择、特征重做)
特征工程非常重要,但是这个东西和具体的问题和场景有很大的相关性,因此我们再研究某个例子的时候,不要拘泥于具体的细节,而是要从整体上把握提取特征工程的方法。

数据EDA探索

接上节课的内容,先读取数据,然后大概浏览一下训练数据的信息:
在这里插入图片描述
训练数据 共 6000 条,21列, 无空值, 除标签 Quality_label 这一列是object类型之外,其他列的数据类型全为 float64

数据可视化:数据离散和连续性分析

这个分析对于选择模型很重要

# 获取列名
col_name = train_data.drop(['Quality_label'],1).columns
Notdlts_count = []
for i in col_name:
    # 计算非重复值的个数
    Notdlts = len(train_data[i].drop_duplicates())/6000
    Notdlts_count.append(Notdlts)


plt.plot(col_name, Notdlts_count, c='r')
plt.title('非重复值的总数计算')                 # 标题
plt.xlabel('列名')                        # x轴 的轴名
plt.ylabel('非重复数据在全数据上的占比')  # y轴 的轴名
plt.xticks(rotation=45)                   # 旋转 x轴的刻度名
plt.show()

从上面代码可知,如果某列没有重复值,那么它对应的y值为1,重复值越多,y值越接近0
没有重复值意味着这个列的值是连续的,如1–6000。
有重复值意味这个列的值是离散的,例如:只有0和1这两个值。
在这里插入图片描述
因此:由上图可得 Parameter 5 - 10 基本为离散特征,而 Attribute4 - 10,有可能是 离散特征, 其余均为连续特征

数据分布差异

对数据进行开根号,取对数等操作,尽量使得数据呈高斯分布
在这里插入图片描述
统计每一个列的取值范围并可视化的代码如下:

# 遍历列名
for i in col_name:
    plt.hist(unit[i], bins=20)
    plt.title('%s 平均分割取值范围计数统计图'%i)
    plt.xlabel('%s范围'%i)
    plt.ylabel('值在该范围的个数')
    plt.show()

下面这个是最好的情况
在这里插入图片描述
大多数是这样:
在这里插入图片描述
因此我们需要对数据进行去偏处理。

数据的离散程度–看数据的标准差

# 获取列名
col_name = unit.columns

# 计算 标准差(std)
col_std = unit.describe().T['std']
    
plt.plot(col_name, col_std, c='red')  # 作图
plt.title('列 - 标准差')     # 标题
plt.xlabel('列名')           # x轴 的轴名
plt.ylabel('标准差')         # y轴 的轴名
plt.xticks(rotation=90)      # 旋转 x轴的刻度名
plt.show()

在这里插入图片描述
列 Attribute10 标准差太高,导致无法明显分辨其他列的标准差
也就是说数据的量级不一样,要统一一下。

数据的特征工程

去偏

通过 开N方(取2,3,4都可以,不建议过大,这里以 4为例) 的方式,将 0-1 的值增大,并缩小 大于1的值,下面是去偏的效果。
在这里插入图片描述
在这里插入图片描述
但是也有效果不好的属性:
在这里插入图片描述
在这里插入图片描述

去除数据的标准差

为了进一步观察标准差的差异,将 原标准差 进行开4次方,再观察图像,红色是以第一个标准差为基准做的一条线。
在这里插入图片描述
因为全部的特征取值范围都要 > 0, 所以可以通过log变换 但为了不影响接近于0的小数 故因为 当 x --> 0 时, 有 ln(x+1) --> x ,log变化可以有效的把大的数字缩小。

# np.log() 默认底数为 e
unit[col_name] = np.log(unit[col_name] + 1)

这里如果不加1,那些取值[0,1]的x编号后,得到的y会小于0,所以所有属性都加1.

# 计算变换后的 标准差(std)
col_log_std = unit[col_name].describe().T['std']
    
plt.plot(col_name, col_log_std, c='red')  # 作图
plt.title('列 - 标准差')     # 标题
plt.xlabel('列名')           # x轴 的轴名
plt.ylabel('标准差')         # y轴 的轴名
plt.xticks(rotation=90)      # 旋转 x轴的刻度名
plt.show()

在这里插入图片描述
从图中纵坐标可以看出 数据的标准差已经在 [0, 1] 这个范围内

特征归一化

for i in unit.columns:
    unit[i] = (unit[i] - unit[i].min()) / (unit[i].max() - unit[i].min())

特征选择

这里如果有工程相关背景可以手工选取,例如预测房屋出租价格,房间数量,卫生间数量这两个特征可能会有一定的关联性(房间越多,卫生间越多的正比关系),我们可以根据经验只选择一个房间数量作为预测的特征。
但是这里的数据经过加密或者我们也不了解加工的工艺,不知道哪些特征是多余的,就用卡方检验来大概的筛选,k是我们手工指定的需要留下来的特征数量,是我们需要尝试的。卡方检验实际上是从数据相关性查看特征的关系,如果是强相关就可以去掉其中一个。

# 设置卡方检验,选择k=14个最佳特征
test = SelectKBest(score_func=chi2, k=14) ##选择成最后的十四个特征
# 进行检验
fit = test.fit(unit, train_data['Quality_label'])  
# 打印卡方检验值
print(fit.scores_)  

[9.03534659e-02 2.18659275e-01 1.99045756e-01 4.26276408e-02
4.59123720e+01 5.97005709e+01 2.25101436e+01 3.18324532e+01
1.70744842e+01 1.31700513e+01 7.08908231e-01 2.03169072e-01
9.03993318e-01 2.59665205e+02 1.08218663e+02 9.44179389e+01
1.25130378e+02 9.88788120e+01 5.44681184e+01 2.29166885e+01]

发布了172 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/oldmao_2001/article/details/104616491
今日推荐