首页/新闻资讯/正文详情

6个经典机器学习实战项目解析:从回归到自监督学习

发布时间:2026/11/4 9:11:00 来源:云帆数科 栏目:资讯中心
6个经典机器学习实战项目解析:从回归到自监督学习
1. 机器学习经典实战项目解析作为一名从业多年的机器学习工程师我深知实战项目对于掌握核心技能的重要性。今天我将分享6个经典机器学习项目涵盖回归、分类、文本分析、聚类、半监督和自监督学习等多个方向。这些项目不仅适合初学者构建知识体系也能帮助有经验的开发者拓展技术视野。2. 回归任务加州房价预测2.1 项目概述与数据准备房价预测是机器学习入门的经典回归问题。我们使用Scikit-learn内置的California Housing数据集包含20,640个样本和8个特征MedInc街区收入中位数HouseAge房屋年龄中位数AveRooms平均房间数AveBedrms平均卧室数Population街区人口AveOccup平均入住率Latitude纬度Longitude经度from sklearn.datasets import fetch_california_housing import pandas as pd data fetch_california_housing() X, y data.data, data.target df pd.DataFrame(X, columnsdata.feature_names) df[MedHouseVal] y print(df.head())2.2 完整建模流程2.2.1 数据预处理与划分from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) # 特征标准化线性模型需要 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)2.2.2 模型训练与评估我们比较线性回归和随机森林两种算法from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, r2_score import numpy as np models { Linear Regression: LinearRegression(), Random Forest: RandomForestRegressor(n_estimators100, random_state42) } results {} for name, model in models.items(): # 线性模型用缩放数据树模型用原始数据 X_tr X_train_scaled if name Linear Regression else X_train X_te X_test_scaled if name Linear Regression else X_test model.fit(X_tr, y_train) y_pred model.predict(X_te) rmse np.sqrt(mean_squared_error(y_test, y_pred)) r2 r2_score(y_test, y_pred) results[name] {RMSE: rmse, R²: r2} print(f{name} → RMSE: {rmse:.2f}, R²: {r2:.2%})2.2.3 模型优化对随机森林进行超参数调优from sklearn.model_selection import RandomizedSearchCV from scipy.stats import randint param_dist { n_estimators: randint(50, 200), max_depth: [3, 5, 7, 10, None], min_samples_split: randint(2, 20) } rf RandomForestRegressor(random_state42) random_search RandomizedSearchCV( rf, param_dist, n_iter20, cv5, scoringneg_root_mean_squared_error, n_jobs-1 ) random_search.fit(X_train, y_train) print(\n优化后参数:, random_search.best_params_) best_rf random_search.best_estimator_ y_pred_best best_rf.predict(X_test) print(f优化后 RMSE: {np.sqrt(mean_squared_error(y_test, y_pred_best)):.2f})关键经验树模型不需要特征缩放但线性模型对特征尺度敏感随机搜索比网格搜索更高效特别是参数空间较大时房价预测中地理位置特征经纬度往往最重要3. 分类任务客户流失预测3.1 业务理解与数据模拟客户流失预测是典型的二分类问题。我们使用电信行业数据集模拟数据import numpy as np import pandas as pd np.random.seed(42) n 7000 df pd.DataFrame({ tenure: np.random.randint(1, 73, n), # 在网月数 MonthlyCharges: np.random.uniform(20, 120, n), TotalCharges: lambda x: x[tenure] * x[MonthlyCharges], gender: np.random.choice([Male, Female], n), Partner: np.random.choice([Yes, No], n), Dependents: np.random.choice([Yes, No], n), Churn: np.random.binomial(1, 0.25, n) # 目标变量 })3.2 分类建模流程3.2.1 数据预处理from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 分离数值和类别特征 num_features [tenure, MonthlyCharges, TotalCharges] cat_features [gender, Partner, Dependents] # 构建预处理管道 preprocessor ColumnTransformer( transformers[ (num, StandardScaler(), num_features), (cat, OneHotEncoder(dropfirst), cat_features) ] )3.2.2 模型训练与评估from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report # 划分数据集 X df.drop(Churn, axis1) y df[Churn] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, stratifyy, random_state42 ) # 定义模型管道 models { Logistic Regression: Pipeline([ (preprocessor, preprocessor), (classifier, LogisticRegression(max_iter1000)) ]), Random Forest: Pipeline([ (preprocessor, preprocessor), (classifier, RandomForestClassifier(n_estimators100, random_state42)) ]) } # 训练与评估 for name, pipeline in models.items(): pipeline.fit(X_train, y_train) y_pred pipeline.predict(X_test) print(f\n{name} 分类报告:) print(classification_report(y_test, y_pred))关键经验分类任务关注精确率、召回率和F1值而不仅仅是准确率使用stratifyy保证训练/测试集标签分布一致类别特征使用One-Hot编码时dropfirst可避免多重共线性4. 文本情感分析4.1 文本数据准备我们使用20 Newsgroups数据集模拟情感分析任务from sklearn.datasets import fetch_20newsgroups categories [alt.atheism, soc.religion.christian] newsgroups_train fetch_20newsgroups(subsettrain, categoriescategories) newsgroups_test fetch_20newsgroups(subsettest, categoriescategories) X_train_text, y_train newsgroups_train.data, newsgroups_train.target X_test_text, y_test newsgroups_test.data, newsgroups_test.target4.2 文本特征工程与建模4.2.1 TF-IDF向量化from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.svm import SVC from sklearn.metrics import accuracy_score # 文本向量化 vectorizer TfidfVectorizer( max_features5000, # 限制词汇表大小 stop_wordsenglish, # 去除停用词 ngram_range(1, 2) # 使用1-gram和2-gram ) X_train_tfidf vectorizer.fit_transform(X_train_text) X_test_tfidf vectorizer.transform(X_test_text)4.2.2 模型比较models { Naive Bayes: MultinomialNB(alpha0.1), SVM: SVC(kernellinear, C1.0) } for name, model in models.items(): model.fit(X_train_tfidf, y_train) y_pred model.predict(X_test_tfidf) acc accuracy_score(y_test, y_pred) print(f{name} 准确率: {acc:.2%})4.2.3 关键词分析# 查看朴素贝叶斯模型学习到的重要特征 nb MultinomialNB() nb.fit(X_train_tfidf, y_train) feature_names vectorizer.get_feature_names_out() # 获取各类别的高权重词 for i, class_name in enumerate(newsgroups_train.target_names): top_features np.argsort(nb.coef_[i])[-10:] print(f\n{class_name} 关键词:, [feature_names[j] for j in top_features])关键经验ngram_range(1,2)可以捕捉短语信息如not good朴素贝叶斯适合高维稀疏文本数据线性SVM在文本分类中通常表现优异停用词去除和最大特征数限制对性能影响很大5. 无监督学习用户分群5.1 数据模拟与预处理我们模拟电商用户行为数据import numpy as np import pandas as pd np.random.seed(42) n_users 2000 df_users pd.DataFrame({ age: np.random.randint(18, 70, n_users), income: np.random.exponential(50000, n_users), purchase_freq: np.random.poisson(5, n_users), avg_order_value: np.random.gamma(2, 50, n_users) })5.2 聚类分析流程5.2.1 数据标准化from sklearn.preprocessing import StandardScaler X df_users.values scaler StandardScaler() X_scaled scaler.fit_transform(X)5.2.2 确定最佳聚类数from sklearn.cluster import KMeans import matplotlib.pyplot as plt inertias [] K_range range(2, 10) for k in K_range: kmeans KMeans(n_clustersk, random_state42) kmeans.fit(X_scaled) inertias.append(kmeans.inertia_) plt.plot(K_range, inertias, bo-) plt.xlabel(K) plt.ylabel(Inertia) plt.title(Elbow Method) plt.show()5.2.3 执行聚类与分析# 选择K4执行聚类 kmeans KMeans(n_clusters4, random_state42) clusters kmeans.fit_predict(X_scaled) df_users[cluster] clusters # 分析聚类结果 print(df_users.groupby(cluster).mean()) # 可视化PCA降维 from sklearn.decomposition import PCA pca PCA(n_components2) X_pca pca.fit_transform(X_scaled) plt.scatter(X_pca[:, 0], X_pca[:, 1], cclusters, cmapviridis) plt.title(用户分群 (PCA可视化)) plt.show()关键经验聚类前必须标准化消除不同特征量纲影响肘部法则和轮廓系数是确定K值的常用方法高维数据可视化前通常需要降维PCA/t-SNE业务解释是聚类分析中最关键的环节6. 半监督学习文本分类6.1 半监督数据准备我们使用部分标注的20 Newsgroups数据from sklearn.datasets import fetch_20newsgroups import numpy as np # 加载全部数据 all_data fetch_20newsgroups(subsetall, categories[comp.graphics, sci.med]) X_text_all, y_all all_data.data, all_data.target # 模拟仅5%有标签 np.random.seed(42) n_total len(y_all) n_labeled int(0.05 * n_total) labeled_idx np.random.choice(n_total, sizen_labeled, replaceFalse) y_semi np.full(n_total, -1) # -1表示无标签 y_semi[labeled_idx] y_all[labeled_idx]6.2 伪标签法实现6.2.1 初始模型训练from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression # 文本向量化 vectorizer TfidfVectorizer(max_features3000, stop_wordsenglish) X_tfidf vectorizer.fit_transform(X_text_all) # 仅用有标签数据训练初始模型 X_labeled X_tfidf[labeled_idx] y_labeled y_all[labeled_idx] lr LogisticRegression(max_iter1000) lr.fit(X_labeled, y_labeled)6.2.2 生成伪标签# 预测所有样本的概率 proba lr.predict_proba(X_tfidf) pseudo_labels lr.predict(X_tfidf) # 选择高置信度预测作为伪标签 high_conf proba.max(axis1) 0.9 # 置信度阈值 # 构建增强训练集 train_idx np.concatenate([labeled_idx, np.where(high_conf)[0]]) y_train np.concatenate([y_labeled, pseudo_labels[high_conf]])6.2.3 联合训练与评估# 在增强数据集上训练最终模型 lr_final LogisticRegression(max_iter1000) lr_final.fit(X_tfidf[train_idx], y_train) # 评估假设我们有完整测试集 test_acc lr_final.score(X_tfidf, y_all) print(f半监督准确率: {test_acc:.2%}) # 对比纯监督学习 lr_baseline LogisticRegression(max_iter1000) lr_baseline.fit(X_labeled, y_labeled) baseline_acc lr_baseline.score(X_tfidf, y_all) print(f纯监督 (5%标签) 准确率: {baseline_acc:.2%})关键经验置信度阈值控制伪标签质量通常设置在0.8-0.95可以迭代进行多轮伪标签生成和模型训练半监督学习在标注数据稀缺时特别有效文本和图像等高维数据最适合半监督方法7. 自监督学习图像特征提取7.1 数据准备我们使用MNIST数据集模拟自监督学习场景from sklearn.datasets import fetch_openml mnist fetch_openml(mnist_784, version1, as_frameFalse) X, y mnist.data / 255.0, mnist.target.astype(int) # 模拟60000张无标注仅1000张有标注 X_unlabeled X[:60000] X_labeled X[60000:61000] y_labeled y[60000:61000] X_test, y_test X[61000:], y[61000:]7.2 自编码器预训练7.2.1 自监督预训练from sklearn.neural_network import MLPRegressor # 自编码器结构784 → 128 → 64 → 128 → 784 autoencoder MLPRegressor( hidden_layer_sizes(128, 64, 128), activationrelu, solveradam, max_iter30, random_state42 ) # 自监督训练输入输出 autoencoder.fit(X_unlabeled, X_unlabeled)7.2.2 特征提取与分类from sklearn.decomposition import PCA from sklearn.linear_model import LogisticRegression # 使用PCA模拟自编码器中间层特征 pca PCA(n_components64) pca.fit(X_unlabeled) # 提取特征 X_labeled_features pca.transform(X_labeled) X_test_features pca.transform(X_test) # 在少量标注数据上训练分类器 clf LogisticRegression(max_iter1000) clf.fit(X_labeled_features, y_labeled) # 评估 test_acc clf.score(X_test_features, y_test) print(f自监督特征 线性分类器准确率: {test_acc:.2%}) # 对比无预训练 clf_raw LogisticRegression(max_iter1000) clf_raw.fit(X_labeled, y_labeled) raw_acc clf_raw.score(X_test, y_test) print(f无预训练准确率: {raw_acc:.2%})关键经验自监督学习可以利用大量无标注数据学习通用特征预训练后少量标注数据即可达到较好分类效果实际项目中推荐使用PyTorch实现更复杂的自监督算法自监督特征通常比手工设计特征更具泛化能力8. 项目选择与实践建议8.1 项目选择指南项目类型适用场景推荐算法关键技能房价预测回归问题线性回归、随机森林特征工程、RMSE评估客户流失二分类逻辑回归、XGBoost类别编码、不平衡处理情感分析文本分类朴素贝叶斯、SVMTF-IDF、N-gram用户分群客户洞察K-Means、DBSCAN标准化、肘部法则半监督分类标注稀缺伪标签 LR/RF置信度过滤、迭代训练自监督图像冷启动问题自编码器/对比学习 线性分类预训练、特征提取8.2 实践建议模型部署使用joblib或pickle保存训练好的模型通过Flask或FastAPI提供预测API考虑使用ONNX格式实现跨平台部署生产监控跟踪数据漂移Data Drift监控预测分布变化设置模型性能报警阈值MLOps实践使用MLflow跟踪实验实现持续集成/持续部署(CI/CD)建立模型版本控制和回滚机制性能优化对树模型使用GPU加速对线性模型使用稀疏矩阵考虑模型量化减小内存占用在实际项目中我经常发现数据质量比算法选择更重要。花时间做好数据探索和清洗通常能带来比调参更大的性能提升。另外模型的可解释性在业务场景中往往比绝对精度更重要 - 一个能被业务方理解的简单模型通常比黑箱的复杂模型更有实用价值。

