热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python机器学习之数据探索

🐱今天我们来讲解数据建模之前需要处理的工作,也就是数据探索的过程,很多同学会说,不就是处理缺失值,异常值&#

🐱今天我们来讲解数据建模之前需要处理的工作,也就是数据探索的过程,很多同学会说,不就是处理缺失值,异常值,然后标准化吗?最后直接代入模型。其实大家说的也没错,但是今天我想更系统地从统计学的角度来展示一下数据探索的全过程,让我们接着下聊👇:
🐶就如我们之前说到的,机器学习也叫作统计学习,是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。我们虽然在拿到数据后直接运用机器学习的模型进行训练,这样也能得出效果,但是当模型测试集的loss过大时,你是否想过模型分布不一致,模型不够复杂,模型的optimization不够好等问题.

数据探索流程:

    • 1.查看数据集
    • 2.缺失值处理
    • 3.异常值的处理
    • 4.判断高斯分布
    • 5.训练集和测试集的分布
    • 6.判断线性相关
    • 7.变量的相关性
    • 8.Box-Cox变换


1.查看数据集

数据集的查看这一部分就很简单

#导入数据,编码方式为utf-8,每个字段的分割符为一个tab
import pandas as pd
train_data=pd.read_csv(r"C:\Users\Administrator\Desktop\zhengqidata\zhengqi_train.txt",encoding="utf-8",sep="\t")
test_data=pd.read_csv(r"C:\Users\Administrator\Desktop\zhengqidata\zhengqi_test.txt",encoding="utf-8",sep="\t")
#查看数据集的基本信息
train_data.info()

在这里插入图片描述

#查看训练集统计信息 主要包括样本数、均值、标准差、最大值,最小值、分位点等信息
train_data.describe()

数据集信息的展示:
在这里插入图片描述

#查看前几列数据
train_data.head()

结果如下:
在这里插入图片描述

2.缺失值处理

对于数据中缺失值的处理主要分为以下几个方面:

  • 删除缺失值:将含有缺失值的行删除
  • 填补缺失值:利用平均数、众数和中位来填补,也可以使用预测模型来填补。

3.异常值的处理

异常值是指远远偏离整个样本总体的观测值;异常值我们通常采用箱线图来处理,处在上下限之外的数据都都属于异常值。处理的方式:

  • 删除:如果是由于输入误差、数据处理误差引起的异常值,或者异常值很小,则可以直接将其删除。
  • 转换:数据转换可以消除异常值,如对数据取对数会减轻由极值引起的变化。
  • 填充:就像处理缺失值一样,我们可以对异常值进行修改,如使用平均值,中值或者其他方法进行填充。
  • 区别对待

#箱线图:箱线图是用来处理异常值值的,通常将远远偏离整个样本总体的观测值称为异常值
#先画出v0特征的箱线图
fig=plt.figure(figsize=(4,6))#指定画布的宽度和高度
sns.boxplot(train_data['V0'],orient="v",width=0.5)

我们先画出一个特征的箱线图

#箱线图:箱线图是用来处理异常值值的,通常将远远偏离整个样本总体的观测值称为异常值
#先画出v0特征的箱线图
fig=plt.figure(figsize=(4,6))#指定画布的宽度和高度
sns.boxplot(train_data['V0'],orient="v",width=0.5)

在这里插入图片描述

画出所有特征的箱线图

#把所有特征的箱线图画出来
column=train_data.columns.tolist()
plt.figure(figsize=(80,60))
for i in range(len(column)):plt.subplot(6,8,i+1)#将画布分割为6行8列sns.boxplot(train_data[column[i]],orient="v",width=0.5)#每一个小区域画出箱型图plt.xlabel(column[i],fontsize=36)#x轴的注释为xlabel
plt.show()

结果如下:
在这里插入图片描述

4.判断高斯分布

直方图是用来描述数据的分布形状,QQ图可以判断数据分布是否属于正态分布。

#直方图和QQ图
#QQ图是指数据的分位数和正态分布的分位数对比参照的图,如果数据符合正态分布,所有的点都会落在直线上。
#我们首先绘制V0变量的统计分布
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
sns.distplot(train_data["V0"],fit=stats.norm)#fit=stats.norm代表标准正态分布
plt.subplot(1,2,2)
stats.probplot(train_data["V0"],plot=plt)

结果如下:
在这里插入图片描述
将所有的变量都判断一下:

#画出所有函数的直方图和QQ图
plt.figure(figsize=(256,128))
i=0
for col in column:i+=1plt.subplot(6*2,8*2,i)sns.distplot(train_data[col],fit=stats.norm)plt.xlabel(col,fontsize=36)i+=1plt.subplot(6*2,8*2,i)stats.probplot(train_data[col],plot=plt)
plt.show()

在这里插入图片描述

5.训练集和测试集的分布

训练集和测试集分布不一致会影响模型训练的结果。我们可以使用KDE的方法来判断训练集和测试集来判断是否属于一个分布。

