第2章 机器学习的核心概念(上)

说起来,昨天有个朋友问我:"机器学习这么复杂,有没有几个核心概念,理解了它们,后面学起来会轻松很多?"

我想了想说:"有啊,其实机器学习没那么玄乎,核心概念就那么几个。理解了它们,就像是拿到了一张地图,后面学算法和模型时,你知道自己在哪,要去哪。"

今天我就聊聊这几个核心概念。

但我不打算一上来就堆定义和公式,那样太枯燥了。我想用一个更直观的方式:先理解这些概念解决什么问题,再看它们具体是什么


监督学习 vs 无监督学习

这是机器学习最基础的分类。

想象一下,如果你要教小孩子认动物,你会怎么做?

监督学习就像是拿着卡片教孩子:"这是猫,这是狗,这是鸟。"孩子看了很多卡片后,就能认出新的动物。

无监督学习就像是把孩子放到一堆玩具前,不告诉他是什么,让他自己发现:"这些长得像的是一类的,那些是另一类的。"

图片:监督学习 vs 无监督学习示意图

用更技术一点的话来说:

  • 监督学习:训练数据有标签(标签就是正确答案),模型通过学习"输入-输出"的对应关系来做预测。

  • 无监督学习:训练数据没有标签,模型自己从数据中发现结构、模式或规律。

让我用代码来对比一下。

监督学习的例子(预测房价):

python 复制代码
from sklearn.linear_model import LinearRegression
import numpy as np

# 训练数据:面积(平方米)和价格(万元)
X = np.array([[50], [70], [100], [120], [150]])
y = np.array([200, 300, 450, 550, 700])

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

# 预测新数据
print(model.predict([[80]]))  # 预测输出:约350万元

这里,面积是输入,价格是输出(标签)。模型学习的是"面积和价格的关系"。

无监督学习的例子(客户分群):

python 复制代码
from sklearn.cluster import KMeans
import numpy as np

# 训练数据:客户的年龄和年收入(没有标签)
X = np.array([
    [25, 8],   # [年龄, 年收入(万元)]
    [26, 9],
    [30, 15],
    [28, 14],
    [45, 35],
    [50, 40],
    [48, 38]
])

# 训练模型,分成2类
model = KMeans(n_clusters=2)
model.fit(X)

# 预测新客户属于哪一类
print(model.predict([[27, 10]]))  # 预测输出:属于哪一类

这里,数据没有标签。模型自己发现"年轻人和收入较低的人是一类,中年人和收入较高的人是另一类"。

那么什么时候用监督学习,什么时候用无监督学习?

  • 有明确的目标和标注数据时,用监督学习(如:预测房价、垃圾邮件检测)
  • 没有明确目标,想发现数据中的隐藏结构时,用无监督学习(如:客户分群、异常检测)

回归 vs 分类

这是监督学习的两个主要类型。

回归:预测连续值(数值)

分类:预测离散类别

举个例子。

回归问题:预测明天天气多少度、预测用户会消费多少钱、预测股票价格。

分类问题:预测明天是否下雨(是/否)、预测用户是否流失(是/否)、预测图片是猫还是狗。

代码对比一下:

回归:

python 复制代码
from sklearn.linear_model import LinearRegression
import numpy as np

# 训练数据:工龄(年)和薪水(千元)
X = np.array([[1], [2], [3], [5], [8]])
y = np.array([8, 12, 15, 22, 35])

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

# 预测:工作6年后薪水多少?
print(model.predict([[6]]))  # 输出:约26千元

分类:

python 复制代码
from sklearn.linear_model import LogisticRegression
import numpy as np

# 训练数据:工龄(年)和是否高薪(1=是,0=否)
X = np.array([[1], [2], [3], [5], [8]])
y = np.array([0, 0, 0, 1, 1])

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

# 预测:工作6年后是否高薪?
print(model.predict([[6]]))  # 输出:[1],表示是高薪
print(model.predict_proba([[6]]))  # 输出:概率,如[[0.3, 0.7]]

