Python机器学习算法实战:从线性回归到深度学习模型构建

时光静好
时光静好 2026-03-01T19:16:10+08:00
0 0 0

引言

在人工智能和数据科学快速发展的今天,Python已成为机器学习领域最主流的编程语言之一。凭借其简洁的语法、丰富的生态系统和强大的科学计算库,Python为开发者提供了构建从简单线性回归到复杂深度学习模型的完整工具链。本文将系统介绍Python在机器学习领域的应用实践,涵盖scikit-learn、TensorFlow、PyTorch等主流库的使用方法,从基础算法到复杂模型的构建过程,为AI开发者提供完整的算法实现指南。

Python机器学习生态系统概览

核心库介绍

Python机器学习生态系统包含多个核心库,每个库都有其特定的用途和优势:

scikit-learn:作为Python机器学习的基石,scikit-learn提供了大量经典机器学习算法的实现,包括分类、回归、聚类、降维等任务。其API设计简洁统一,非常适合快速原型开发和实验。

TensorFlow:Google开发的开源机器学习框架,特别适合构建深度学习模型。TensorFlow 2.0引入了更直观的Eager Execution模式,使得模型构建更加灵活。

PyTorch:Facebook开发的深度学习框架,以其动态计算图和易于调试的特性而闻名。PyTorch在学术界和工业界都得到了广泛应用。

NumPy:数值计算的基础库,为其他机器学习库提供底层支持。

Pandas:数据处理和分析的核心库,提供高效的数据结构和数据分析工具。

环境搭建建议

在开始机器学习开发之前,建议搭建一个完整的开发环境:

# 创建虚拟环境
python -m venv ml_env
source ml_env/bin/activate  # Linux/Mac
# ml_env\Scripts\activate  # Windows

# 安装核心库
pip install numpy pandas scikit-learn matplotlib seaborn jupyter
pip install tensorflow pytorch torchvision

线性回归算法实现

算法原理

线性回归是机器学习中最基础的算法之一,其目标是找到一条直线(在多元情况下是超平面)来最佳拟合数据点。线性回归假设特征与目标变量之间存在线性关系。

代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler

# 生成示例数据
np.random.seed(42)
X = np.random.randn(100, 1)
y = 2 * X.flatten() + 1 + np.random.randn(100) * 0.1

# 数据分割
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)

# 评估模型
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差: {mse:.4f}")
print(f"R²分数: {r2:.4f}")
print(f"斜率: {model.coef_[0]:.4f}")
print(f"截距: {model.intercept_:.4f}")

# 可视化结果
plt.figure(figsize=(10, 6))
plt.scatter(X_test, y_test, alpha=0.7, label='真实值')
plt.plot(X_test, y_pred, color='red', linewidth=2, label='预测值')
plt.xlabel('X')
plt.ylabel('y')
plt.title('线性回归结果')
plt.legend()
plt.grid(True)
plt.show()

高级线性回归技术

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.linear_model import Ridge, Lasso

# 多项式回归
poly_model = Pipeline([
    ('poly', PolynomialFeatures(degree=3)),
    ('scaler', StandardScaler()),
    ('linear', LinearRegression())
])

# 岭回归(L2正则化)
ridge_model = Ridge(alpha=1.0)

# Lasso回归(L1正则化)
lasso_model = Lasso(alpha=0.1)

# 模型比较
models = {
    'Linear': LinearRegression(),
    'Ridge': Ridge(alpha=1.0),
    'Lasso': Lasso(alpha=0.1),
    'Polynomial': poly_model
}

for name, model in models.items():
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)
    print(f"{name} 模型 R² 分数: {score:.4f}")

逻辑回归与分类算法

逻辑回归原理

逻辑回归虽然名字中有"回归",但实际上是一种分类算法。它使用sigmoid函数将线性回归的输出映射到[0,1]区间,表示概率值。

from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import seaborn as sns

# 生成分类数据
X_class, y_class = make_classification(
    n_samples=1000,
    n_features=2,
    n_redundant=0,
    n_informative=2,
    n_clusters_per_class=1,
    random_state=42
)

# 数据分割
X_train_class, X_test_class, y_train_class, y_test_class = train_test_split(
    X_class, y_class, test_size=0.2, random_state=42
)

