如果你已经完成了自己的一些数据科学项目,那么现在你可能已经意识到,达到 80% 的正确率还不错,并不是很糟糕!但在现实中, 80% 的正确率是无法满足要求的。事实上,在我工作过的大多数公司,都希望最低正确率至少要达到 90%(或他们正在关注的任何指标)。
因此,为了显著提高你的正确率,我们将讨论可以通过掌握哪五个技巧来改进我们的机器学习模型。读完本文后,我们应该会明白,在决定机器学习模型的性能方面起作用的变量,比我们想象的要多得多。
接下来开始阐述改进机器学习模型的五大技巧。
1. 缺失值处理
我见过的最大的错误之一,就是人们对缺失值的处理,这不一定是他们的错。网上很多资料都说,通常要通过均数填补法(Mean imputation)来处理缺失值,用给定特征的均值来替换空值,但这通常并不是最好的方法。
例如,假设我们有一个现实年龄和健康评估分数的表格,并假设一个80岁的老人缺少健康评估分数。如果我们从15岁到80岁的年龄范围内去平均健康评估分数,那么这名80岁老人的健康评估分数似乎会比他实际应该的分数要高得多。
因此,你要问自己的第一个问题就是,为什么数据一开始就缺失了?
接下来,让我们考虑处理缺失数据的其他方法,除了平均值 / 中值填补法:
- 特征预测建模法:回到我刚才提到的关于年龄和健康评估分数的例子,我们可以建立年龄和健康评估得分之间的关系进行建模,然后使用这个模型来找出给定年龄的预期健康评估分数。这可以通过多种技术来实现,包括回归分析、方差分析等等。
- K最近邻填补法:使用K最近邻填补法,缺失数据用另一个相似样本的值来填充,对于那些不知道的,就用距离函数(即欧几里得距离)来确定K最近邻的相似度。
- 删除行:最后,你可以删除该行。通常不建议这样做,但当你有大量的数据要处理时,这样的做法是可以接受的。
2. 特征工程
第二个可以显著改进机器学习模型的技巧是通过特征工程。特征工程是将原始数据转换为特征的过程,这些特征更好地表示人们试图解决的潜在问题。不过,这个步骤并没有具体的方法,这就是为什么说数据科学既是一门科学,又是一门艺术。尽管如此,但还是有一些你可以考虑的事情,如下。
- 将 DateTime 变量转换为一周中的某一天、一年中的某一个月等等。
- 为变量进行分桶操作。(如,对于高度变量,可以这样分桶:100~149 厘米、150~199 厘米、200~249 厘米等等)。
- 组合多个特征和 / 或值来创建新特征。例如,由Kaggle主持的泰坦尼克号生存挑战赛中正确率最高的模型之一,设计了一个名为 “is_women_or_child” 的新变量,如果这个人是妇女或儿童,则为真,否则为假。
3. 特征选择
可以大大提高模型正确率的第三个技巧是特征选择,即选择数据集中最相关 / 最有价值的特征。太多的特征会导致算法过拟合,而太少的特征又会导致算法的欠拟合。
有两种我喜欢使用的主要方法,你可以使用它们来帮助你进行特征选择。
- 特征重要性法:一些算法,如随机森林或 XGBoost,允许你确定哪些特征在预测目标变量的值时是最“重要”的。通过快速创建其中的一个模型并进行特征重要性的处理,你将了解到哪些变量比其他变量更为有用。
- 降维法:作为最常用的降维分析技术之一,主成分分析(Principal Component Analysis,PCA)采用了大量的特征,并使用线性代数将它们约简到较少的特征。
4. 集成学习算法
改进机器学习模型的最简单技巧之一就是简单地选择一种更好的机器学习算法。如果你还不知道什么是集成学习算法,那么现在就是学习它的时候了!
集成学习(Ensemble Learning)是一种将多种学习算法结合使用的方法。这样做的目的是,与单独使用单个算法相比,它能允许你实现更高的预测性能。
流行的集成学习算法包括随机森林算法、XGboost算法、梯度提升算法和AdaBoost算法等。为了解释集成学习算法如此强大的原因,我将举一个随机森林的例子:
随机森林包括使用原始数据经过自助法(Bootstrap)处理的数据集创建多个决策树。然后,模型选择每个决策树的所有预测的模式(大多数)。这有什么意义呢?通过依赖“多数为胜”模型,它降低了单个树出错的风险。
例如,如果我们创建一个决策树,即第三个决策树,它将预测为 0。但是如果我们依赖所有 4 个决策树的模式,那么预测值将为 1。这就是集成学习的力量!
5. 超参数调整
最后,有些技巧虽然不经常谈到,但仍然非常重要,那就是调整模型超参数。你必须清楚地理解你正在使用的机器学习模型,否则,你很难理解这个模型的超参数是什么。
来看一下随机森林的所有超参数:
class sklearn.ensemble.RandomForestClassifier(n_estimators=100, *, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None
例如,了解min_impurity_decrease是什么可能是个好主意,这样,当你想让你的机器学习模型更宽容时,可以对这个参数进行调整!