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 秒实验
- 把最后一行 118 平米 / 163 万删掉,重训一次,看系数怎么变。
- 把 reshape(-1, 1) 去掉,看报错信息到底说了什么。
- 想一想:如果模型只有一个系数和一个截距,它凭什么能预测?
常见误区
- 把 X 写成一维:报 Expected 2D array,改成 n 行 1 列。
- predict 传一维:也要二维,写
[ [100]]。 - 没 fit 就取 coef_:属性还不存在,直接报错。
- 以为 sklearn 能读 Excel:读文件是 pandas 的活,sklearn 只吃数组。
自测三问(点开对答案)
1. sklearn 三步走的固定写法是什么? —— 建模型、fit(X, y)、predict(X_new)。换算法这三行形状不变。 2. X 和 y 的形状分别是什么? —— X 是(样本数,特征数)二维,y 是(样本数,)一维。 3. 带下划线的属性表示什么? —— 训练之后才有的、学出来的东西,比如 coef_、intercept_。接口会用了。下一篇拿十八套房真跑一次回归,把 R 方和 RMSE 讲清楚。
- ☐ (本篇完,下一篇 8.2 最小二乘回归:预测房价)