news 2026/4/28 17:05:00

经典机器学习(二)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
经典机器学习(二)

一、损失函数

损失函数使用来判定模型预测好坏的一种依据,模型的目标就是将损失函数值降到最低,损失函数最低是模型的目标,而非开发者的唯一目标,评定一个模型的好坏,线性模型通过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、留一验证

将数据集只留一个样本进行测试,其他都用于训练,每个样本都当一次测试集,直到全部当完

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 17:03:27

PDFMathTranslate:如何实现科学文档的精准格式保留翻译?

PDFMathTranslate:如何实现科学文档的精准格式保留翻译? 【免费下载链接】PDFMathTranslate PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Ollama/OpenAI 等服…

作者头像 李华
网站建设 2026/4/28 17:03:26

怎样快速掌握Blazor WebAssembly:面向.NET开发者的完整实战指南

怎样快速掌握Blazor WebAssembly:面向.NET开发者的完整实战指南 【免费下载链接】blazor Blazor moved to https://github.com/dotnet/aspnetcore 项目地址: https://gitcode.com/gh_mirrors/bl/blazor Blazor WebAssembly是现代Web开发领域的革命性框架&…

作者头像 李华
网站建设 2026/4/28 17:01:57

打卡信奥刷题(3172)用C++实现信奥题 P7936 [COCI 2007/2008 #5] BARICA

P7936 [COCI 2007/2008 #5] BARICA 题目描述 Barica 是一只非同寻常的青蛙。她住在一个池塘里,有 NNN 片漂浮在水面上的荷叶。这些荷叶的编号为 111 到 NNN,位置可以用一对坐标表示。Barica 可以在这些荷叶上跳来跳去,但是她害怕斜着跳和朝负…

作者头像 李华
网站建设 2026/4/28 17:00:52

CIMPro孪大师的私有化部署方案详解

对于对数据主权、网络安全和系统稳定性有极致要求的客户而言,将数字孪生系统部署在公有云上往往是不可接受的选项。私有化部署成为这些领域的刚性需求。这不仅关乎数据安全,更关乎对系统性能、网络延迟和定制化程度的完全掌控。本文将系统解析数字孪生平…

作者头像 李华