# 创建逻辑回归模型
log_reg = LogisticRegression(random_state=42)
log_reg.fit(X_train_class, y_train_class)

# 预测和评估
y_pred_class = log_reg.predict(X_test_class)
accuracy = accuracy_score(y_test_class, y_pred_class)

print(f"准确率: {accuracy:.4f}")
print("\n分类报告:")
print(classification_report(y_test_class, y_pred_class))

# 混淆矩阵可视化
cm = confusion_matrix(y_test_class, y_pred_class)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('混淆矩阵')
plt.ylabel('真实值')
plt.xlabel('预测值')
plt.show()

多分类算法

from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

# 使用鸢尾花数据集进行多分类
from sklearn.datasets import load_iris

iris = load_iris()
X_iris, y_iris = iris.data, iris.target

# 数据分割
X_train_iris, X_test_iris, y_train_iris, y_test_iris = train_test_split(
    X_iris, y_iris, test_size=0.2, random_state=42
)

# 多种分类器比较
classifiers = {
    'Logistic Regression': LogisticRegression(random_state=42),
    'Random Forest': RandomForestClassifier(n_estimators=100, random_state=42),
    'SVM': SVC(random_state=42),
    'KNN': KNeighborsClassifier(n_neighbors=5)
}

results = {}
for name, clf in classifiers.items():
    clf.fit(X_train_iris, y_train_iris)
    y_pred = clf.predict(X_test_iris)
    accuracy = accuracy_score(y_test_iris, y_pred)
    results[name] = accuracy
    print(f"{name} 准确率: {accuracy:.4f}")

# 可视化结果
plt.figure(figsize=(10, 6))
names = list(results.keys())
accuracies = list(results.values())
bars = plt.bar(names, accuracies, color=['blue', 'green', 'red', 'orange'])
plt.title('不同分类算法准确率比较')
plt.ylabel('准确率')
plt.xticks(rotation=45)
for bar, acc in zip(bars, accuracies):
    plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01, 
             f'{acc:.3f}', ha='center', va='bottom')
plt.tight_layout()
plt.show()

决策树与集成学习

决策树算法

决策树是一种基于树形结构的机器学习算法,通过递归地分割数据来构建决策规则。

from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.ensemble import GradientBoostingClassifier

# 决策树分类
dt_classifier = DecisionTreeClassifier(
    max_depth=5,
    min_samples_split=20,
    min_samples_leaf=5,
    random_state=42
)

dt_classifier.fit(X_train_class, y_train_class)
dt_pred = dt_classifier.predict(X_test_class)
dt_accuracy = accuracy_score(y_test_class, dt_pred)

print(f"决策树准确率: {dt_accuracy:.4f}")

# 可视化决策树
plt.figure(figsize=(15, 10))
plot_tree(dt_classifier, 
          feature_names=['feature_1', 'feature_2'],
          class_names=['Class 0', 'Class 1'],
          filled=True,
          rounded=True)
plt.title('决策树可视化')
plt.show()

集成学习方法

from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.model_selection import cross_val_score

# 随机森林
rf_classifier = RandomForestClassifier(
    n_estimators=100,
    max_depth=5,
    random_state=42
)

# AdaBoost
ada_classifier = AdaBoostClassifier(
    n_estimators=50,
    random_state=42
)

# 梯度提升
gb_classifier = GradientBoostingClassifier(
    n_estimators=100,
    learning_rate=0.1,
    max_depth=3,
    random_state=42
)

# 模型比较
ensemble_models = {
    'Random Forest': rf_classifier,
    'AdaBoost': ada_classifier,
    'Gradient Boosting': gb_classifier
}

for name, model in ensemble_models.items():
    # 交叉验证
    cv_scores = cross_val_score(model, X_train_class, y_train_class, cv=5)
    print(f"{name} 交叉验证平均分数: {cv_scores.mean():.4f} (+/- {cv_scores.std() * 2:.4f})")
    
    # 训练和测试
    model.fit(X_train_class, y_train_class)
    test_score = model.score(X_test_class, y_test_class)
    print(f"{name} 测试集准确率: {test_score:.4f}")

聚类算法实现

K-Means聚类

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 生成聚类数据
X_cluster, y_cluster = make_blobs(
    n_samples=300,
    centers=4,
    cluster_std=0.60,
    random_state=42
)

