Python机器学习实战¶
概述¶
本教程通过实际项目,帮助你掌握Python机器学习的实战技能。
环境准备¶
安装依赖¶
Jupyter Notebook启动¶
实战项目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')