监督学习:分类与回归
💡 学习目标:理解监督学习的核心概念,掌握分类和回归算法的原理与应用。
监督学习概述
监督学习是机器学习中最常见的学习方式,它使用带标签的数据来训练模型。
ℹ️ 监督学习的特点:
• 训练数据包含输入特征和对应的正确答案(标签)
• 目标是学习从输入到输出的映射关系
• 可以对新的未见过的数据进行预测
分类 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
⚠️ 注意事项:
• 数据质量直接影响模型性能
• 特征工程往往比算法选择更重要
• 避免过拟合,使用交叉验证
本章小结
监督学习是机器学习的核心,通过学习输入输出的映射关系来进行预测。选择合适的算法和评估指标对于项目成功至关重要。
下一章我们将学习无监督学习算法...