查看: 146|回复: 3

Python Scikit-learn从零构建预测模型:线性回归与决策树实战

[复制链接]
发表于 昨天 10:00 | 显示全部楼层 |阅读模式
本文基于 Scikit-learn 库,演示如何用 Python 构建一个完整的监督学习预测模型。内容涵盖数据集构建、训练/测试集划分、线性回归与决策树(回归+分类)的实现、模型评估指标、完整项目流程以及简单的参数调优。所有代码均可在 Python 3.8+ 环境中运行,无需额外安装第三方库(除 scikit-learn、pandas、numpy 外)。

1. 生成回归任务示例数据
先模拟房价预测场景:根据房屋面积和房龄生成房价。代码使用 numpy 随机生成 200 个样本,面积 50-200 平米,房龄 0-30 年。房价公式为:price = 1.5*area - 2*age + 50 + 噪声。
  1. import pandas as pd
  2. import numpy as np
  3. np.random.seed(42)
  4. n_samples = 200
  5. area = np.random.uniform(50, 200, n_samples)
  6. age = np.random.uniform(0, 30, n_samples)
  7. price = (1.5 * area - 2 * age + 50 + np.random.normal(0, 15, n_samples))
  8. df = pd.DataFrame({
  9.     "面积_平米": area,
  10.     "房龄_年": age,
  11.     "房价_万元": price
  12. })
  13. print("=== 示例数据:房价预测 ===")
  14. print(df.head(10))
  15. print(f"\n数据规模: {len(df)} 条")
  16. print(df.describe().round(1))
复制代码

2. 训练/测试集划分
为什么要划分?防止模型“背答案”,必须有未见过的数据来评估泛化能力。使用 train_test_split 按 80%/20% 划分,设置 random_state=42 保证可复现。
  1. from sklearn.model_selection import train_test_split
  2. X = df[["面积_平米", "房龄_年"]]
  3. y = df["房价_万元"]
  4. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  5. print(f"训练集: {len(X_train)} 条")
  6. print(f"测试集: {len(X_test)} 条")
复制代码

3. 线性回归模型
线性回归通过最小化均方误差找到最佳系数。训练后打印出面积和房龄的系数及截距,并给出业务解读。
  1. from sklearn.linear_model import LinearRegression
  2. from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
  3. model = LinearRegression()
  4. model.fit(X_train, y_train)
  5. print(f"系数: 面积={model.coef_[0]:.2f}, 房龄={model.coef_[1]:.2f}")
  6. print(f"截距: {model.intercept_:.2f}")
  7. y_pred = model.predict(X_test)
  8. comparison = pd.DataFrame({
  9.     "真实房价": y_test.values,
  10.     "预测房价": y_pred,
  11.     "误差": y_test.values - y_pred
  12. })
  13. print("测试集预测结果对比(前10条):")
  14. print(comparison.head(10).round(1))
复制代码

模型评估使用 MSE、RMSE、MAE 和 R²。RMSE 约为 13.5 万,R² 约 0.87,说明模型解释了 87% 的房价波动。
  1. mse = mean_squared_error(y_test, y_pred)
  2. rmse = np.sqrt(mse)
  3. mae = mean_absolute_error(y_test, y_pred)
  4. r2 = r2_score(y_test, y_pred)
  5. print(f"RMSE: {rmse:.2f} 万元")
  6. print(f"R²: {r2:.4f}")
复制代码

4. 决策树回归与分类
决策树通过一系列 if/else 规则做预测,设置 max_depth=4 防止过拟合。对比线性回归,决策树的 MAE 通常略低,但可解释性更强。
  1. from sklearn.tree import DecisionTreeRegressor
  2. dt_model = DecisionTreeRegressor(max_depth=4, random_state=42)
  3. dt_model.fit(X_train, y_train)
  4. dt_pred = dt_model.predict(X_test)
  5. print(f"决策树 MAE: {mean_absolute_error(y_test, dt_pred):.2f} 万元")
  6. print(f"决策树 R²: {r2_score(y_test, dt_pred):.4f}")
复制代码

分类任务使用 Iris 数据集演示 DecisionTreeClassifier。加载数据、划分、训练并输出准确率(约 97%)、分类报告和混淆矩阵。
  1. from sklearn.datasets import load_iris
  2. from sklearn.tree import DecisionTreeClassifier
  3. from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
  4. iris = load_iris()
  5. X_iris, y_iris = iris.data, iris.target
  6. X_train_ir, X_test_ir, y_train_ir, y_test_ir = train_test_split(
  7.     X_iris, y_iris, test_size=0.3, random_state=42
  8. )
  9. clf = DecisionTreeClassifier(max_depth=3, random_state=42)
  10. clf.fit(X_train_ir, y_train_ir)
  11. y_pred_ir = clf.predict(X_test_ir)
  12. print(f"准确率: {accuracy_score(y_test_ir, y_pred_ir):.2%}")
  13. print(classification_report(y_test_ir, y_pred_ir, target_names=iris.target_names))
  14. print(confusion_matrix(y_test_ir, y_pred_ir))
复制代码

