本文分为 理论介绍 和 Python 代码实现 两部分
👉 点此直接跳转到代码实现
过拟合和欠拟合
欠拟合
对于给定的数据集,欠拟合的成因大多是模型不够复杂、拟合函数能力不够,为此,可以增加迭代次数继续训练、尝试更换其他算法、增加模型的参数数量和复杂程度,或者采用集成方法
过拟合
过拟合成因是给定的数据集相对过于简单,使得模型在拟合函数时过分的考虑了噪声等不必要的数据间的关联。或者说相对于给定数据集,模型过于复杂、拟合能力过强
解决方案:
提前停止训练
减少训练的迭代次数,理论上来说,可以找到一个训练程度,使得验证集误差率最低,视为拟合效果最好的点
正则化
上述解决模型过拟合和欠拟合问题的方式中,涉及到一些超参数
在 sklearn
中,可以使用网格搜索的方式寻找最佳的参数
Python 代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.datasets import load_iris
def model_train(x_train, x_test, y_train, y_test):
# 设置 param 进行网格搜索参数设置
# {参数名 1:[参数值 1,参数值 2],...}
param_dict = {
'penalty': ['l1', 'l2'],
'C': [0.1, 1, 10],
'solver': ['liblinear'] # 选择 liblinear 以支持 L1 正则化
}
# 参数说明:
# logistic 逻辑回归分类器
logistic = LogisticRegression()
# 使用网格搜索进行模型训练找出最佳参数
grid_search = GridSearchCV(logistic, param_dict, cv=5)
grid_search.fit(x_train, y_train)
# 使用最佳参数的模型进行测试集评分
best_model = grid_search.best_estimator_
score = best_model.score(x_test, y_test)
return score
|