相关推荐

基于Hadoop与Spark的大语言模型多维度性能评估系统实践
基于Hadoop与Spark的大语言模型多维度性能评估系统实践

1. 为什么要把大模型评测从单机搬到Hadoop与Spark上 做LLM选型和部署的人应该都有这种体会:模型压测这事,看着简单,真要做得可靠、可对比、可追溯,工作量完全不亚于部署一个在线服务本身。我最初遇到的场景是团队里同时评估Qwen、… · 2026/11/4 9:11:00

SeaweedFS 7.1 Filer元数据架构与优化解析
SeaweedFS 7.1 Filer元数据架构与优化解析

1. SeaweedFS 7.1 Filer元数据架构解析SeaweedFS作为一款高性能分布式文件系统,其7.1版本的Filer组件在元数据管理方面进行了显著优化。Filer本质上是一个专门处理文件元数据的服务,它将文件目录结构、属性信息等元数据与实际文件内容分离存储&#xff0… · 2026/11/4 9:11:00

智能眼镜AIUI应用开发实战:从0到1打造语音交互应用
智能眼镜AIUI应用开发实战:从0到1打造语音交互应用

1. 为什么我把第一个眼镜应用选在"吃"上 先交代一下背景。我拿到 Rokid Glasses 的开发者预览机之后,翻了半天文档,脑子里蹦出来的第一个练手项目不是那种"看起来很有科技感"的复杂玩意儿,而是一个极其朴素的需求&#x… · 2026/11/4 9:11:00

