Day 82:【99天精通Python】机器学习入门 - Scikit-Learn - 3行代码搞定预测
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²)
- 实战练习:波士顿房价预测
一、机器学习的工作流程
无论多复杂的机器学习项目,都遵循这个流程:
- 问题定义:我们要解决什么问题?(分类、回归、聚类)
- 数据收集:获取训练数据。
- 数据预处理:清洗、标准化。
- 特征工程:选择哪些特征参与训练。
- 模型选择:用什么算法?(线性回归、决策树、SVM…)
- 模型训练:用
fit()函数学习数据。 - 模型评估:看看模型准不准。
- 模型部署:上线使用。
二、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:模型如何保存?
使用 joblib 或 pickle。
import joblib
# 保存
joblib.dump(model, 'my_model.pkl')
# 加载
loaded_model = joblib.load('my_model.pkl')
七、小结
关键要点:
- Scikit-Learn 是机器学习的瑞士军刀,API 高度统一。
fit->predict->score是万能三板斧。train_test_split是保证模型泛化能力的关键一步。
八、课后作业
- 特征选择:在加州房价数据中,只用 “平均房间数 (AveRooms)” 这一个特征来预测房价,看看 R² 分数会掉多少。
- 多项式回归:如果数据不是线性的,线性回归效果会很差。尝试使用
PolynomialFeatures+LinearRegression来拟合二次曲线。 - 换个模型:查阅 sklearn 文档,使用
Ridge或Lasso回归模型,看看效果有没有提升。
下节预告
Day 83:机器学习进阶 - 分类问题与逻辑回归 - 除了预测房价,我们更常遇到的是分类问题(如判断邮件是否是垃圾邮件)。明天我们学习最基础的分类算法——逻辑回归。
系列导航:
- 上一篇:Day 81 - 小程序后端开发下
- 下一篇:Day 83 - 机器学习进阶逻辑回归(待更新)
更多推荐


所有评论(0)