4 监督学习:分类与回归

2025年08月15日

监督学习:分类与回归

💡 学习目标:理解监督学习的核心概念,掌握分类和回归算法的原理与应用。

监督学习概述

监督学习是机器学习中最常见的学习方式,它使用带标签的数据来训练模型。

ℹ️ 监督学习的特点
• 训练数据包含输入特征和对应的正确答案(标签)
• 目标是学习从输入到输出的映射关系
• 可以对新的未见过的数据进行预测

分类 vs 回归

特征 分类(Classification) 回归(Regression)
输出类型 离散值(类别) 连续值(数值)
典型应用 邮件分类、图像识别 房价预测、股票预测
评估指标 准确率、精确率、召回率 均方误差、R²分数
常用算法 逻辑回归、决策树、SVM 线性回归、随机森林

经典分类算法

1. 逻辑回归(Logistic Regression)

尽管名字叫"回归",但逻辑回归实际上是一种分类算法。

逻辑回归使用Sigmoid函数将线性组合映射到0-1之间的概率值。

# 逻辑回归示例
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 生成分类数据
X, y = make_classification(n_samples=1000, n_features=2, 
                         n_redundant=0, n_informative=2,
                         random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)

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

# 预测
predictions = model.predict(X_test)
probabilities = model.predict_proba(X_test)

print(f"准确率: {model.score(X_test, y_test):.3f}")

2. 决策树(Decision Tree)

决策树通过一系列if-else规则进行分类,具有很好的可解释性。

优点:易于理解和解释,不需要特征缩放

⚠️ 缺点:容易过拟合,对数据变化敏感

# 决策树示例
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target

# 训练决策树
tree = DecisionTreeClassifier(max_depth=3, random_state=42)
tree.fit(X, y)

# 特征重要性
feature_importance = tree.feature_importances_
for i, importance in enumerate(feature_importance):
    print(f"{iris.feature_names[i]}: {importance:.3f}")

经典回归算法

1. 线性回归(Linear Regression)

线性回归假设目标变量与特征之间存在线性关系。

🔐线性回归公式

# 线性回归示例
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt

# 生成回归数据
X, y = make_regression(n_samples=100, n_features=1, 
                      noise=10, random_state=42)

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

# 预测
y_pred = model.predict(X)

# 可视化
plt.scatter(X, y, alpha=0.6, label="实际数据")
plt.plot(X, y_pred, color="red", label="拟合直线")
plt.legend()
plt.title("线性回归示例")
plt.show()

print(f"斜率: {model.coef_[0]:.3f}")
print(f"截距: {model.intercept_:.3f}")

2. 多项式回归

当数据呈现非线性关系时,可以使用多项式回归。

# 多项式回归
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline

# 创建多项式回归管道
poly_reg = Pipeline([
    ("poly", PolynomialFeatures(degree=2)),
    ("linear", LinearRegression())
])

# 训练模型
poly_reg.fit(X, y)
y_poly_pred = poly_reg.predict(X)

模型评估

分类评估指标

ℹ️ 混淆矩阵:展示分类结果的详细情况

🔐分类评估指标

回归评估指标

  • 均方误差(MSE):预测值与真实值差的平方的平均值
  • 平均绝对误差(MAE):预测值与真实值差的绝对值的平均值
  • R²分数:决定系数,表示模型解释方差的比例
# 回归评估
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"MSE: {mse:.3f}")
print(f"MAE: {mae:.3f}")
print(f"R²: {r2:.3f}")

实战项目:房价预测

项目目标:使用房屋特征预测房价

# 房价预测项目
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

# 假设我们有房价数据
# features: 面积、房间数、地段评分、建造年份
# target: 房价

# 数据预处理
def preprocess_data(df):
    # 处理缺失值
    df = df.fillna(df.mean())
    
    # 特征工程
    df["房龄"] = 2024 - df["建造年份"]
    df["单价"] = df["房价"] / df["面积"]
    
    return df

# 模型训练
def train_model(X, y):
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42)
    
    model = RandomForestRegressor(n_estimators=100, random_state=42)
    model.fit(X_train, y_train)
    
    return model, X_test, y_test

# 模型评估
def evaluate_model(model, X_test, y_test):
    predictions = model.predict(X_test)
    mse = mean_squared_error(y_test, predictions)
    
    print(f"预测误差(MSE): {mse:.2f}")
    return predictions

⚠️ 注意事项
• 数据质量直接影响模型性能
• 特征工程往往比算法选择更重要
• 避免过拟合,使用交叉验证

本章小结

监督学习是机器学习的核心,通过学习输入输出的映射关系来进行预测。选择合适的算法和评估指标对于项目成功至关重要。


下一章我们将学习无监督学习算法...