注意看,回归输出的是数值(如26千元),分类输出的是类别(如1表示高薪)。

这个区别在实际应用中很重要。

比如做推荐系统,如果用回归,可以预测用户会给商品打几分;如果用分类,可以预测用户会不会买。

选择回归还是分类,取决于你的业务目标是什么。


过拟合 vs 欠拟合

这是一个非常重要的概念,几乎每个机器学习项目都会遇到。

过拟合:模型在训练数据上表现很好,但在新数据上表现很差。就像学生死记硬背了考试题,但考试稍微换种出题方式就不会了。

欠拟合:模型在训练数据和新数据上表现都很差。就像学生连基础概念都没掌握,怎么考都不行。

让我用一个更直观的例子。

假设我们要根据房屋面积预测价格。

  • 欠拟合:用一条直线去拟合数据,但实际关系可能是曲线,所以效果不好。
  • 过拟合:用一条极其复杂的曲线去拟合数据,把每个点都"记住"了,但新数据一来就"懵"了。
  • 合适:用一条相对简单的曲线,既能捕捉趋势,又不会"记住"每个点。

图片:过拟合、欠拟合、合适拟合的对比图

代码看一下:

python 复制代码
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt

# 生成一些数据
np.random.seed(42)
X = np.random.rand(20, 1) * 10
y = 2 * X.squeeze() + 3 + np.random.randn(20) * 2

# 测试数据
X_test = np.linspace(0, 10, 100).reshape(-1, 1)

# 1. 欠拟合:用线性模型拟合曲线数据
poly1 = PolynomialFeatures(degree=1)
X_poly1 = poly1.fit_transform(X)
model1 = LinearRegression()
model1.fit(X_poly1, y)

# 2. 过拟合:用15次多项式
poly2 = PolynomialFeatures(degree=15)
X_poly2 = poly2.fit_transform(X)
model2 = LinearRegression()
model2.fit(X_poly2, y)

# 3. 合适:用3次多项式
poly3 = PolynomialFeatures(degree=3)
X_poly3 = poly3.fit_transform(X)
model3 = LinearRegression()
model3.fit(X_poly3, y)

# 计算训练误差
train_mse1 = mean_squared_error(y, model1.predict(X_poly1))
train_mse2 = mean_squared_error(y, model2.predict(X_poly2))
train_mse3 = mean_squared_error(y, model3.predict(X_poly3))

print(f"欠拟合训练误差: {train_mse1:.2f}")
print(f"过拟合训练误差: {train_mse2:.2f}")
print(f"合适拟合训练误差: {train_mse3:.2f}")

你可能会发现,过拟合的训练误差反而最小!这就是问题的核心------模型"记住"了训练数据,但泛化能力差。

怎么解决过拟合和欠拟合?

  • 解决过拟合:增加数据、减少模型复杂度、使用正则化(L1/L2)、使用Dropout(深度学习中)

  • 解决欠拟合:增加模型复杂度、增加特征、训练更长时间


偏差-方差权衡

这个概念比过拟合/欠拟合更深入一点,是理解模型性能的核心。

偏差(Bias):模型对"真实情况"的偏离程度。偏差高意味着模型太简单,连训练数据都学不好。

方差(Variance):模型对训练数据变化的敏感程度。方差高意味着模型太复杂,稍微换点数据,模型就大变样。

偏差-方差权衡:这是一个矛盾------减少偏差往往增加方差,减少方差往往增加偏差。

用更通俗的话说:

  • 高偏差:模型太"固执",学不到数据中的模式(欠拟合)
  • 高方差:模型太"敏感",稍微换点数据就乱了(过拟合)
  • 理想情况:偏差和方差都不高,模型既能学习模式,又不会过度敏感

图片:偏差-方差权衡示意图

我用个具体的例子来说明。