5. 完整项目:电商用户购买意愿预测
模拟 1000 个用户,6 个特征(浏览时长、浏览次数、加入购物车、收藏数、历史购买次数、距上次访问天数)。标签“购买”由特征线性组合加噪声生成。数据无需单独处理,直接划分并标准化(Scaler)。训练四个模型:逻辑回归、决策树、随机森林、K近邻。
  1. from sklearn.preprocessing import StandardScaler
  2. from sklearn.linear_model import LogisticRegression
  3. from sklearn.ensemble import RandomForestClassifier
  4. from sklearn.neighbors import KNeighborsClassifier
  5. # 构造数据略(见原文)
  6. X = users.drop("购买", axis=1)
  7. y = users["购买"]
  8. X_train_u, X_test_u, y_train_u, y_test_u = train_test_split(
  9.     X, y, test_size=0.2, random_state=42, stratify=y
  10. )
  11. scaler = StandardScaler()
  12. X_train_scaled = scaler.fit_transform(X_train_u)
  13. X_test_scaled = scaler.transform(X_test_u)
  14. models = {
  15.     "逻辑回归": LogisticRegression(max_iter=1000),
  16.     "决策树": DecisionTreeClassifier(max_depth=5),
  17.     "随机森林": RandomForestClassifier(n_estimators=50),
  18.     "K近邻": KNeighborsClassifier(n_neighbors=5)
  19. }
  20. for name, model in models.items():
  21.     model.fit(X_train_scaled, y_train_u)
  22.     acc = model.score(X_test_scaled, y_test_u)
  23.     print(f"{name}: 准确率 = {acc:.2%}")
复制代码

最佳模型(通常是随机森林或逻辑回归)会输出分类报告和混淆矩阵。同时分析特征重要性(随机森林自带)。最后演示对新用户预测:
  1. new_users = pd.DataFrame({
  2.     "浏览时长_分钟": [15, 5, 30],
  3.     "浏览次数": [10, 3, 20],
  4.     "加入购物车": [3, 0, 5],
  5.     "收藏数": [2, 0, 3],
  6.     "历史购买次数": [5, 1, 10],
  7.     "距上次访问_天": [2, 15, 1]
  8. })
  9. new_scaled = scaler.transform(new_users)
  10. new_pred = best_model.predict(new_scaled)
  11. new_prob = best_model.predict_proba(new_scaled)[:, 1]
  12. for i, (pred, prob) in enumerate(zip(new_pred, new_prob)):
  13.     label = "会购买" if pred == 1 else "不会购买"
  14.     print(f"用户{i+1}: 预测结果={label}, 购买概率={prob:.1%}")
复制代码

6. 模型调优:交叉验证与网格搜索
用 cross_val_score 对每个模型做 5 折交叉验证,获得更稳定的性能估计。使用 GridSearchCV 对决策树搜索最佳 max_depth 和 min_samples_split。
  1. from sklearn.model_selection import cross_val_score, GridSearchCV
  2. for name, model in models.items():
  3.     scores = cross_val_score(model, X_train_scaled, y_train_u, cv=5, scoring="accuracy")
  4.     print(f"{name}: {scores.mean():.2%} (+/- {scores.std():.2%})")
  5. param_grid = {
  6.     "max_depth": [3, 5, 7, 10],
  7.     "min_samples_split": [2, 5, 10]
  8. }
  9. grid = GridSearchCV(DecisionTreeClassifier(random_state=42), param_grid, cv=5)
  10. grid.fit(X_train_scaled, y_train_u)
  11. print(f"最佳参数: {grid.best_params_}")
  12. print(f"最佳准确率: {grid.best_score_:.2%}")
复制代码

总结
本教程完整展示了用 Scikit-learn 搭建预测模型的关键步骤:数据准备 → 划分 → 训练 → 评估 → 调优。无论是回归还是分类任务,都可以套用这一框架。初学者可以在此基础上替换真实数据集,并进一步学习特征工程和更复杂的模型。
回复

使用道具 举报

发表于 昨天 11:40 | 显示全部楼层

Re: Python Scikit-learn从零构建预测模型:线性回归与决策树实战

感谢分享这么详细的实战教程!从数据生成到模型评估一步步写得很清楚,对刚入门 scikit-learn 的同学特别友好。 有两个小问题想请教: 1. 线性回归的系数和截距打印出来后,和模拟数据的真实公式(1.5*面积 - 2*房龄 + 50)对比,是否接近?从文中看面积系数1.5左右,房龄系数-2左右,说明模型拟合得还不错。 2. 决策树回归的 max_depth 设为4,如果有更多特征,调参时一般用什么方法确定最优深度?比如用交叉验证配合 GridSearchCV 吗? 期待后续也能看到更多关于特征工程或集成模型的内容,谢谢!
回复 支持 反对

使用道具 举报

发表于 昨天 14:15 | 显示全部楼层

Re: Python Scikit-learn从零构建预测模型:线性回归与决策树实战

感谢楼主的分享!内容非常清晰,从数据生成、划分到模型训练和评估,流程很完整,对新手很友好。尤其喜欢您强调了训练/测试集划分的原因和参数调优的重要性。 想请教一个问题:首帖中提到了“简单的参数调优”,但代码里好像没有具体展示?另外,分类部分最后的类名似乎被截断了(DecisionTreeClassifie),能否补充一下完整的分类代码和调优思路?
回复 支持 反对

使用道具 举报

发表于 昨天 16:25 | 显示全部楼层

Re: Python Scikit-learn从零构建预测模型:线性回归与决策树实战

感谢分享!教程写得很清楚,从数据生成到模型评估的完整流程很适合新手入门。特别喜欢你对线性回归系数的业务解读,这样能帮助理解模型背后的实际含义。有个问题想请教:在决策树回归中,你提到了 max_depth=4 来防过拟合,实际项目里你一般会用什么方法来确定最佳深度?比如网格搜索或者交叉验证?期待更多这类实战内容!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-18 03:15 , Processed in 0.042355 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部