📊 第8章 机器学习 Scikit-Learn
📄 一句话概括

scikit-learn 是算法库,算法在这里,数据要你自己准备。 所有模型都是同一个套路:建模型、fit 训练、predict 预测。 X 必须是二维的,y 必须是一维的。这条记错,第一步就报错。

📝 本章和前面几章的关系

前七章一直在描述数据、判断数据。从这一章起开始预测:拿历史数据学一条规律,用到新数据上。 本机 scikit-learn 1.9.1,numpy 2.5.2,python 3.13.14。

一、它管什么,不管什么

pandas 管数据、matplotlib 管画图、sklearn 管建模,三件套分工很清楚。 它不负责读文件、不负责画图、也不做深度学习。 神经网络要装 pytorch 或 tensorflow,那是另一条线,和 sklearn 不是替代关系。

它的强项是把上百种经典算法做成一个统一接口,换算法几乎不用改代码。

二、装法:一行就够

pip install scikit-learn,它依赖 numpy 和 scipy,会自动带上。 国内网络慢就加镜像:-i https://mirrors.aliyun.com/pypi/simple/。 包名带横杠,导入名不带。pip 装的是 scikit-learn,代码里写 import sklearn。

装完 import 一下不报错,就说明好了。版本号用 sklearn.__version__ 查。

三、三步走遍全库

步骤 写什么 干什么
一、建 m = LinearRegression() 选算法、设参数
二、训 m.fit(X, y) 从数据里学规律
三、测 m.predict(X_new) 给新数据出结果

三步走遍全库。线性回归、岭回归、SVM、KMeans,这三行的形状都不变。 KMeans 没有 y,fit 只接一个参数——这是唯一要留心的例外。 这个统一接口是 sklearn 最大的价值:学一个等于学一百个。

四、X 二维、y 一维

训练数据的形状是(样本数,特征数),哪怕只有一个特征,也得写成 n 行 1 列。 一维的 [1, 2, 3] 直接塞进去,会报 Expected 2D array。 改法:X.reshape(-1, 1)。第 6 章学的 reshape,在这里终于派上大用。

y 反过来,是一维的(样本数,)。X 二维、y 一维,这个组合要背下来。

五、第一个例子:六个样本

面积 62、75、88、95、105、118 平米,价格 78 到 163 万。 训练完系数是 1.5798,截距 -22.1394。 预测 100 平米:135.84 万元。

系数 1.58 的意思是「面积每多一平米,价格多 1.58 万」。 这句话就是模型的全部内容。所谓「模型」,说穿了就是一串系数。

六、动手 Demo:Scikit-Learn 是什么、怎么装

先确认版本,再用六个样本跑一遍完整的三步。 顺带把 X 二维、y 一维这条规矩用代码验证一次。

import numpy as np
import sklearn
from sklearn.linear_model import LinearRegression

print("sklearn 版本 %s" % sklearn.__version__)

X = np.array([[62], [75], [88], [95], [105], [118]])
y = np.array([78, 92, 118, 128, 146, 163])
print("X 形状 %s,y 形状 %s" % (X.shape, y.shape))

m = LinearRegression()
m.fit(X, y)
print("系数 %.4f,截距 %.4f" % (m.coef_[0], m.intercept_))
print("预测 100 平米:%.2f 万元" % m.predict([ [100]])[0])

try:
    LinearRegression().fit(np.array([62, 75, 88]), np.array([78, 92, 118]))
except ValueError as e:
    print("塞一维 X:%s" % str(e).split(chr(10))[0][:60])

X2 = np.array([62, 75, 88]).reshape(-1, 1)
print("reshape 之后 X 形状 %s" % (X2.shape,))

实跑输出:

--------------------------------------------------------------------
Scikit-Learn 是什么、怎么装
--------------------------------------------------------------------

  ① 它是什么
  --------------------------------------------------------------------
  scikit-learn 是一个机器学习算法库,本机版本 1.9.1。
  它的定位很清楚:算法在这里,数据要你自己准备。
  做数据分析的三件套分工:pandas 管数据、matplotlib 管画图、sklearn 管建模。
  ! 它不做深度学习。神经网络要装 pytorch 或 tensorflow,那是另一条线。

  ② 装法
  --------------------------------------------------------------------
  pip install scikit-learn 就够了,它依赖 numpy 和 scipy,会自动带上。
  国内网络建议加镜像:pip install -i https://mirrors.aliyun.com/pypi/simple/ scikit-learn
  装完 import sklearn 不报错,就说明好了。
  ! 包名带横杠,导入名不带:pip 装的是 scikit-learn,代码里写 sklearn。

  ③ 所有模型都是同一个套路
  --------------------------------------------------------------------
  第一步 建模型:m = LinearRegression()
  第二步 训练:m.fit(X, y)
  第三步 预测:m.predict(X_new)
  三步走遍全库。换了算法,这三行一个字都不用改。
  ! 这个统一接口是 sklearn 最大的好处,学一个等于学一百个。

  ④ X 必须是二维的
  --------------------------------------------------------------------
  训练数据的形状是(样本数,特征数)。哪怕只有一个特征,也得写成 n 行 1 列。
  一维的 [1, 2, 3] 直接塞进去,会报 Expected 2D array。
  改法很简单:X.reshape(-1, 1),第 6 章学的 reshape 在这里派上用场。
  ! y 是一维的,形状是(样本数,)。X 二维、y 一维,这个组合要记牢。

  ⑤ 第一个完整例子
  --------------------------------------------------------------------
  六个样本,一个特征(面积),目标是价格。
  学到的系数 1.5798,截距 -22.1394。
  预测 100 平米的房价:135.84 万元。
  系数 1.58 的意思是「面积每多一平米,价格多 1.58 万」。这句话就是模型的全部内容。
  ! predict 的入参也必须是二维,所以写 [ [100]] 而不是 [100]。

predict([ [100]]) 里的双层方括号不是装饰:预测也要二维,一行一列。 coef_ 和 intercept_ 带下划线,是「训练之后才有」的属性。没 fit 就取,会报错。 这个下划线约定要记住:带下划线的都是学出来的,不带的是你设的。

30 秒实验

  1. 把最后一行 118 平米 / 163 万删掉,重训一次,看系数怎么变。
  2. 把 reshape(-1, 1) 去掉,看报错信息到底说了什么。
  3. 想一想:如果模型只有一个系数和一个截距,它凭什么能预测?

常见误区

  1. 把 X 写成一维:报 Expected 2D array,改成 n 行 1 列。
  2. predict 传一维:也要二维,写 [ [100]]。
  3. 没 fit 就取 coef_:属性还不存在,直接报错。
  4. 以为 sklearn 能读 Excel:读文件是 pandas 的活,sklearn 只吃数组。
自测三问(点开对答案) 1. sklearn 三步走的固定写法是什么? —— 建模型、fit(X, y)、predict(X_new)。换算法这三行形状不变。 2. X 和 y 的形状分别是什么? —— X 是(样本数,特征数)二维,y 是(样本数,)一维。 3. 带下划线的属性表示什么? —— 训练之后才有的、学出来的东西,比如 coef_、intercept_。

接口会用了。下一篇拿十八套房真跑一次回归,把 R 方和 RMSE 讲清楚。

相关笔记