调参基本知识
模型复杂度和泛化误差: 当模型太复杂,模型就会过拟合,泛化能力不够,导致泛化误差大;当模型简单,模型就会欠拟合,拟合能力不够,导致泛化误差也大;只有当模型复杂度刚刚好的时候才能够达到泛化误差最小的目标。
树模型是天生复杂度高的模型,我们调整参数,基本是将模型往图像的左边推动。调参的时候一般按照参数的重要程度依次调整,随机森林参数的重要程度如下:
导包
1 | from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor |
读取并探索数据
1 | data = pd.read_csv(r'data.csv') |
1 | data.head() |
1 | # 将标签类移动到最后一列 |
数据预处理
1 | # 筛选特征,删除缺失值过多的列,和观察判断来说和预测的y没有关系的列 |
1 | data.info() |
1 | # 去掉“Embarked”缺失值部分所在的行 |
1 | # 字符串特征转数值特征,这里只是简单的情况,详细的要再多多学习 |
1 | # 利用随机森林处理缺失值列 “Age” |
1 | # 获取特征和标签 |
1 | # 重新调整行索引 |
进行一次简单建模,看模型本身在数据集上的效果
1 | rtf = RandomForestClassifier(n_estimators=100, random_state=90) |
调参
参数具有范围的,可以采用网格搜索进行调参,参数没有范围的,采用学习曲线进行调整。接下来按照参数重要性依次调整。
1. n_estimators
1 | # 利用学习曲线,确定 n_estimators 的大致范围 |
1 | # 在确定好的范围内,确定最佳 n_estimators |
总结:准确率从 0.8323 提升到 0.8391 ,泛化误差减小,模型在图像上往左移动。
2. max_depth
1 | # max_depth 的大小根据数据量调整 |
总结: 准确率从 0.8391 提升到 0.84139 ,泛化误差减小,模型在图像上往左移动。
3. min_samples_leaf
1 | param_grid = {'min_samples_leaf': np.arange(1, 20, 1)} |
总结:准确率从 0.84139 提升到 0.84252 ,泛化误差减小,模型在图像上往左移动。
4. min_samples_split
1 | param_grid = {'min_samples_split': np.arange(2, 22, 1)} |
总结:准确率从 0.84252 提升到 0.84814 ,泛化误差减小,模型在图像上往左移动。
5. max_features
1 | param_grid = {'max_features': np.arange(3, 8, 1)} |
总结:调整 max_features 后,准确率下降,说明模型原先已经位于泛化误差曲线最低点,无论怎么调,都让泛化误差升高, 所以忽略此次调参。
6. criterion
1 | param_grid = {'criterion': ['gini', 'entropy']} |
总结:准确率没有提升,{‘criterion’: ‘gini’} 为默认参数,不需要调整
总结
通过调参,使得准确率从最初的 0.832 提升到 0.848。
最后的调参结果是:
1 | rtf = RandomForestClassifier(n_estimators=47, |