小强一直以为 AI 很神秘,直到老师让他「教」电脑认鸢尾花:给它看 150 朵花的花瓣花萼数据,它自己找规律,居然真能认出新花。原来机器学习不是程序员写规则,而是程序从数据里自己「学」出规则——这一学期,小强第一次站在了 AI 的大门口。
用 sklearn 玩遍经典机器学习算法:回归、分类、聚类、集成学习,理解「模型是怎么从数据里学东西的」。
用故事和生活类比打开这学期的大门,先「知其所以然」再学语法。
小强一直以为 AI 很神秘,直到老师让他「教」电脑认鸢尾花:给它看 150 朵花的花瓣花萼数据,它自己找规律,居然真能认出新花。原来机器学习不是程序员写规则,而是程序从数据里自己「学」出规则——这一学期,小强第一次站在了 AI 的大门口。
对着标准答案反复练,学会解题套路(回归/分类)。
有标签没人教,自己按相似性分堆——聚类。
无标签预测和答案差多远扣多少分,学习就是让扣分变少。
量化差距一棵树的意见会偏,一百棵树投票就准了。
集成学习机器学习基础 —— 共 12 课时,全部知识点一网打尽。
# 图灵测试:如果你隔着屏幕分不清对方是人还是机器,
# 那么这台机器就「会思考」。
qa = [
("你几岁?", "我今年 12 岁零 3 个版本号~"),
("1+1=?", "2。要不要听个冷笑话?"),
("你会写诗吗", "会!押韵的那种。"),
]
for q, a in qa:
print(f"问:{q}\n答:{a}")
print("AI 三次浪潮:符号主义 → 机器学习 → 深度学习/大模型")问:你几岁?
答:我今年 12 岁零 3 个版本号~
问:1+1=?
答:2。要不要听个冷笑话?
问:你会写诗吗
答:会!押韵的那种。
AI 三次浪潮:符号主义 → 机器学习 → 深度学习/大模型from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
X, y = load_iris(return_X_y=True) # 150 朵花 × 4 个特征
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=1)
model = DecisionTreeClassifier().fit(Xtr, ytr)
print("测试集准确率:%.2f" % model.score(Xte, yte))
print("有标签→监督学习;无标签聚类→无监督学习")测试集准确率:0.98
有标签→监督学习;无标签聚类→无监督学习from sklearn.linear_model import LinearRegression
# 面积(㎡) → 房价(万)
X = [[50], [80], [100], [120]]
y = [150, 230, 290, 350]
model = LinearRegression().fit(X, y)
print("每平米约:", round(model.coef_[0], 1), "万")
print("预测 90㎡:", round(model.predict([[90]])[0], 1), "万")每平米约: 2.9 万
预测 90㎡: 263.4 万import math
def sigmoid(z):
return 1 / (1 + math.exp(-z))
for z in [-2, 0, 2]:
print(f"z={z:+d} → 概率 {sigmoid(z):.2f}")
print("≥0.5 判为垃圾邮件,<0.5 判为正常邮件")
# 决策边界:z = w·x + b = 0 的那条线z=-2 → 概率 0.12
z=+0 → 概率 0.50
z=+2 → 概率 0.88
≥0.5 判为垃圾邮件,<0.5 判为正常邮件from sklearn.tree import DecisionTreeClassifier, export_text
# 特征: [有无羽毛, 会飞吗] 标签: 0鸟 1猫 2鱼
X = [[1,1],[1,0],[0,0],[0,0],[0,1]]
y = [0, 0, 1, 2, 2]
tree = DecisionTreeClassifier(max_depth=2).fit(X, y)
print(export_text(tree,
feature_names=["羽毛", "会飞"]))|--- 羽毛 <= 0.50
| |--- 会飞 <= 0.50
| | |--- class: 1
| |--- 会飞 > 0.50
| | |--- class: 2
|--- 羽毛 > 0.50
| |--- class: 0# 随机森林 = 多棵「各有偏见」的决策树 + 投票
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_digits
X, y = load_digits(return_X_y=True)
model = RandomForestClassifier(n_estimators=100, random_state=1)
model.fit(X[:1400], y[:1400])
print("手写数字准确率:%.3f" % model.score(X[1400:], y[1400:]))
print("两重随机:①有放回抽样本 ②每次分裂只看部分特征")
print("防止所有树长成一个样 → 投票才有意义")手写数字准确率: 0.972
两重随机:①有放回抽样本 ②每次分裂只看部分特征
防止所有树长成一个样 → 投票才有意义# KNN:看身边 K 个邻居,少数服从多数
train = [(1, "动作片"), (2, "动作片"),
(8, "爱情片"), (9, "爱情片")]
new = 3
k = 3
dists = sorted(train, key=lambda t: abs(t[0] - new))[:k]
votes = {}
for _, label in dists:
votes[label] = votes.get(label, 0) + 1
print("新样本 =", new, "→ 预测:", max(votes, key=votes.get))
print("k 太小怕噪声,k 太大怕混淆,要试出来的")新样本 = 3 → 预测: 动作片
k 太小怕噪声,k 太大怕混淆,要试出来的import numpy as np
from sklearn.cluster import KMeans
# 假设一张图的 6 个像素(RGB)
pixels = np.array([[250,10,10],[240,20,20],[10,10,250],
[20,20,240],[120,120,120],[130,130,130]])
kmeans = KMeans(n_clusters=3).fit(pixels) # 收敛到 3 种主色
for c in kmeans.cluster_centers_.astype(int):
print("主色 RGB:", c)主色 RGB: [245 15 15]
主色 RGB: [ 15 15 245]
主色 RGB: [125 125 125]from sklearn.metrics import (
accuracy_score, precision_score, recall_score)
y_true = [1, 0, 1, 1, 0, 1] # 真实答案
y_pred = [1, 0, 0, 1, 0, 1] # 模型预测
print("准确率:", accuracy_score(y_true, y_pred))
print("精确率:", precision_score(y_true, y_pred))
print("召回率:", recall_score(y_true, y_pred))准确率: 0.8333333333333334
精确率: 1.0
召回率: 0.75import numpy as np
# 三大件:造特征 / 挑特征 / 变尺度
x = np.array([[180, 70], [165, 55], [175, 80]])
# ① 造特征:身高体重 → BMI(更有信息量)
bmi = x[:, 1] / (x[:, 0] / 100) ** 2
# ② 标准化:均值 0、方差 1,防止量纲偏心
z = (x - x.mean(0)) / x.std(0)
print("BMI:", np.round(bmi, 1))
print("标准化后第1行:", np.round(z[0], 2))BMI: [21.6 20.2 26.1]
标准化后第1行: [ 0.85 -0.19]
(好的特征 > 复杂的模型)from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.ensemble import GradientBoostingClassifier
# ① 读数据 → ② 特征工程 → ③ 划分 → ④ 建管道 → ⑤ 训练 → ⑥ 评估
pipe = make_pipeline(
SimpleImputer(strategy="median"), # 自动填缺失值
GradientBoostingClassifier(random_state=1))
# pipe.fit(X_train, y_train)
# print(pipe.score(X_test, y_test)) # 典型 ~0.80
print("管道 = 预处理 + 模型 一体化,防数据泄漏")
print("Kaggle 泰坦尼克:经典入门赛,新手第一站")管道 = 预处理 + 模型 一体化,防数据泄漏
Kaggle 泰坦尼克:经典入门赛,新手第一站import numpy as np
# 特征:[学习时长, 作业完成率, 出勤率]
X = np.array([[2.0, 0.6, 0.9], [5.0, 0.95, 0.98], [1.0, 0.3, 0.7]])
y = np.array([65, 92, 55]) # 期末分数
# 一元看看相关性:作业完成率 vs 分数
r = np.corrcoef(X[:, 1], y)[0, 1]
print("作业完成率与成绩相关系数:%.2f" % r)
print("系统流程:录入数据 → 训练回归 → 预测 → 可视化报告")作业完成率与成绩相关系数:0.99
系统流程:录入数据 → 训练回归 → 预测 → 可视化报告每个知识点都要落到能跑、能玩、能演示的作品上。
期末项目是整学期知识点的综合检验场:综合运用。学生将独立完成需求拆解 → 功能实现 → 调试打磨 → 上台演示的完整闭环。
| 课次 | 主题 | 趣味项目 | 知识点 |
|---|---|---|---|
| 1 | AI是什么 | 图灵测试小游戏 | AI发展史、基本概念 |
| 2 | 机器学习入门 | 鸢尾花分类 | 监督学习、无监督学习 |
| 3 | 线性回归 | 预测房价 | 线性模型、损失函数 |
| 4 | 逻辑回归 | 判断邮件是否垃圾 | 分类问题、sigmoid |
| 5 | 决策树 | 玩20个问题游戏 | 决策树、信息熵 |
| 6 | 随机森林 | 手写数字识别(传统方法) | 集成学习 |
| 7 | K近邻 | 推荐系统入门 | KNN算法 |
| 8 | K均值聚类 | 图片颜色压缩 | 聚类算法 |
| 9 | 模型评估 | 谁的模型更准 | 准确率、精确率、召回率 |
| 10 | 特征工程 | 数据预处理实战 | 特征选择、标准化 |
| 11 | Sklearn实战 | 泰坦尼克号生存预测 | sklearn完整流程 |
| 12 | 期末项目 | 学生成绩预测系统 | 综合运用 |
把一学期的知识点串成体系,看清来路与去向。
◀ 上一章:三年级 下学期 · 综合项目与阶段毕业
下一章 ▶:四年级 下学期 · 神经网络与PyTorch入门
用 sklearn 玩遍经典机器学习算法:回归、分类、聚类、集成学习,理解「模型是怎么从数据里学东西的」。
结业时你将带走:2 个 AI 项目(CV+NLP)+ 云端 GPU 训练经验 + NOAI 复赛实力。
避开高频易错点,再用速查表把语法焊进肌肉记忆。
模型.fit(全部数据)
模型.score(全部数据)
# 99%!其实是背答案train_test_split 分开
fit(X_train) score(X_test)99个正常+1个生病
全预测正常 → 99%准
# 病人一个没抓到再看精确率/召回率
和混淆矩阵收入 0~100000 vs 年龄 0~100
KNN 距离被收入统治StandardScaler()
X = scaler.fit_transform(X)model.fit(X_train, y_train)
print(model) # 打印了模型?pred = model.predict(X_test)| 功能 | 写法 | 一句话理解 |
|---|---|---|
| 切分数据 | train_test_split(X, y, test_size=0.2) | 八二分,学习考试分开 |
| 线性回归 | LinearRegression().fit(X, y) | 画一条最贴数据的直线 |
| 逻辑回归 | LogisticRegression().fit(X, y) | 输出 0~1 的概率 |
| 决策树 | DecisionTreeClassifier(max_depth=5) | 一问一答层层分 |
| 随机森林 | RandomForestClassifier(n_estimators=100) | 百树投票 |
| K 均值 | KMeans(n_clusters=3).fit(X) | 自动分 3 堆 |
| 评估 | accuracy_score(y_test, pred) | 算对了多少比例 |
| 标准化 | StandardScaler().fit_transform(X) | 把量纲拉齐 |
按 A / B / C 三档难度自主选择:保底完成 A 组,学有余力挑战 B、C 组。