一、损失函数
损失函数使用来判定模型预测好坏的一种依据,模型的目标就是将损失函数值降到最低,损失函数最低是模型的目标,而非开发者的唯一目标,评定一个模型的好坏,线性模型通过R方等决定系数来判断好坏,分类模型通过AUC的值,也就是ROC曲线的面积或者f1分数,准确率,精准率,召回率等,来参考模型好坏
#训练集的损失值计算 train_loss = mean_squared_error(train_y,model.predict(train_x))二、欠拟合与过拟合
(1)欠拟合
1、欠拟合特点:测试集损失值很大,训练集损失值也很大,预测出的曲线与真实值的趋势明显不相符
2、可能出现欠拟合的原因与(解决方法)
模型复杂度不足 (增加模型复杂度)
模型正则项过大 (减小模型的正则项系数)
模型迭代次数较少没有学习到数据规律(增加迭代次数)
模型特征不足(使用麦克劳林展开增加特征项)
#欠拟合 #训练模型 model.fit(train_x,train_y) #模型评估 train_loss = mean_squared_error(train_y,model.predict(train_x)) test_loss = mean_squared_error(test_y,model.predict(test_x)) print(f"train_loss = {train_loss}, test_loss = {test_loss}") ax[0].plot(x,model.predict(x),color="red")(2)恰好拟合
1、恰好拟合特点:模型训练集损失很小,测试集损失也很小,测试集损失略高于训练集,预测出的曲线基本符合真实值的趋势
#恰好拟合 #特征工程 poly = PolynomialFeatures(degree=5) train_2x = poly.fit_transform(train_x) test_2x = poly.transform(test_x) model.fit(train_2x,train_y) train_loss = mean_squared_error(train_y,model.predict(train_2x)) test_loss = mean_squared_error(test_y,model.predict(test_2x)) print(f"train_loss = {train_loss}, test_loss = {test_loss}") ax[1].plot(x,model.predict(poly.transform(x)),color="red")(3)过拟合
1、过拟合特点:测试集损失值很大,训练集损失值也很小,预测出的曲线与真实值的趋势相符。但是明显过于贴合趋势
2、可能出现过拟合的原因与(解决方法)
模型过于复杂度 (减少模型复杂度)
样本量过小导致模型能记住细节但是无法泛化新数据 (增加样本数)
模型训练时间过强,将噪声也学习过去了(早停,在损失值不下降之后停止训练)
模型特征过多(调大正则项的强度,避免过度拟合)
#特征工程 #过拟合 poly = PolynomialFeatures(degree=20) train_20x = poly.fit_transform(train_x) test_20x = poly.transform(test_x) model.fit(train_20x,train_y) train_loss = mean_squared_error(train_y,model.predict(train_20x)) test_loss = mean_squared_error(test_y,model.predict(test_20x)) print(f"train_loss = {train_loss}, test_loss = {test_loss}") ax[2].plot(x,model.predict(poly.transform(x)),color="red")三、正则化
L1正则:也称之为lasso回归,使用参数的绝对值之和成正则系数,一般不常用,因为曲线不光滑,所以不可导,部分权重趋近0甚至变为0。这会导致特征选择,即模型会自动“丢弃”一些不重要的特征
#设置正则系数为0.099 model = Lasso(alpha=0.099) model.fit(train_x,train_y) print(model.coef_,model.intercept_) loss = mean_squared_error(test_y,model.predict(test_x)) print(f"决定系数:",model.score(test_x, test_y)) ax[0,1].plot(x,model.predict(poly.transform(x)),color="red") ax[1,1].bar(np.arange(len(model.coef_.reshape(-1))),model.coef_.reshape(-1)) print(f"test_loss2 = {loss}")L2正则:也称之为岭回归,参数的平方的和乘正则系数,因为曲线光滑,可导,用的比较多
#设置正则项强度为0.8 model = Ridge(alpha=0.8) model.fit(train_x,train_y) print(model.coef_,model.intercept_) loss = mean_squared_error(test_y,model.predict(test_x)) print(f"决定系数:",model.score(test_x, test_y)) ax[0,2].plot(x,model.predict(poly.transform(x)),color="red") ax[1,2].bar(np.arange(len(model.coef_.reshape(-1))),model.coef_.reshape(-1)) print(f"test_loss3 = {loss}")四、模型评估指标
1、对于线性模型:R方决定系数,均方误差,平均绝对误差,均方根误差等
2、对于分类模型:准确率,精准率,召回率,AUC值,f1分数等
y_true = ["猫", "猫", "猫", "猫", "猫", "猫", "狗", "狗", "狗", "狗"] # 真实值 y_pred = ["猫", "猫", "狗", "猫", "猫", "猫", "猫", "猫", "狗", "狗"] labels = ["猫", "狗"] matrix = metrics.confusion_matrix(y_true, y_pred, labels=labels) print(matrix) data = pd.DataFrame(matrix, index=labels, columns=labels) print(data) #准确率 print(metrics.accuracy_score(y_true, y_pred)) #精确率(预测的正例里有多少对的) print(metrics.precision_score(y_true, y_pred, pos_label="猫")) #召回率(查全率)实例的正例中查出来了多少 print(metrics.recall_score(y_true, y_pred,pos_label="猫")) #f1分数 print(metrics.f1_score(y_true, y_pred, pos_label="猫")) #评估报告 print(metrics.classification_report(y_true, y_pred))五、交叉验证
1、简单交叉验证
分为测试集于验证集
#对数据进行训练集和测试集的划分 train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.2)2、k折验证
将数据集评分为k份,k-1用于训练,一份用来测试,循环往复直到每一份都当过测试集
3、留一验证
将数据集只留一个样本进行测试,其他都用于训练,每个样本都当一次测试集,直到全部当完