假设你要训练一个模型来识别手写数字(0-9):

  • 高偏差模型:可能只会识别写得非常标准的数字,稍微歪一点就认错了。因为它学得太"死板"。

  • 高方差模型:可能在训练集上表现很好,但一换个人的写字风格就认不出来了。因为它学得"太个性"。

  • 好的模型:既学会了数字的基本特征,又能适应不同的书写风格。

代码上看一下模型复杂度对偏差和方差的影响:

python 复制代码
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np

# 生成数据
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 2 * X.squeeze() + 3 + np.random.randn(100) * 2

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

degrees = [1, 3, 5, 10, 15]
train_errors = []
test_errors = []

for degree in degrees:
    poly = PolynomialFeatures(degree=degree)
    X_poly_train = poly.fit_transform(X_train)
    X_poly_test = poly.transform(X_test)

    model = LinearRegression()
    model.fit(X_poly_train, y_train)

    train_errors.append(mean_squared_error(y_train, model.predict(X_poly_train)))
    test_errors.append(mean_squared_error(y_test, model.predict(X_poly_test)))

print("模型复杂度(多项式次数)| 训练误差 | 测试误差")
print("-" * 45)
for i, degree in enumerate(degrees):
    print(f"{degree:10d} | {train_errors[i]:10.2f} | {test_errors[i]:10.2f}")

你可能会看到这样的趋势:

  • 多项式次数低(1-3):训练误差和测试误差都比较高(高偏差,欠拟合)
  • 多项式次数中等(3-5):训练误差和测试误差都比较低(偏差和方差都合适)
  • 多项式次数高(10-15):训练误差很低,但测试误差很高(低偏差,高方差,过拟合)

这个权衡是机器学习中的核心问题之一。

实际应用中,你要不断调整模型的复杂度,找到那个"最佳平衡点"。


本章小结

今天讲了四个核心概念:

  1. 监督学习 vs 无监督学习:有标签还是没标签
  2. 回归 vs 分类:预测数值还是类别
  3. 过拟合 vs 欠拟合:模型太复杂还是太简单
  4. 偏差-方差权衡:在"学不牢"和"学太死"之间找平衡

这四个概念是理解机器学习的基础。后面学算法和模型时,你会不断回到这些概念上。

我建议你:

  1. 仔细看懂代码示例,理解每个概念在代码中是如何体现的
  2. 自己动手改改参数,看看模型行为的变化
  3. 思考一下:你实际工作中遇到的问题,适合用监督学习还是无监督学习?是回归还是分类?

下章预告

下一章,我会继续讲核心概念:交叉验证、评估指标(准确率、精确率、召回率、F1)、特征工程、数据预处理。

这些是机器学习实战中必须掌握的知识。

如果你有疑问,或者有特别想了解的内容,欢迎在评论区告诉我。

相关推荐
ZCXZ12385296a2 小时前
YOLO13-C3k2-ConverseB改进:CCTV监控场景下车辆目标检测详解
人工智能·目标检测·目标跟踪
木非哲2 小时前
AB实验高级必修课(二):从宏观叙事到微观侦查,透视方差分析与回归的本质
人工智能·数据挖掘·回归·abtest
玩电脑的辣条哥2 小时前
幽灵回复AI已回复但前端不显示的排查与修复
前端·人工智能
冬奇Lab2 小时前
团队宪法:CLAUDE.md 和rule使用技巧与复利模式
人工智能·ai编程
细节处有神明2 小时前
开源数据之历史气象数据的获取与使用
人工智能·python·算法
cxr8282 小时前
思维的相变:规模如何通过“结晶”重塑大语言模型的推理几何?
人工智能·语言模型·自然语言处理
【赫兹威客】浩哥2 小时前
基于 YOLO 多版本模型的路面缺陷识别实践与分析
人工智能·计算机视觉·目标跟踪
SEO_juper2 小时前
AI内容优化的2026实战路径:从策略、工具到案例
人工智能·ai·工具
无忧智库2 小时前
全域未来乡村数字化建设与共富运营规划方案深度解读:打造数字乡村“中国样本“的完整方法论(PPT)
大数据·人工智能