#KDE分布图
#核密度估计,可以理解为是对直方图的加窗平滑,通过绘制KDE分布图,可以查看并对比训练集和测试级中特征变量的分布情况,发现两个数据集中分布不一致的情况!
plt.figure(figsize=(8,4),dpi=150)
ax=sns.kdeplot(train_data["V0"],color="Red",shade=True)
ax=sns.kdeplot(test_data["V0"],color="blue",shade=True)
ax.set_xlabel("V0")
ax.set_ylabel("Frequency")
ax=ax.legend(["train","test"])
plt.show()

结果如下:
在这里插入图片描述
将多个表都画出来

#画出所有函数的kde图,需要注意的是测试集没有target标签!所以target不要做kde
plt.figure(figsize=(256,128))
for i in range(len(column)-1):ax=plt.subplot(6,8,i+1)ax=sns.kdeplot(train_data[column[i]],color="Red",shade=True)ax=sns.kdeplot(test_data[column[i]],color="blue",shade=True)ax.set_xlabel(column[i])ax.set_ylabel("Frequency")ax=ax.legend(["train","test"])
plt.show()

结果如下:
在这里插入图片描述

6.判断线性相关

这里我们画出了一个特征与目标分布的图像。

#主要是分析变量之间的线性回归关系
plt.figure(figsize=(8,4),dpi=150)
ax=plt.subplot(1,2,1)
sns.regplot(x="V0",y="target",data=train_data,ax=ax,scatter_kws={'marker':'.','s':3,'alpha':0.3},line_kws={'color':'r'});
plt.xlabel('V0')
plt.ylabel('target')
ax=plt.subplot(1,2,2)
sns.distplot(train_data['V0'].dropna())
plt.xlabel('V0')
plt.show()

在这里插入图片描述
画出所有的图像

#画出所有的变量与目标值之间的线性关系
plt.figure(figsize=(256,128))
i=0
for col in test_data.columns:i+=1ax=plt.subplot(2*6,2*8,i)sns.regplot(x=col,y="target",data=train_data,ax=ax,scatter_kws={'marker':'.','s':3,'alpha':0.3},line_kws={'color':'r'});plt.xlabel(col)plt.ylabel('target')i+=1ax=plt.subplot(2*6,2*8,i)sns.distplot(train_data[col].dropna())plt.xlabel(col)plt.show()

7.变量的相关性

#变量之间的相关关系进行分析可以为后面特征工程做准备
#这里我们删除了训练集和测试集分布不一样的特征
pd.set_option('display.max_columns',10)
pd.set_option('display.max_rows',10)
data_train1=train_data.drop(['V5','V9','V11','V17','V22','V28'],axis=1)
train_corr=data_train1.corr()#计算相关系数
train_corr

展示一个相关系数矩阵:
在这里插入图片描述
画出热力图

#画出热力图
ax=plt.subplots(figsize=(20,16))#调整画布的大小
ax=sns.heatmap(train_corr,vmax=8,square=True,annot=True)#热力图

结果如下:
在这里插入图片描述
筛选出较高的相关特征

#根据相关系数来筛选特征变量
#找寻K个特征与目标值最相关
k=10
cols=train_corr.nlargest(k,'target')['target'].index
print("cols.index",cols)
cm=np.corrcoef(train_data[cols].values.T)
plt.figure(figsize=(10,10))
hm=sns.heatmap(train_data[cols].corr(),square=True,annot=True)
cm

部分数据展示如下:
在这里插入图片描述
找出相关系数大于0.5的特征

#找出相关系数大于0.5的特征
threshold=0.5
corrmat=train_data.corr()
top_corr_features=corrmat.index[abs(corrmat["target"])>threshold]
plt.figure(figsize=(10,10))
g=sns.heatmap(train_data[top_corr_features].corr(),cmap="RdYlGn",annot=True)

这里需要说明一下,相关系数只与绝对值的大小有关,一般用绝对值的大小来判断相关性。
在这里插入图片描述
去除相关性较小的特征
对于相关性较小的特征,我们可以去除。

