Python机器学习入门实战教程

机器学习作为人工智能的核心技术,正在改变我们的世界。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实现。下一步建议:

  1. 深入理论学习:学习《统计学习方法》、《机器学习》(周志华)等经典教材
  2. 实战项目:在Kaggle等平台参与实际比赛项目
  3. 深度学习:学习PyTorch/TensorFlow框架,尝试计算机视觉、自然语言处理项目
  4. 工程部署:学习使用Flask/FastAPI部署机器学习模型
  5. 持续学习:关注最新研究论文和技术博客

记住:机器学习是一门实践性很强的学科,多动手、多思考、多总结,才能在这条路上走得更远。

评论 (42)

  • ML初学者 今天 10:15
    非常全面的教程!从环境搭建到实战项目一气呵成,特别是手写数字识别项目,让我对机器学习有了直观的理解。
  • 数据工程师 昨天 20:30
    讲解得很清晰,特别是交叉验证和网格搜索部分,这些在实际项目中非常重要。建议加上特征工程的更多内容。
  • AI研究员 昨天 15:45
    很好的入门教程!如果想深入学习,建议补充一些关于模型解释性(如SHAP、LIME)和深度学习框架对比的内容。
  • Python开发者 昨天 13:20
    代码示例非常详细,可以直接复制运行。特别喜欢可视化部分,让抽象的概念变得直观易懂。