机器学习作为人工智能的核心技术,正在改变我们的世界。Python凭借其丰富的库和简洁的语法,已成为机器学习领域的首选语言。本教程将从零开始,带你进入机器学习的奇妙世界,通过实际案例掌握核心概念和技能。
一、机器学习基础与环境搭建
1. 什么是机器学习?
机器学习是让计算机从数据中学习规律,并做出预测或决策的技术。主要分为三类:
- 监督学习:使用带有标签的数据进行训练,如分类、回归
- 无监督学习:使用无标签数据发现模式,如聚类、降维
- 强化学习:通过与环境的交互学习最优策略
2. Python环境配置
推荐使用Anaconda环境管理,包含数据科学常用库:
# 安装Anaconda后创建虚拟环境
conda create -n ml_env python=3.9
conda activate ml_env
# 安装核心库
pip install numpy pandas matplotlib scikit-learn jupyter
# 可选:深度学习框架
pip install tensorflow pytorch
二、数据处理与探索性分析
1. NumPy数组操作
import numpy as np
# 创建数组
arr = np.array([1, 2, 3, 4, 5])
matrix = np.array([[1, 2], [3, 4]])
# 常用操作
print("形状:", arr.shape)
print("平均值:", np.mean(arr))
print("标准差:", np.std(arr))
print("矩阵乘法:", np.dot(matrix, matrix))
2. Pandas数据处理
import pandas as pd
# 创建DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 28],
'工资': [5000, 8000, 6500],
'部门': ['技术部', '销售部', '技术部']
}
df = pd.DataFrame(data)
# 数据探索
print("基本信息:")
print(df.info())
print("\n统计描述:")
print(df.describe())
print("\n部门分组统计:")
print(df.groupby('部门')['工资'].mean())
3. 数据可视化
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 直方图
axes[0, 0].hist(df['年龄'], bins=10, edgecolor='black')
axes[0, 0].set_title('年龄分布')
axes[0, 0].set_xlabel('年龄')
axes[0, 0].set_ylabel('频数')
# 散点图
axes[0, 1].scatter(df['年龄'], df['工资'])
axes[0, 1].set_title('年龄与工资关系')
axes[0, 1].set_xlabel('年龄')
axes[0, 1].set_ylabel('工资')
# 箱线图
axes[1, 0].boxplot([df[df['部门']=='技术部']['工资'],
df[df['部门']=='销售部']['工资']])
axes[1, 0].set_title('部门工资对比')
axes[1, 0].set_xticklabels(['技术部', '销售部'])
# 相关性热图
corr = df.select_dtypes(include=[np.number]).corr()
sns.heatmap(corr, annot=True, ax=axes[1, 1])
axes[1, 1].set_title('特征相关性')
plt.tight_layout()
plt.show()
三、监督学习实战
1. 线性回归
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import load_boston
# 加载数据集
boston = load_boston()
X, y = boston.data, boston.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 创建并训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测和评估
y_pred = model.predict(X_test)
print("均方误差:", mean_squared_error(y_test, y_pred))
print("R²得分:", r2_score(y_test, y_pred))
# 可视化预测结果
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.6)
plt.plot([y_test.min(), y_test.max()],
[y_test.min(), y_test.max()],
'r--', lw=2)
plt.xlabel('实际值')
plt.ylabel('预测值')
plt.title('线性回归预测结果')
plt.show()
2. 逻辑回归分类
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.metrics import classification_report, confusion_matrix
# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
# 只使用前两类数据(二分类)
X = X[y != 2]
y = y[y != 2]
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 训练逻辑回归模型
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
# 预测和评估
y_pred = logreg.predict(X_test)
print("分类报告:")
print(classification_report(y_test, y_pred))
# 混淆矩阵
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d')
plt.title('混淆矩阵')
plt.ylabel('真实标签')
plt.xlabel('预测标签')
plt.show()
3. 决策树与随机森林
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.ensemble import RandomForestClassifier
# 使用完整鸢尾花数据集
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 决策树
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(X_train, y_train)
dt_score = dt.score(X_test, y_test)
print(f"决策树准确率: {dt_score:.3f}")
# 随机森林
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
rf_score = rf.score(X_test, y_test)
print(f"随机森林准确率: {rf_score:.3f}")
# 可视化决策树
plt.figure(figsize=(20, 10))
plot_tree(dt, feature_names=iris.feature_names,
class_names=iris.target_names, filled=True)
plt.title('决策树可视化')
plt.show()
四、无监督学习实战
1. K-Means聚类
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# 使用鸢尾花数据
X = iris.data
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 肘部法则确定最佳K值
inertias = []
K_range = range(1, 11)
for k in K_range:
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X_scaled)
inertias.append(kmeans.inertia_)
# 绘制肘部图
plt.figure(figsize=(10, 6))
plt.plot(K_range, inertias, 'bo-')
plt.xlabel('聚类数K')
plt.ylabel('误差平方和')
plt.title('肘部法则')
plt.show()
# 使用K=3进行聚类
kmeans = KMeans(n_clusters=3, random_state=42)
labels = kmeans.fit_predict(X_scaled)
# 可视化聚类结果
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.title('K-Means聚类结果')
plt.colorbar(scatter)
plt.show()
2. 主成分分析(PCA)
from sklearn.decomposition import PCA
# 对鸢尾花数据进行PCA降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print("主成分方差解释率:", pca.explained_variance_ratio_)
print("累计方差解释率:", sum(pca.explained_variance_ratio_))
# 可视化降维结果
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='Set1')
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('PCA降维结果')
plt.colorbar(scatter)
plt.show()
五、模型评估与优化
1. 交叉验证
from sklearn.model_selection import cross_val_score, GridSearchCV
# 5折交叉验证
scores = cross_val_score(rf, X, y, cv=5, scoring='accuracy')
print(f"交叉验证准确率: {scores.mean():.3f} (+/- {scores.std() * 2:.3f})")
# 网格搜索调参
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 10, 20, 30],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(
RandomForestClassifier(random_state=42),
param_grid, cv=5, scoring='accuracy'
)
grid_search.fit(X_train, y_train)
print("最佳参数:", grid_search.best_params_)
print("最佳准确率:", grid_search.best_score_)
2. 学习曲线与验证曲线
from sklearn.model_selection import learning_curve, validation_curve
# 学习曲线
train_sizes, train_scores, test_scores = learning_curve(
rf, X, y, cv=5, train_sizes=np.linspace(0.1, 1.0, 10)
)
train_mean = train_scores.mean(axis=1)
train_std = train_scores.std(axis=1)
test_mean = test_scores.mean(axis=1)
test_std = test_scores.std(axis=1)
plt.figure(figsize=(10, 6))
plt.plot(train_sizes, train_mean, 'o-', color='blue', label='训练集')
plt.plot(train_sizes, test_mean, 'o-', color='red', label='验证集')
plt.fill_between(train_sizes, train_mean - train_std,
train_mean + train_std, alpha=0.1, color='blue')
plt.fill_between(train_sizes, test_mean - test_std,
test_mean + test_std, alpha=0.1, color='red')
plt.xlabel('训练样本数')
plt.ylabel('准确率')
plt.legend()
plt.title('学习曲线')
plt.show()
六、深度学习入门
1. 使用TensorFlow/Keras构建神经网络
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
# 构建简单神经网络
model = keras.Sequential([
layers.Dense(64, activation='relu', input_shape=(X.shape[1],)),
layers.Dropout(0.3),
layers.Dense(32, activation='relu'),
layers.Dropout(0.3),
layers.Dense(3, activation='softmax') # 3个输出类别
])
# 编译模型
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# 训练模型
history = model.fit(
X_train, y_train,
epochs=50,
batch_size=32,
validation_split=0.2,
verbose=0
)
# 绘制训练历史
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.xlabel('轮次')
plt.ylabel('准确率')
plt.legend()
plt.title('准确率变化')
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.xlabel('轮次')
plt.ylabel('损失')
plt.legend()
plt.title('损失变化')
plt.tight_layout()
plt.show()
七、实战项目:手写数字识别
from sklearn.datasets import load_digits
from sklearn.neural_network import MLPClassifier
# 加载手写数字数据集
digits = load_digits()
X_digits, y_digits = digits.data, digits.target
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
X_digits, y_digits, test_size=0.2, random_state=42
)
# 创建多层感知器
mlp = MLPClassifier(
hidden_layer_sizes=(100, 50),
max_iter=300,
alpha=1e-4,
solver='adam',
random_state=42
)
# 训练模型
mlp.fit(X_train, y_train)
# 评估模型
train_score = mlp.score(X_train, y_train)
test_score = mlp.score(X_test, y_test)
print(f"训练集准确率: {train_score:.3f}")
print(f"测试集准确率: {test_score:.3f}")
# 可视化预测结果
fig, axes = plt.subplots(4, 4, figsize=(10, 10))
for i, ax in enumerate(axes.ravel()):
ax.imshow(X_test[i].reshape(8, 8), cmap='gray')
pred = mlp.predict([X_test[i]])[0]
true = y_test[i]
ax.set_title(f"预测: {pred}\n真实: {true}")
ax.axis('off')
plt.tight_layout()
plt.show()
八、总结与进阶学习
通过本教程,你已经掌握了机器学习的基本概念和Python实现。下一步建议:
- 深入理论学习:学习《统计学习方法》、《机器学习》(周志华)等经典教材
- 实战项目:在Kaggle等平台参与实际比赛项目
- 深度学习:学习PyTorch/TensorFlow框架,尝试计算机视觉、自然语言处理项目
- 工程部署:学习使用Flask/FastAPI部署机器学习模型
- 持续学习:关注最新研究论文和技术博客
记住:机器学习是一门实践性很强的学科,多动手、多思考、多总结,才能在这条路上走得更远。
评论 (42)