机器学习的魅力
知识点 1:线性回归(Linear Regression)—— “一条直线走天下”
文字描述:
线性回归试图找到一条“最佳直线”来拟合数据点,使所有点到这条直线的垂直距离(残差)的平方和最小(最小二乘法)。它假设特征与目标之间存在线性关系。适用于预测连续数值,如房价、温度。
核心公式: y = w·x + b
损失函数:均方误差 MSE = (1/n) Σ(y_true - y_pred)²
优化方法:梯度下降 或 正规方程
代码示例(Python + sklearn):
python
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 生成假数据(假装是房价)
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
y = np.array([1.5, 3.8, 6.7, 9.0, 11.2])
model = LinearRegression()
model.fit(X, y)
preds = model.predict(X)
print(f"斜率 w: {model.coef_[0]:.2f}, 截距 b: {model.intercept_:.2f}")
print(f"MSE: {mean_squared_error(y, preds):.2f}")
知识点 2:逻辑回归(Logistic Regression)—— “虽然叫回归,但它是分类的间谍”
文字描述:
逻辑回归虽带“回归”二字,却是用于二分类的。它通过 Sigmoid 函数将线性输出压缩到 (0,1) 之间,作为“属于正类的概率”。决策边界通常设为 0.5。适用于垃圾邮件识别、患病预测等。
核心公式: P(y=1) = 1 / (1 + e^{-(w·x+b)})
损失函数:交叉熵损失(Log Loss)
代码示例:
python
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
# 生成二分类数据集
X, y = make_classification(n_samples=100, n_features=2, n_redundant=0, random_state=42)
clf = LogisticRegression()
clf.fit(X, y)
print(f"准确率: {clf.score(X, y):.2f}")
# 预测概率
proba = clf.predict_proba(X[:2])
print(f"前两个样本的预测概率: \n{proba}")
知识点 3:决策树(Decision Tree)—— “灵魂拷问机”
文字描述:
决策树通过一系列“是/否”问题(特征阈值)对数据进行分割,目标是使每个子节点的纯度最高(如信息增益最大或基尼系数最小)。易于理解,但容易过拟合,需剪枝。适用于可解释性要求高的场景。
核心指标:
-
信息增益 = 熵(父) - Σ(子节点权重 × 熵(子))
-
基尼不纯度 = 1 - Σ(p_i²)
代码示例:
python
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
# 使用鸢尾花数据
from sklearn.datasets import load_iris
iris = load_iris()
tree = DecisionTreeClassifier(max_depth=3, random_state=42)
tree.fit(iris.data, iris.target)
# 可视化(趣味性)
plt.figure(figsize=(12,6))
plot_tree(tree, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.title("一棵会思考的树 🌳")
plt.show()
知识点 4:支持向量机(SVM)—— “划清界限狂魔”
文字描述:
SVM 寻找一个超平面,使不同类别之间的间隔(margin)最大化。它只依赖支持向量(离决策面最近的样本),对异常值鲁棒。通过核技巧(Kernel Trick)可处理非线性分类,如 RBF 核将数据映射到高维空间。
关键概念: 硬间隔(线性可分)、软间隔(允许少量误分类)、核函数
代码示例:
python
from sklearn.svm import SVC
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
X, y = make_moons(n_samples=200, noise=0.15, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
svm = SVC(kernel='rbf', gamma='scale', C=1.0)
svm.fit(X_train, y_train)
print(f"测试集准确率: {svm.score(X_test, y_test):.2f}")
知识点 5:K-Means 聚类—— “无监督的拉帮结派”
文字描述:
K-Means 将数据划分为 K 个簇,每个簇由其质心(均值点)代表。算法迭代:分配样本到最近的质心 → 更新质心为簇内均值。需预先指定 K,对初始质心敏感,常用 K-Means++ 初始化。
评估指标: 轮廓系数(Silhouette Score)、手肘法(Elbow Method)
代码示例:
python
from sklearn.cluster import KMeans
import numpy as np
# 生成3个团块的数据
from sklearn.datasets import make_blobs
X, _ = make_blobs(n_samples=300, centers=3, random_state=42)
kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
labels = kmeans.fit_predict(X)
print(f"质心坐标: \n{kmeans.cluster_centers_}")
print(f"前10个样本的簇标签: {labels[:10]}")
知识点 6:交叉验证(Cross-Validation)—— “防止自我感觉良好”
文字描述:
交叉验证是一种模型评估方法,不将数据简单分为一组训练/测试,而是分成 K 折(K-Fold)。每折轮流做测试集,其余做训练集,最终取平均性能。能更稳健地评估模型泛化能力,避免因单次划分带来的运气成分。
常用: K-Fold(通常 K=5 或 10)、Stratified K-Fold(保持类别比例)
代码示例:
python
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_digits
digits = load_digits()
rf = RandomForestClassifier(n_estimators=10, random_state=42)
scores = cross_val_score(rf, digits.data, digits.target, cv=5, scoring='accuracy')
print(f"5折交叉验证准确率: {scores}")
print(f"平均: {scores.mean():.3f} ± {scores.std():.3f}")
知识点 7:正则化(L1 / L2)—— “给模型戴上紧箍咒”
文字描述:
正则化用于防止过拟合,通过在损失函数后加惩罚项来限制模型复杂度。
-
L1(Lasso):惩罚权重绝对值之和,可产生稀疏解(特征选择)。
-
L2(Ridge):惩罚权重平方和,使权重平滑,不产生稀疏但数值稳定。
-
弹性网(Elastic Net):L1 + L2 的组合。
直观理解: 太复杂的模型会被“罚款”,从而更乖。
代码示例(线性回归对比):
python
from sklearn.linear_model import Ridge, Lasso
from sklearn.datasets import make_regression
X, y = make_regression(n_samples=100, n_features=20, noise=5, random_state=42)
ridge = Ridge(alpha=1.0) # alpha 是惩罚强度
lasso = Lasso(alpha=0.1)
ridge.fit(X, y); lasso.fit(X, y)
print(f"Ridge 系数非零个数: {sum(ridge.coef_ != 0)}")
print(f"Lasso 系数非零个数: {sum(lasso.coef_ != 0)} (更稀疏)")
知识点 8:梯度下降(Gradient Descent)—— “盲人下山法”
文字描述:
梯度下降是优化算法,通过计算损失函数对参数的梯度,沿负梯度方向更新参数,使损失逐步减小。
-
批量梯度下降(BGD):用全部数据计算梯度(准确但慢)
-
随机梯度下降(SGD):用一个样本计算(快但不稳定)
-
小批量梯度下降(Mini-batch):折中,常用
关键超参数: 学习率(太大震荡,太小龟速)
代码示例(手动实现 SGD 线性回归):
python
import numpy as np
# 生成数据
X = np.random.rand(100, 1) * 10
y = 2.5 * X + 1.3 + np.random.randn(100, 1) * 0.5
w = np.random.randn(1)
b = np.random.randn(1)
lr = 0.01
epochs = 200
for epoch in range(epochs):
# 随机选一个样本(SGD)
idx = np.random.randint(100)
x_i = X[idx]; y_i = y[idx]
# 梯度
y_pred = w * x_i + b
dw = 2 * (y_pred - y_i) * x_i
db = 2 * (y_pred - y_i)
# 更新
w -= lr * dw
b -= lr * db
print(f"估计 w: {w[0]:.2f}, 真实 w: 2.5")
print(f"估计 b: {b[0]:.2f}, 真实 b: 1.3")
更多推荐

所有评论(0)