对于数据分析部分,需要探索以下几个点:1)MissingValues
2)AllTheNumericalVariables
3)DistributionoftheNumericalVariables
4)CategoricalVariables
5)CardinalityofCategoricalVariables
6)Outliers
Relationshipbetweenindependentanddependentfeature(SalePrice)
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。
特征工程中可能有以下问题:
模型部分通常可以选择机器学习模型,也可以选择使用深度学习模型,特别地,很多时候模型集成往往有着出人意料的效果。
评价标准为MAE(MeanAbsoluteError)。
这里我们发现bodyType,fuelType和gearbox缺失比较多,model缺失一行,price由于是输出,这里不用额外处理。
首先提取非匿名变量进行分析,随机抽样10行数据.
这里发现了列名为notRepairedDamage的取值中包含了"-"的异常值,这里使用众数进行替换
concat_data['notRepairedDamage']=concat_data['notRepairedDamage'].replace('-',0).astype('float16')接着继续分析匿名变量
对于缺失值,先简单的使用众数进行填充。填充完后,数据中不再含有缺失值。
对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征(如成绩这个特征有好,中,差变成one-hot就是100,010,001)。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。这样做的好处主要有:
可以通过df.value_counts().plot.bar来绘制数值分布情况
对类别较少的特征采用one-hot编码,编码后特征由31个变为50个。
one_hot_list=['gearbox','notRepairedDamage','bodyType','fuelType']forcolinone_hot_list:one_hot=pd.get_dummies(concat_data[col])one_hot.columns=[col+'_'+str(i)foriinrange(len(one_hot.columns))]concat_data=pd.concat([concat_data,one_hot],axis=1)这里发现seller和offerType虽然应该是二分类的取值,但是分布情况都偏向于一种取值结果,可以直接删掉
concat_data.drop(['offerType','seller'],axis=1,inplace=True)对于匿名变量来说,希望能更多的使用到这里的数值信息,通过选取若干个非匿名变量和匿名变量进行加法和乘法的数值操作,扩展数据的特征
日期数据同样是很重要的数据,有着具体的实际含义。这里我们先提取出日期中的年月日,再具体分析每个日期的数据。
#对类别较少的特征采用one-hot编码one_hot_list=['creatDate_year','creatDate_month','regDate_month','regDate_year']forcolinone_hot_list:one_hot=pd.get_dummies(data[col])one_hot.columns=[col+'_'+str(i)foriinrange(len(one_hot.columns))]data=pd.concat([data,one_hot],axis=1)#删除无用的SaleIDdata.drop(['SaleID'],axis=1,inplace=True)增加特征数量增加特征的数量可以从数理统计的角度出发,通过选取一些变量的数理特性来增加数据维度
定性特征的基数(cardinality)指的是这个定性特征所有可能的不同值的数量。在高基数(highcardinality)的定性特征面前,这些数据预处理的方法往往得不到令人满意的结果。
高基数定性特征的例子:IP地址、电子邮件域名、城市名、家庭住址、街道、产品号码。