OpenAI和Google定制声音方案对比与选型指南
OpenAI和Google定制声音方案对比与选型指南

最近我在做一款AI语音产品,需要给不同角色定制专属音色,对比了一圈方案,发现OpenAI和Google在“定制声音”这件事上的产品思路完全是两个极端:OpenAI的Custom Voice需要提交申请、联系销售、走商务流程,而Google这边直… · 2026/11/4 17:55:14

3.3万Star开源声音克隆项目:本地部署与微调实战全解析
3.3万Star开源声音克隆项目:本地部署与微调实战全解析

凌晨刷 GitHub 的时候,我看到 Star 数停在 3.3 万这个数字上,第一反应是:又一个声音克隆项目起来了。说真的,这两年 AI 圈每隔几个月就会冒出一个叫好又叫座的语音项目,但大多数火几天热度就下去了。能冲到 3.3 万 Sta… · 2026/11/4 17:55:13

Git与CICD实战:从代码管理到自动化部署
Git与CICD实战:从代码管理到自动化部署

1. 项目部署流程解析 在软件开发领域,从代码编写到最终上线运行需要经历一系列标准化的流程。以陌陌APP为例,我们来看一个典型的项目部署生命周期: 1.1 源代码获取与管理 现代软件开发中,代码仓库是团队协作的核心枢纽。常见的代… · 2026/11/4 17:55:13

