参考链接:https://blog.csdn.net/han_xiaoyang/article/details/50469334
机器学习问题解决思路
上面带着代价走马观花过了一遍机器学习的若干算法,下面我们试着总结总结在拿到一个实际问题的时候,如果着手使用机器学习算法去解决问题,其中的一些注意点以及核心思路。主要包括以下内容:
- 拿到数据后怎么了解数据(可视化)
- 选择最贴切的机器学习算法
- 定位模型状态(过/欠拟合)以及解决方法
- 大量极的数据的特征分析与可视化
- 各种损失函数(loss function)的优缺点及如何选择
问题来了,过拟合咋办?
针对过拟合,有几种办法可以处理:- 增大样本量
- 减少特征的量(只用我们觉得有效的特征)
- 增强正则化作用(比如说这里是减小LinearSVC中的C参数)
正则化是我认为在不损失信息的情况下,最有效的缓解过拟合现象的方法。
- l2正则化,它对于最后的特征权重的影响是,尽量打散权重到每个特征维度上,不让权重集中在某些维度上,出现权重特别高的特征。
- 而l1正则化,它对于最后的特征权重的影响是,让特征获得的权重稀疏化,也就是对结果影响不那么大的特征,干脆就拿不着权重。
****************************************************************************************
label本身并不平滑。为了我们分类器的学习更加准确,我们会首先把label给“平滑化”(正态化)
这一步大部分同学会miss掉,导致自己的结果总是达不到一定标准。
这里我们使用最有逼格的log1p, 也就是 log(x+1),避免了复值的问题。
记住哟,如果我们这里把数据都给平滑化了,那么最后算结果的时候,要记得把预测到的平滑数据给变回去。
按照“怎么来的怎么去”原则,log1p()就需要expm1(); 同理,log()就需要exp(), ... etc.
all_df['MSSubClass'].dtypes
all_df['MSSubClass'] = all_df['MSSubClass'].astype(str)
变成str以后,做个统计,就很清楚了
all_df['MSSubClass'].value_counts()
pd.get_dummies(all_df['MSSubClass'], prefix='MSSubClass').head()
此刻MSSubClass被我们分成了12个column,每一个代表一个category。是就是1,不是就是0。
同理,我们把所有的category数据,都给One-Hot了
all_dummy_df.isnull().sum().sort_values(ascending=False).head(10)
可以看到,缺失最多的column是LotFrontage
处理这些缺失的信息,得靠好好审题。一般来说,数据集的描述里会写的很清楚,这些缺失都代表着什么。当然,如果实在没有的话,也只能靠自己的『想当然』。。
在这里,我们用平均值来填满这些空缺。
numeric_cols = all_df.columns[all_df.dtypes != 'object']
numeric_cols
计算标准分布:(X-X')/s
让我们的数据点更平滑,更便于计算。
注意:我们这里也是可以继续使用Log的,我只是给大家展示一下多种“使数据平滑”的办法。