聊聊 pandas 以及Feature Enginering

最近开始在天池上做题,进行数据清洗的时候发现 Pandas 的数据透视表是基于MutiIndex的,这是很大一个惊喜,不过发现用起来还是有些问题。比如说iloc属性没法使用(ix,iat估计也一样)。对于爱用 python 进行数据处理的人来说 pandas 真的是天赐宝物。

所以在这里聊聊自己用 pandas 做 Feature Enginering 的一些小体会。

本来做特征工程的主要作用其实是给机器学习使用,提高模型的效率。

由来

这几天空闲时间在做天池的一个竞赛题目,汽车销量预测。(不做另外一个的原因是,主办方在上牌预测中提供的训练数据实在是太少了。需要自行外部获取,我又对行业不了解。所以自然选择了这个)

初见

开头从官网上下载数据的时候就发现了一些问题,比如训练集(train) 数据有多余的列。删除掉之后就继续做了。

把数据简单看下没有大问题的情况下,我一般的习惯是使用 pandas 的pd.DataFrame.describepd.DataFrame.corr来了解情况。前者是可以看到每一个特征(Feature)的大概情况(见下表格)。而后者则是计算各个特征(Feature)的相关系数(下图是使用Seaborn 进行可视化后的数据)。

















































































































































































































































































































sale_date class_id sale_quantity brand_id compartment type_id level_id department_id TR gearbox_type engine_torque car_length car_width car_height total_quality equipment_quality rated_passenger wheelbase front_track rear_track
count 20157.000000 20157.000000 20157.00000 20157.000000 20157.000000 20157.000000 20157 20157.000000 20157 20157 20157 20157.000000 20157.000000 20157.000000 20157.000000 20157.000000 20157 20157.000000 20157.000000 20157.000000
unique NaN NaN NaN NaN NaN NaN 6 NaN 10 7 111 NaN NaN NaN NaN NaN 10 NaN NaN NaN
top NaN NaN NaN NaN NaN NaN 1 NaN 6 AT 155 NaN NaN NaN NaN NaN 5 NaN NaN NaN
freq NaN NaN NaN NaN NaN NaN 10619 NaN 7640 8421 1918 NaN NaN NaN NaN NaN 18238 NaN NaN NaN
mean 201490.186784 507410.234906 126.31205 643.293645 2.518033 1.860297 NaN 3.348316 NaN NaN NaN 4577.579600 1790.405269 1552.624448 1876.938582 1414.852657 NaN 2706.141589 1538.063055 1538.027980
std 157.488965 234920.469728 231.13742 250.153093 0.528447 0.608067 NaN 1.552570 NaN NaN NaN 266.704254 62.189750 124.673136 222.324373 208.956548 NaN 129.011827 55.662680 56.429887
min 201201.000000 103507.000000 5.00000 12.000000 1.000000 1.000000 NaN 1.000000 NaN NaN NaN 3675.000000 1510.000000 1415.000000 1350.000000 925.000000 NaN 2360.000000 1280.000000 1290.000000
25% 201402.000000 304458.000000 16.00000 537.000000 2.000000 2.000000 NaN 2.000000 NaN NaN NaN 4431.000000 1765.000000 1465.000000 1720.000000 1267.000000 NaN 2614.000000 1517.000000 1515.000000
50% 201506.000000 472603.000000 47.00000 750.000000 3.000000 2.000000 NaN 4.000000 NaN NaN NaN 4598.000000 1802.000000 1484.000000 1835.000000 1390.000000 NaN 2690.000000 1549.000000 1550.000000
75% 201609.000000 692703.000000 142.00000 814.000000 3.000000 2.000000 NaN 4.000000 NaN NaN NaN 4718.000000 1830.000000 1646.000000 2020.000000 1556.000000 NaN 2770.000000 1575.000000 1571.000000
max 201710.000000 978089.000000 6284.00000 985.000000 3.000000 4.000000 NaN 7.000000 NaN NaN NaN 5266.000000 1942.000000 1960.000000 2520.000000 2005.000000 NaN 3108.000000 1655.000000 1671.000000


11 rows × 32 columns



corr 计算后使用seaborn可视化。

这里我发现了一个比较有意思的情况,我们要预测的值 sale_quantity 实际上与各项参数的相关系数都不高。看来这个问题确实还需要深挖。

观察各个特征

在观察各项特征(Feature) , 在对数据有了一个简单印象之后,我开始观察各个特征(Feature) 是以那种方式存储(int,float,string)。然后统计了一下各个Feature的一些常见数据。发现了他们基本都是离散的。

在发现数据离散之后我开始逐步去了解数据,逐步发掘各个Feature 与 sale_quantity 之间的数据联系。然后我发现了一个大问题。

发现了问题

主办方提供的数据本身有问题。这个问题需要参赛者观察 训练集 和 要提交的测试集,并且观察完训练集之后才能发现。

那就是——测试集中只提供了车型的 class_id,但是在训练集中,我们可以发现同样的 class_id 中,某几项参数仍然存在不同(level_id,TR,gearbox_type,power,car_length,emission_standards_id,car_height,total_quality,equipment_quality,rated_passenger,front_track )。

这也使得我必须要重新清洗数据。

清洗数据

清洗的思路很简单:

  1. 利用 pandas 把以上几项特征合并起来。
  2. 再利用pandas.pivot数据透视表功能提取出合并特征后的销量数据。
  3. 选择销量最好的合并特征作为某个 class_id 的实际特征。这样我们就得到了一个车型的特征表(共140种特征)
  4. 再用车型特征表,重新生成训练集数据和预测集数据。

车型特征表长这样:

1
2
print(class_id_param.shape)
class_id_param.head(10)
(140, 28)








































































































































































































































































































brand_id_code compartment_code type_id_code department_id_code displacement_code if_charging_code price_level_code driven_type_id_code fuel_type_id_code newenergy_type_id_code TR_code gearbox_type_code power_code car_length_code emission_standards_id_code car_height_code total_quality_code equipment_quality_code rated_passenger_code front_track_code
class_id
289403 0 1 0 0 8 0 8 0 1 0 5 4 217 58 0 71 95 160 2 56
745137 0 1 0 0 8 0 8 0 1 0 5 4 210 47 0 42 70 132 2 53
714860 0 1 0 0 8 0 8 0 1 0 5 1 11 151 2 26 120 159 2 76
175962 0 1 0 0 8 0 8 0 1 0 3 5 186 72 2 30 27 39 2 11
270690 0 1 0 0 8 0 8 0 1 0 3 5 190 54 0 146 119 91 2 3
290854 0 1 0 0 8 0 8 0 1 0 3 1 74 96 2 115 196 270 2 65
692703 0 1 0 0 8 0 8 0 1 0 5 1 25 81 0 110 137 219 2 73
978089 0 1 0 0 8 0 8 0 1 0 3 5 184 122 0 31 35 87 2 22
219195 0 1 0 0 8 0 8 0 1 0 5 5 21 39 2 121 138 215 2 30
851857 0 1 0 0 8 0 8 0 1 0 7 1 110 169 0 113 236 324 2 106

10 rows × 28 columns


然后就是用清洗好的数据,去重新提取特征和训练就好啦。(这里牵涉到sklearn 的一些模块,以后慢慢写)

最后

对我来说处理特征,主要步骤:

  1. 初步了解数据概况
When you are old

最近访客