# K-Means聚类
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
y_pred_cluster = kmeans.fit_predict(X_cluster)

# 可视化聚类结果
plt.figure(figsize=(12, 5))

# 原始数据
plt.subplot(1, 2, 1)
plt.scatter(X_cluster[:, 0], X_cluster[:, 1], c=y_cluster, cmap='viridis')
plt.title('原始数据')
plt.xlabel('特征1')
plt.ylabel('特征2')

# 聚类结果
plt.subplot(1, 2, 2)
plt.scatter(X_cluster[:, 0], X_cluster[:, 1], c=y_pred_cluster, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], 
           c='red', marker='x', s=200, linewidths=3, label='聚类中心')
plt.title('K-Means聚类结果')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.legend()

plt.tight_layout()
plt.show()

# 评估聚类质量
from sklearn.metrics import silhouette_score
silhouette_avg = silhouette_score(X_cluster, y_pred_cluster)
print(f"轮廓系数: {silhouette_avg:.4f}")

层次聚类

from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
from scipy.spatial.distance import pdist

# 层次聚类
hierarchical = AgglomerativeClustering(n_clusters=4, linkage='ward')
y_hierarchical = hierarchical.fit_predict(X_cluster)

# 绘制树状图
plt.figure(figsize=(10, 7))
linkage_matrix = linkage(X_cluster, method='ward')
dendrogram(linkage_matrix)
plt.title('层次聚类树状图')
plt.xlabel('样本索引')
plt.ylabel('距离')
plt.show()

# 聚类评估
silhouette_hierarchical = silhouette_score(X_cluster, y_hierarchical)
print(f"层次聚类轮廓系数: {silhouette_hierarchical:.4f}")

深度学习模型构建

TensorFlow基础实现

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np

# 准备数据
(X_train_tf, y_train_tf), (X_test_tf, y_test_tf) = keras.datasets.mnist.load_data()

# 数据预处理
X_train_tf = X_train_tf.reshape(60000, 784).astype('float32') / 255
X_test_tf = X_test_tf.reshape(10000, 784).astype('float32') / 255

# 创建简单的神经网络模型
model_tf = keras.Sequential([
    layers.Dense(128, activation='relu', input_shape=(784,)),
    layers.Dropout(0.2),
    layers.Dense(64, activation='relu'),
    layers.Dropout(0.2),
    layers.Dense(10, activation='softmax')
])

# 编译模型
model_tf.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# 训练模型
history = model_tf.fit(
    X_train_tf, y_train_tf,
    epochs=10,
    batch_size=32,
    validation_split=0.2,
    verbose=1
)

# 评估模型
test_loss, test_accuracy = model_tf.evaluate(X_test_tf, y_test_tf, verbose=0)
print(f"测试准确率: {test_accuracy:.4f}")

PyTorch深度学习实现

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset

# 定义神经网络模型
class SimpleNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_classes):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.dropout = nn.Dropout(0.2)
        self.fc2 = nn.Linear(hidden_size, num_classes)
        
    def forward(self, x):
        x = self.fc1(x)
        x = self.relu(x)
        x = self.dropout(x)
        x = self.fc2(x)
        return x

# 准备PyTorch数据
X_train_torch = torch.FloatTensor(X_train_tf)
y_train_torch = torch.LongTensor(y_train_tf)
X_test_torch = torch.FloatTensor(X_test_tf)
y_test_torch = torch.LongTensor(y_test_tf)

# 创建数据加载器
train_dataset = TensorDataset(X_train_torch, y_train_torch)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

# 初始化模型
input_size = 784
hidden_size = 128
num_classes = 10

