跳转至

Python机器学习实战

概述

本教程通过实际项目,帮助你掌握Python机器学习的实战技能。

环境准备

安装依赖

pip install numpy pandas scikit-learn matplotlib seaborn
pip install jupyterlab

Jupyter Notebook启动

jupyter lab

实战项目1:房价预测

数据加载与探索

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 加载数据
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
df = pd.DataFrame(housing.data, columns=housing.feature_names)
df['Price'] = housing.target

# 数据探索
print(df.head())
print(df.describe())
print(df.info())

数据可视化

# 相关性热力图
plt.figure(figsize=(10, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.title('Feature Correlation')
plt.show()

# 特征分布
fig, axes = plt.subplots(2, 4, figsize=(16, 8))
for i, col in enumerate(df.columns[:-1]):
    ax = axes[i//4, i%4]
    df[col].hist(ax=ax, bins=30)
    ax.set_title(col)
plt.tight_layout()
plt.show()

特征工程

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 分离特征和目标
X = df.drop('Price', axis=1)
y = df['Price']

# 划分训练集测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

模型训练与评估

from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

# 训练多个模型
models = {
    'Linear': LinearRegression(),
    'Ridge': Ridge(alpha=1.0),
    'Lasso': Lasso(alpha=0.1),
    'RandomForest': RandomForestRegressor(n_estimators=100)
}

results = {}
for name, model in models.items():
    model.fit(X_train_scaled, y_train)
    y_pred = model.predict(X_test_scaled)
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    results[name] = {'MSE': mse, 'R2': r2}
    print(f"{name}: MSE={mse:.4f}, R2={r2:.4f}")

实战项目2:文本分类

数据准备

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

# 加载数据
categories = ['sci.space', 'rec.sport.baseball', 'comp.graphics']
train_data = fetch_20newsgroups(subset='train', categories=categories)
test_data = fetch_20newsgroups(subset='test', categories=categories)

构建分类Pipeline

# 文本分类Pipeline
text_clf = Pipeline([
    ('tfidf', TfidfVectorizer(stop_words='english')),
    ('clf', MultinomialNB())
])

# 训练
text_clf.fit(train_data.data, train_data.target)

# 预测
predictions = text_clf.predict(test_data.data)

# 评估
from sklearn.metrics import accuracy_score, classification_report
print(f"准确率: {accuracy_score(test_data.target, predictions):.2%}")
print(classification_report(test_data.target, predictions, 
                          target_names=train_data.target_names))

模型优化

from sklearn.model_selection import GridSearchCV

# 参数网格
param_grid = {
    'tfidf__max_df': [0.5, 0.75, 1.0],
    'tfidf__min_df': [1, 2, 5],
    'clf__alpha': [0.1, 0.5, 1.0]
}

# 网格搜索
grid_search = GridSearchCV(text_clf, param_grid, cv=5, n_jobs=-1)
grid_search.fit(train_data.data, train_data.target)

print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳分数: {grid_search.best_score_:.2%}")

实战项目3:聚类分析

客户分群

from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# 模拟客户数据
np.random.seed(42)
data = pd.DataFrame({
    'Annual_Income': np.random.randint(20000, 150000, 500),
    'Spending_Score': np.random.randint(1, 100, 500),
    'Age': np.random.randint(18, 70, 500)
})

# 标准化
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)

# K-Means聚类
kmeans = KMeans(n_clusters=4, random_state=42)
data['Cluster'] = kmeans.fit_predict(data_scaled)

# 可视化
plt.figure(figsize=(10, 6))
scatter = plt.scatter(data['Annual_Income'], data['Spending_Score'], 
                     c=data['Cluster'], cmap='viridis')
plt.colorbar(scatter)
plt.xlabel('Annual Income')
plt.ylabel('Spending Score')
plt.title('Customer Segmentation')
plt.show()

肘部法则选择K值

inertias = []
K_range = range(1, 11)

for k in K_range:
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(data_scaled)
    inertias.append(kmeans.inertia_)

plt.figure(figsize=(8, 5))
plt.plot(K_range, inertias, 'bo-')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia')
plt.title('Elbow Method')
plt.show()

实战项目4:异常检测

使用Isolation Forest

from sklearn.ensemble import IsolationForest

# 生成正常数据
np.random.seed(42)
X_normal = np.random.randn(300, 2)

# 添加异常点
X_outliers = np.random.uniform(low=-6, high=6, size=(20, 2))
X = np.vstack([X_normal, X_outliers])

# Isolation Forest
iso_forest = IsolationForest(contamination=0.1, random_state=42)
predictions = iso_forest.fit_predict(X)

# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(X[predictions == 1, 0], X[predictions == 1, 1], 
           c='blue', label='Normal', alpha=0.6)
plt.scatter(X[predictions == -1, 0], X[predictions == -1, 1], 
           c='red', label='Outlier', marker='x', s=100)
plt.legend()
plt.title('Isolation Forest Anomaly Detection')
plt.show()

项目模板

通用机器学习流程

# 1. 导入库
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# 2. 加载数据
df = pd.read_csv('data.csv')

# 3. 数据探索
print(df.head())
print(df.describe())
print(df.isnull().sum())

# 4. 特征工程
X = df.drop('target', axis=1)
y = df['target']

# 5. 划分数据
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 6. 特征缩放
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 7. 训练模型
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train_scaled, y_train)

# 8. 评估模型
y_pred = model.predict(X_test_scaled)
print(f"准确率: {accuracy_score(y_test, y_pred):.2%}")

# 9. 保存模型
import joblib
joblib.dump(model, 'model.pkl')

下一步学习

  1. 自然语言处理 - 深入文本处理
  2. 计算机视觉 - 图像处理