机器学习(Machine Learning, ML):通过算法让计算机从数据中自动学习规律,并利用学习到的模型进行预测或决策,而无需显式编程。
传统编程 | 机器学习 |
---|---|
输入:规则+数据 → 输出:结果 | 输入:数据+结果 → 输出:规则 |
需要人工编写逻辑 | 自动发现数据中的模式 |
类型 | 特点 | 算法示例 |
---|---|---|
参数模型 | 参数数量固定(如线性模型) | 线性回归、逻辑回归 |
非参数模型 | 参数数量随数据增长 | KNN、决策树 |
判别模型 | 直接学习决策边界 | SVM、神经网络 |
生成模型 | 学习数据分布 | 朴素贝叶斯、GAN |
任务类型 | 评估指标 |
---|---|
分类 | 准确率、精确率、召回率、F1 Score、ROC-AUC |
回归 | MAE、MSE、R² |
聚类 | 轮廓系数、Calinski-Harabasz指数 |
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 训练模型
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
# 评估
print("准确率:", model.score(X_test, y_test))
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6)
# 聚类分析
kmeans = KMeans(n_clusters=4)
clusters = kmeans.fit_predict(X)
# 可视化
plt.scatter(X[:,0], X[:,1], c=clusters, cmap='viridis')
plt.show()
常见问题 | 解决方法 |
---|---|
数据不平衡 | SMOTE过采样、类别权重调整 |
维度灾难 | 特征选择、降维技术(PCA) |
过拟合 | L1/L2正则化、Dropout(神经网络) |
计算效率低 | 特征哈希、模型量化 |
以下是线性回归的全面详解,包含基础概念、数学原理、实战应用及进阶技巧,适合零基础学习者系统掌握:
简单线性回归:
y = w 1 x + b y = w_1x + b y=w1x+b
多元线性回归:
y = w 1 x 1 + w 2 x 2 + . . . + w n x n + b y = w_1x_1 + w_2x_2 + ... + w_nx_n + b y=w1x1+w2x2+...+wnxn+b
均方误差(MSE):
M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 MSE=n1∑i=1n(yi−y^i)2
更新规则:
w = w − α ∂ M S E ∂ w w = w - \alpha \frac{\partial MSE}{\partial w} w=w−α∂w∂MSE
b = b − α ∂ M S E ∂ b b = b - \alpha \frac{\partial MSE}{\partial b} b=b−α∂b∂MSE
学习率(α)的影响:
数据集:
气缸数 | 排量 | 马力 | 重量 | 油耗 |
---|---|---|---|---|
4 | 2.5 | 120 | 1500 | 28 |
6 | 3.0 | 180 | 2000 | 22 |
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 加载数据
data = pd.read_csv('auto-mpg.csv')
X = data[['cylinders', 'displacement', 'horsepower', 'weight']]
y = data['mpg']
# 数据预处理
X.fillna(X.mean(), inplace=True) # 处理缺失值
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 评估模型
print("训练集R²:", model.score(X_train, y_train))
print("测试集R²:", model.score(X_test, y_test))
# 预测新数据
new_car = [[4, 2.0, 110, 1400]]
predicted_mpg = model.predict(new_car)
print("预测油耗:", predicted_mpg[0])
model.coef_
显示每个特征的影响程度model.intercept_
表示基础油耗值处理非线性关系:
y = w 1 x + w 2 x 2 + b y = w_1x + w_2x^2 + b y=w1x+w2x2+b
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
model.fit(X_poly, y)
类型 | 公式 | 特点 |
---|---|---|
Ridge回归 | 添加L2正则项: λ ∑ w i 2 \lambda\sum w_i^2 λ∑wi2 | 防止过拟合,保留所有特征 |
Lasso回归 | 添加L1正则项:$\lambda\sum | w_i |
ElasticNet | L1+L2组合 | 平衡特征选择与稳定性 |
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.1) # 正则化强度
lasso.fit(X_train, y_train)
现象 | 可能原因 | 解决方案 |
---|---|---|
训练集R²高,测试集低 | 过拟合 | 增加正则化、减少特征 |
所有系数接近零 | 特征尺度差异大 | 数据标准化 |
残差不随机分布 | 非线性关系 | 添加多项式特征 |
from sklearn.model_selection import GridSearchCV
params = {'alpha': [0.001, 0.01, 0.1, 1]}
grid = GridSearchCV(Lasso(), params, cv=5)
grid.fit(X, y)
print("最佳参数:", grid.best_params_)
目标:找到使 ∑ ( y i − w x i − b ) 2 \sum(y_i - wx_i - b)^2 ∑(yi−wxi−b)2最小的w和b
求导过程:
对w求导:
∂ ∂ w = − 2 ∑ x i ( y i − w x i − b ) = 0 \frac{\partial}{\partial w} = -2\sum x_i(y_i - wx_i - b) = 0 ∂w∂=−2∑xi(yi−wxi−b)=0
对b求导:
∂ ∂ b = − 2 ∑ ( y i − w x i − b ) = 0 \frac{\partial}{\partial b} = -2\sum(y_i - wx_i - b) = 0 ∂b∂=−2∑(yi−wxi−b)=0
解得:
w = n ∑ x i y i − ∑ x i ∑ y i n ∑ x i 2 − ( ∑ x i ) 2 w = \frac{n\sum x_iy_i - \sum x_i \sum y_i}{n\sum x_i^2 - (\sum x_i)^2} w=n∑xi2−(∑xi)2n∑xiyi−∑xi∑yi
b = ∑ y i − w ∑ x i n b = \frac{\sum y_i - w\sum x_i}{n} b=n∑yi−w∑xi
愿得一心人,白头不相离。 —卓文君