Day 82:【99天精通Python】机器学习入门 - Scikit-Learn - 3行代码搞定预测

前言

欢迎来到第82天!

我们已经探索了数据分析、Web 开发、AI 应用。今天,我们将踏入另一个令人兴奋的领域——机器学习 (Machine Learning, ML)

机器学习的核心思想是:让机器从数据中自动学习规律,并用这个规律去预测未知

你可能会觉得机器学习很高深,需要复杂的数学。但有了 Scikit-Learn (sklearn),一切都变得非常简单。它是 Python 最著名的通用机器学习库,封装了从数据预处理、模型训练到评估的所有工具。

本节内容:

  • 机器学习基本流程
  • Scikit-Learn 安装与核心 API
  • 数据集划分 (train_test_split)
  • 线性回归 (Linear Regression)
  • 模型评估 (MSE, R²)
  • 实战练习:波士顿房价预测

一、机器学习的工作流程

无论多复杂的机器学习项目,都遵循这个流程:

  1. 问题定义:我们要解决什么问题?(分类、回归、聚类)
  2. 数据收集:获取训练数据。
  3. 数据预处理:清洗、标准化。
  4. 特征工程:选择哪些特征参与训练。
  5. 模型选择:用什么算法?(线性回归、决策树、SVM…)
  6. 模型训练:用 fit() 函数学习数据。
  7. 模型评估:看看模型准不准。
  8. 模型部署:上线使用。

二、Scikit-Learn 入门

2.1 安装

pip install scikit-learn

2.2 核心 API 设计

Sklearn 的 API 设计得非常统一、优雅:

  • fit(X, y):训练模型(X 是特征,y 是目标)。
  • predict(X):进行预测。
  • score(X, y):评估模型。

三、线性回归:从一条线开始

线性回归是机器学习中最简单、最直观的算法。它的目标是找到一条直线(y = wx + b),来最好地拟合数据点。

3.1 准备数据

我们使用 sklearn 自带的波士顿房价数据集。

import numpy as np
import pandas as pd
from sklearn.datasets import fetch_california_housing # 波士顿房价已下架,换成加州
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 1. 加载数据
housing = fetch_california_housing()
X = housing.data   # 特征 (8个维度)
y = housing.target # 目标 (房价)

# 转换为 Pandas DataFrame 更好看
df = pd.DataFrame(X, columns=housing.feature_names)
df['Price'] = y
print(df.head())

3.2 划分数据集

我们不能把所有数据都用来训练,否则就不知道模型在未知数据上的表现如何了。
通常我们会把数据分成:

  • 训练集 (Training set):用来训练模型。
  • 测试集 (Test set):用来评估模型。
# random_state 保证每次划分结果一样,方便复现
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

3.3 训练与预测

这就是 sklearn 的三行核心代码:

# 1. 创建模型实例
model = LinearRegression()

# 2. 训练模型
model.fit(X_train, y_train)

# 3. 进行预测
y_pred = model.predict(X_test)

四、模型评估

模型训好了,它到底准不准?

4.1 查看模型参数

print(f"权重 (Coefficients): {model.coef_}")
print(f"截距 (Intercept): {model.intercept_}")

4.2 评估指标

  • 均方误差 (MSE):预测值与真实值之差的平方的均值。越小越好。
  • R² 分数 (R-squared):决定系数,表示模型能解释数据变异性的比例。越接近 1 越好。
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差 (MSE): {mse:.2f}")
print(f"R² 分数: {r2:.2f}") # e.g. 0.58
# 0.58 表示我们的模型能解释约 58% 的房价变异。不算很好,但作为入门不错了。

4.3 可视化

把预测值和真实值画出来,看看它们是否接近一条直线。

import matplotlib.pyplot as plt

plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', lw=2) # 画 y=x 对角线
plt.xlabel("真实值 (Actual Price)")
plt.ylabel("预测值 (Predicted Price)")
plt.title("真实值 vs 预测值")
plt.show()

五、实战:自己造数据并拟合

让我们用 y = 3x + 2 + 噪声 自己造一批数据,看看模型能不能学出来。

# 1. 创建数据
X = np.random.rand(100, 1) * 10
y = 3 * X + 2 + np.random.randn(100, 1) * 2 # 噪声大一点

# 2. 训练
model = LinearRegression()
model.fit(X, y)

# 3. 结果
print(f"学到的权重 w: {model.coef_[0][0]:.2f}") # 应该接近 3
print(f"学到的截距 b: {model.intercept_[0]:.2f}") # 应该接近 2

# 4. 可视化
plt.scatter(X, y, alpha=0.5)
plt.plot(X, model.predict(X), color='red') # 画出拟合线
plt.show()

六、常见问题

Q1:为什么要划分测试集?

防止过拟合 (Overfitting)。模型在训练集上表现完美(比如把所有点都背下来了),但在新数据上表现极差。测试集模拟了新数据,能客观评价模型的泛化能力。

Q2:特征需要标准化吗?

对于线性回归,虽然不是必须,但强烈建议。如果"房间数"和"面积"两个特征的数值范围差别巨大,模型会更偏向数值大的特征。使用 StandardScaler 可以消除这个问题。

Q3:模型如何保存?

使用 joblibpickle

import joblib
# 保存
joblib.dump(model, 'my_model.pkl')
# 加载
loaded_model = joblib.load('my_model.pkl')

七、小结

机器学习流程

数据 Data

模型 Model

评估 Metrics

加载数据

train_test_split

创建实例: LinearRegression()

训练: fit(X_train, y_train)

预测: predict(X_test)

mean_squared_error

r2_score

关键要点

  1. Scikit-Learn 是机器学习的瑞士军刀,API 高度统一。
  2. fit -> predict -> score 是万能三板斧。
  3. train_test_split 是保证模型泛化能力的关键一步。

八、课后作业

  1. 特征选择:在加州房价数据中,只用 “平均房间数 (AveRooms)” 这一个特征来预测房价,看看 R² 分数会掉多少。
  2. 多项式回归:如果数据不是线性的,线性回归效果会很差。尝试使用 PolynomialFeatures + LinearRegression 来拟合二次曲线。
  3. 换个模型:查阅 sklearn 文档,使用 RidgeLasso 回归模型,看看效果有没有提升。

下节预告

Day 83:机器学习进阶 - 分类问题与逻辑回归 - 除了预测房价,我们更常遇到的是分类问题(如判断邮件是否是垃圾邮件)。明天我们学习最基础的分类算法——逻辑回归。


系列导航

  • 上一篇:Day 81 - 小程序后端开发下
  • 下一篇:Day 83 - 机器学习进阶逻辑回归(待更新)
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