MySQL命令行高效操作与清屏技巧
MySQL命令行高效操作与清屏技巧

1. MySQL命令行界面基础操作 作为一名长期与MySQL打交道的开发者,我深知在命令行环境下高效操作的重要性。DOS窗口或终端中的MySQL命令行界面(CLI)是我们与数据库交互的主要渠道,掌握其中的实用技巧能显著提升工作效率。 1.1 My… · 2026/11/4 17:55:13

虚拟偶像数字衣橱:皮革连衣裙LoRA资产库构建与出图工作流
虚拟偶像数字衣橱:皮革连衣裙LoRA资产库构建与出图工作流

1. 为什么主播需要一套"数字衣橱",而不是一张张立绘做虚拟形象这行久了,会发现一个很现实的问题:主播换衣服的频率远比外人想象的高。节日要换、联动要换、生日回要换、粉丝打赏达标要换,甚至一场四小时的直播中途就得换… · 2026/11/4 17:55:13

Modbus功能码与报文解析:PDU/ADU、异常响应与位字打包
Modbus功能码与报文解析:PDU/ADU、异常响应与位字打包

简介:《Modbus通讯功能码及实例.pdf》面向工业自动化、嵌入式开发、PLC编程及现场调试人员,围绕Modbus通用工业通信协议整理常用功能码、报文结构与典型实例,帮助读者理解主从设备之间线圈、输入状态、保持寄存器、输入寄存器的读写过程以及异… · 2026/11/4 17:54:13

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码