数据是机器学习的燃料,数据预处理就是为机器学习模型提供好燃料,数据好,模型才能跑得更带劲。。
其中收集数据和预处理完整的步骤如下:
数据收集、数据可视化、数据清洗、特征工程、构建特征集和验证集、拆分训练集测试集和验证集这几个步骤,当然这几个步骤并不是完全按照流程操作,其中会相互交叉,或者往返操作。
- 收集数据
收集数据方法有多种,现实中要在运营环节中做很多数据埋点、获取用户消费等行为信息和兴趣偏好信息,网上爬取数据等等。 可参考极客时间-《数据分析实战45讲》中的方法。
- 数据可视化
作用是通过可视化观察下数据,看一看特征和标签之间可能存在的关系、看看数据里有没有脏数据和离群点等,为选择具体的机器学习模型找找感觉。
#加载数据 import pandas as pd # 导入pandas数据处理工具包 df_ads= pd.read_csv('test.csv') #读入数据 df_ads.head(10) #显示前几行数据
python数据可视化必备工具包:一个是python画图工具库Matplotlib,另外一个是统计学数据可视化工具Seaborn。
#散点图来观察数据之间分布关系 import matplotlib.pyplot as plt import seaborn as sns plt.plot(df_ads['点赞数'],df_ads['浏览量'],'r.',label='Training data') plt.xlabel('goods') plt.ylabel('views') plt.legend() plt.show()
如下图所示:
基本可以看出呈现线性相关性。
接下来看下箱线图:
data = pd.concat([df_ads['浏览量'], df_ads['热度指数']], axis=1) # 浏览量和热度指数 fig = sns.boxplot(x='热度指数', y="浏览量", data=data) # 用seaborn的箱线图画图 fig.axis(ymin=0, ymax=800000); #设定y轴坐标
- 数据清洗
洗菜洗得越干净,模型效果越好,主要数据清洗分为四种情况:
- 第一种是处理缺失的数据,如果备份系统里面有缺了的数据,尽量去补录。如果没有可以剔除残缺的数据,也可以用其他数据记录的平均值、随机值或者0来补值,这个补值的过程叫数据修复。
- 第二种是处理重复的数据,如果完全重复的数据删掉就行,如果同一个主键出现两行不同的数据,就需要看看有没有其他辅助的信息可以帮助我们判断(如时间戳),要是无法判断的话,只能随机删除或者全部保留。
- 第三种是处理错误数据:比如商品的销售量、销售金额出现负值,这时候需要删除或者转化为有意义的值,再比如表示百分比或者概率的字段,如果值大于1,也属于逻辑错误数据
- 第四种处理不可用的数据,这指的是整理数据的格式,比如有些商品是以人民币为单位,有些以美元为单位,就需要线统一,另外就是把是和否转换为1、0 值再输入机器学习模型。
如何查看数据集中的数据需要清洗了?
可以通过DataFrame的isna().sum()函数来统计所有的NaN的个数。NaN意思是Not A Number,在python中,它代表无法表示、也无法处理的值也就是典型的脏数据。
df_ads.isna().sum() # Nan出现的个数。
可以使用dropna()这个API把出现了NaN的数据行删掉
df_ads = df_ads.dropna()#把出现了NaN的数据行删掉
还有其他数据清洗的方法,需要针对具体的项目和数据集进行处理。
- 特征工程
特征工程是一个专门的机器学习子领域,它是数据处理过程中最有创造力的环节,特征工程做的好不好,非常影响机器学习模型的效率。
什么是特征工程了?比如说评估身体健康状况的一个指标BMI,它等于体重除以身高的平方,这就是一个特征工程。经过了这个过程,BIM这一个指数就替代了原来的两个特征-体重和身高,而且完全能客观地描绘我们身材情况。
这样的好处是什么?通过BMI这个特征,降低了特征数据集的维度。数据集中每多一个特征,模型拟合的特征空间就更大、运算量也就更大。所以,摒弃掉冗余的特征、降低特征的维度,能使机器学习模型训练得更快。
- 构建特征集和标签集
特征就是所收集的各个数据点,是要输入机器学习模型的变量,而标签是要预测、判断或者分类的内容。对于所有监督学习,我们需要像模型中输入“特征集”和“标签集”这两组数据。
通常从一个包含了特征和标签的数据,构建特征数据集和一个标签数据集合,只需要从原数数据删除不需要的数据就行了。
比如:
X=df_ads.drop['浏览量'],axis=1): Y=df_ads.浏览量
无监督学习不需要这样的步骤
- 拆分训练集、验证集和测试集合
从原数据集从列的维度纵向拆分成了特征集和标签集后,还需要进一步从行的维度横向拆分。主要原因是机器学习并不是通过训练数据集找出一个模型就结束了,我们要用验证数据集看看这个模型好不好,然后用测试数据集看看模型在新数据上能不能用。
拆分依据数据量来看,比如20%或30% ,具体的拆分,通常会用机器学习工具包scikit-learn 里的数据拆分工具train_test_split来完成
from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=0)