model_pytorch = SimpleNN(input_size, hidden_size, num_classes)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model_pytorch.parameters(), lr=0.001)

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    model_pytorch.train()
    running_loss = 0.0
    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model_pytorch(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
    
    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')

# 测试模型
model_pytorch.eval()
with torch.no_grad():
    test_outputs = model_pytorch(X_test_torch)
    _, predicted = torch.max(test_outputs, 1)
    accuracy = (predicted == y_test_torch).sum().item() / len(y_test_torch)
    print(f'PyTorch模型测试准确率: {accuracy:.4f}')

卷积神经网络实现

# CNN模型实现
class CNNModel(nn.Module):
    def __init__(self, num_classes):
        super(CNNModel, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(64 * 7 * 7, 128)
        self.fc2 = nn.Linear(128, num_classes)
        self.dropout = nn.Dropout(0.5)
        self.relu = nn.ReLU()
        
    def forward(self, x):
        x = self.pool(self.relu(self.conv1(x)))
        x = self.pool(self.relu(self.conv2(x)))
        x = x.view(-1, 64 * 7 * 7)
        x = self.relu(self.fc1(x))
        x = self.dropout(x)
        x = self.fc2(x)
        return x

# 重塑数据为2D格式
X_train_cnn = X_train_tf.reshape(60000, 1, 28, 28)
X_test_cnn = X_test_tf.reshape(10000, 1, 28, 28)

# 创建CNN模型
cnn_model = CNNModel(10)
criterion_cnn = nn.CrossEntropyLoss()
optimizer_cnn = optim.Adam(cnn_model.parameters(), lr=0.001)

# 转换为Tensor
X_train_cnn_torch = torch.FloatTensor(X_train_cnn)
y_train_cnn_torch = torch.LongTensor(y_train_tf)
X_test_cnn_torch = torch.FloatTensor(X_test_cnn)
y_test_cnn_torch = torch.LongTensor(y_test_tf)

# 训练CNN
for epoch in range(5):
    cnn_model.train()
    optimizer_cnn.zero_grad()
    outputs = cnn_model(X_train_cnn_torch)
    loss = criterion_cnn(outputs, y_train_cnn_torch)
    loss.backward()
    optimizer_cnn.step()
    
    # 评估
    cnn_model.eval()
    with torch.no_grad():
        test_outputs = cnn_model(X_test_cnn_torch)
        _, predicted = torch.max(test_outputs, 1)
        accuracy = (predicted == y_test_cnn_torch).sum().item() / len(y_test_cnn_torch)
        print(f'CNN Epoch [{epoch+1}/5], 测试准确率: {accuracy:.4f}')

模型评估与优化

交叉验证技术

from sklearn.model_selection import cross_val_score, GridSearchCV, StratifiedKFold
from sklearn.metrics import make_scorer

# 交叉验证实现
def cross_validation_example():
    # 使用随机森林进行交叉验证
    rf = RandomForestClassifier(random_state=42)
    
    # 5折交叉验证
    cv_scores = cross_val_score(rf, X_train_class, y_train_class, cv=5, scoring='accuracy')
    print(f"交叉验证分数: {cv_scores}")
    print(f"平均分数: {cv_scores.mean():.4f} (+/- {cv_scores.std() * 2:.4f})")
    
    # 分层交叉验证
    skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
    cv_scores_stratified = cross_val_score(rf, X_train_class, y_train_class, cv=skf, scoring='accuracy')
    print(f"分层交叉验证平均分数: {cv_scores_stratified.mean():.4f}")

cross_validation_example()

超参数调优

# 网格搜索超参数调优
def hyperparameter_tuning():
    # 随机森林参数网格
    param_grid = {
        'n_estimators': [50, 100, 200],
        'max_depth': [3, 5, 7, None],
        'min_samples_split': [2, 5, 10],
        'min_samples_leaf': [1, 2, 4]
    }
    
    # 网格搜索
    rf = RandomForestClassifier(random_state=42)
    grid_search = GridSearchCV(
        rf, 
        param_grid, 
        cv=5, 
        scoring='accuracy',
        n_jobs=-1,
        verbose=1
    )
    
    grid_search.fit(X_train_class, y_train_class)
    
    print(f"最佳参数: {grid_search.best_params_}")
    print(f"最佳交叉验证分数: {grid_search.best_score_:.4f}")
    
    return grid_search.best_estimator_

best_model = hyperparameter_tuning()

学习曲线分析

from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt

def plot_learning_curve(estimator, X, y, title="Learning Curve"):
    train_sizes, train_scores, val_scores = learning_curve(
        estimator, X, y, cv=5, n_jobs=-1, 
        train_sizes=np.linspace(0.1, 1.0, 10),
        scoring='accuracy'
    )
    
    train_mean = np.mean(train_scores, axis=1)
    train_std = np.std(train_scores, axis=1)
    val_mean = np.mean(val_scores, axis=1)
    val_std = np.std(val_scores, axis=1)
    
    plt.figure(figsize=(10, 6))
    plt.plot(train_sizes, train_mean, 'o-', color='blue', label='训练分数')
    plt.fill_between(train_sizes, train_mean - train_std, train_mean + train_std, alpha=0.1, color='blue')
    
    plt.plot(train_sizes, val_mean, 'o-', color='red', label='验证分数')
    plt.fill_between(train_sizes, val_mean - val_std, val_mean + val_std, alpha=0.1, color='red')
    
    plt.xlabel('训练样本数')
    plt.ylabel('准确率')
    plt.title(title)
    plt.legend()
    plt.grid(True)
    plt.show()

# 绘制学习曲线
plot_learning_curve(RandomForestClassifier(n_estimators=100, random_state=42), 
                   X_train_class, y_train_class, "随机森林学习曲线")

实际项目应用案例

回归问题实战

# 房价预测项目示例
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler

# 加载数据
housing = fetch_california_housing()
X_housing, y_housing = housing.data, housing.target

# 数据预处理
scaler = StandardScaler()
X_housing_scaled = scaler.fit_transform(X_housing)

# 数据分割
X_train_h, X_test_h, y_train_h, y_test_h = train_test_split(
    X_housing_scaled, y_housing, test_size=0.2, random_state=42
)

# 构建回归模型
regression_models = {
    'Linear Regression': LinearRegression(),
    'Random Forest': RandomForestRegressor(n_estimators=100, random_state=42),
    'Gradient Boosting': GradientBoostingRegressor(n_estimators=100, random_state=42)
}

# 模型训练和评估
results_housing = {}
for name, model in regression_models.items():
    model.fit(X_train_h, y_train_h)
    y_pred_h = model.predict(X_test_h)
    mse_h = mean_squared_error(y_test_h, y_pred_h)
    r2_h = r2_score(y_test_h, y_pred_h)
    results_housing[name] = {'MSE': mse_h, 'R2': r2_h}
    print(f"{name}: MSE={mse_h:.4f}, R2={r2_h:.4f}")

# 可视化结果
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for i, (name, results) in enumerate(results_housing.items()):
    axes[i].scatter(y_test_h, model.predict(X_test_h), alpha=0.5)
    axes[i].plot([y_test_h.min(), y_test_h.max()], [y_test_h.min(), y_test_h.max()], 'r--', lw=2)
    axes[i].set_xlabel('真实值')
    axes[i].set_ylabel('预测值')
    axes[i].set_title(f'{name}\nR²={results["R2"]:.4f}')
    axes[i].grid(True)

plt.tight_layout()
plt.show()

分类问题实战

# 银行客户流失预测
from sklearn.datasets import make_classification
from sklearn.metrics import roc_auc_score, roc_curve

# 生成客户流失数据
X_customer, y_customer = make_classification(
    n_samples=10000,
    n_features=10,
    n_informative=5,
    n_redundant=2,
    n_clusters_per_class=1,
    random_state=42
)

# 数据分割
X_train_c, X_test_c, y_train_c, y_test_c = train_test_split(
    X_customer, y_customer, test_size=0.2, random_state=42
)

# 模型比较
customer_models = {
    'Logistic Regression': LogisticRegression(random_state=42),
    'Random Forest': RandomForestClassifier(n_estimators=100, random_state=42),
    'XGBoost': XGBClassifier(random_state=42)
}

# 训练和评估
customer_results = {}
for name, model in customer_models.items():
    model.fit(X_train_c, y_train_c)
    y_pred_c = model.predict(X_test_c)
    y_pred_proba_c = model.predict_proba(X_test_c)[:, 1]
    
    accuracy = accuracy_score(y_test_c, y_pred_c)
    auc = roc_auc_score(y_test_c, y_pred_proba_c)
    
    customer_results[name] = {'Accuracy': accuracy, 'AUC': auc}
    print(f"{name}: 准确率={accuracy:.4f}, AUC={auc:.4f}")

# ROC曲线
plt.figure(figsize=(10, 8))
for name, model in customer_models.items():
    y_pred_proba = model.predict_proba(X_test_c)[:, 1]
    fpr, tpr, _ = roc_curve(y_test_c, y_pred_proba
相关推荐
广告位招租

相似文章

    评论 (0)

    0/2000