# threshold=0.5
#相关系数矩阵
corr_matrix= data_train1.corr().abs()
drop_col&#61;corr_matrix[corr_matrix["target"]<threshold].index
data_all.drop(drop_col,axis&#61;1,inplace&#61;True)

8.Box-Cox变换

Box-Cox变化是统计建模中一种常用的建模方法&#xff0c;主要是用于在连续的响应变量不满足正态分布时&#xff0c;可以采用Box-Cox变换&#xff0c;使线性回归模型在满足线性、正态性、独立性及方差齐性的同时又不丢失信息。但在Box-Cox变换之前&#xff0c;需要对数据进行归一化&#xff01;

#box-cox变换&#xff01;将数据转换为满足正态分布的数据
#Box-cox变换是统计建模中常用的一种数据转换的方式。在联系的响应变量不满足正态分布是可以使用该变化&#xff0c;这一变换可以使线性回归模型在满足线性、正态性、独立性及方差齐性的同时&#xff0c;又不丢失信息。
#变换之前需要做归一化
drop_columns&#61;[&#39;V5&#39;,&#39;V9&#39;,&#39;V11&#39;,"V17","V22","V28"]#删除分布不均的数据
train_x&#61;train_data.drop([&#39;target&#39;],axis&#61;1)
#data_all&#61;pd.concat([train_data,test_data],axis&#61;0,ignore_index&#61;True)
data_all&#61;pd.concat([train_x,test_data])
data_all.drop(drop_columns,axis&#61;1,inplace&#61;True)
data_all.head()

关于数据的归一化处理&#xff0c;我们有以下几点需要注意;

  • 可以将训练集和测试集合并之后一起做归一化。
  • 可以分开对数据进行归一化处理。不过前提是测试集和训练数据分布一致。

合并归一化

#合并之后进行归一化
cols_numeric&#61;list(data_all.columns)
def scale_data(col):return (col-col.min())/(col.max()-col.min())
data_all[cols_numeric]&#61;data_all[cols_numeric].apply(scale_data,axis&#61;0)
data_all[cols_numeric].describe()&#96;

分开归一化

#数据分开归一化
train_data_process &#61; train_data[cols_numeric]
train_data_process &#61; train_data_process[cols_numeric].apply(scale_data,axis&#61;0)test_data_process &#61; test_data[cols_numeric]
test_data_process &#61; test_data_process[cols_numeric].apply(scale_data,axis&#61;0)

Box-Cox变换

#我们这里是对训练集和测试集一起归一化&#xff0c;也可以分开进行归一化&#xff0c;&#xff08;分开&#xff09;这种方式需要建立训练数据和测试数据分布一直的情况下&#xff0c;建议在数据量大的情况下使用。
# 绘图显示Box-Cox变换对数据分布影响
cols_numeric_left &#61; cols_numeric[0:13]
cols_numeric_right &#61; cols_numeric[13:] #这里是将特征分为两部分&#xff0c;前13个为第一部分
## Check effect of Box-Cox transforms on distributions of continuous variablestrain_data_process &#61; pd.concat([train_data_process, train_data[&#39;target&#39;]], axis&#61;1)fcols &#61; 6
frows &#61; len(cols_numeric_left)
plt.figure(figsize&#61;(4*fcols,4*frows))
i&#61;0
for var in cols_numeric_left:dat &#61; train_data_process[[var, &#39;target&#39;]].dropna()i&#43;&#61;1plt.subplot(frows,fcols,i)sns.distplot(dat[var] , fit&#61;stats.norm);plt.title(var&#43;&#39; Original&#39;)plt.xlabel(&#39;&#39;)i&#43;&#61;1plt.subplot(frows,fcols,i)_&#61;stats.probplot(dat[var], plot&#61;plt)plt.title(&#39;skew&#61;&#39;&#43;&#39;{:.4f}&#39;.format(stats.skew(dat[var]))) #计算数据集的偏度plt.xlabel(&#39;&#39;)plt.ylabel(&#39;&#39;)i&#43;&#61;1plt.subplot(frows,fcols,i)plt.plot(dat[var],dat[&#39;target&#39;],&#39;.&#39;,alpha&#61;0.5)plt.title(&#39;corr&#61;&#39;&#43;&#39;{:.2f}&#39;.format(np.corrcoef(dat[var],dat[&#39;target&#39;])[0][1]))i&#43;&#61;1plt.subplot(frows,fcols,i)trans_var, lambda_var &#61; stats.boxcox(dat[var].dropna()&#43;1)trans_var &#61; scale_data(trans_var) sns.distplot(trans_var , fit&#61;stats.norm);plt.title(var&#43;&#39; Tramsformed&#39;)plt.xlabel(&#39;&#39;)i&#43;&#61;1plt.subplot(frows,fcols,i)_&#61;stats.probplot(trans_var, plot&#61;plt)plt.title(&#39;skew&#61;&#39;&#43;&#39;{:.4f}&#39;.format(stats.skew(trans_var))) #归一化后&#xff0c;偏度明显变小&#xff0c;相关性变化不大plt.xlabel(&#39;&#39;)plt.ylabel(&#39;&#39;)i&#43;&#61;1plt.subplot(frows,fcols,i)plt.plot(trans_var, dat[&#39;target&#39;],&#39;.&#39;,alpha&#61;0.5)plt.title(&#39;corr&#61;&#39;&#43;&#39;{:.2f}&#39;.format(np.corrcoef(trans_var,dat[&#39;target&#39;])[0][1]))

在这里插入图片描述
做完这些&#xff0c;你对数据就有了大致的了解&#xff0c;接下来就可以做特征工程了&#xff01;


推荐阅读
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了使用Python编写购物程序的实现步骤和代码示例。程序启动后,用户需要输入工资,并打印商品列表。用户可以根据商品编号选择购买商品,程序会检测余额是否充足,如果充足则直接扣款,否则提醒用户。用户可以随时退出程序,在退出时打印已购买商品的数量和余额。附带了完整的代码示例。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • pythonMatplotlib(二)
    Matplotlib+pandas作图一、对csv文件进行提取ruixi.csv对上述表格进行提取并做图画出图像二、对.xlsx进行提取:rui ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
author-avatar
张琇萍家云
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有