Python简易建模案例实操
这里为您提供一个完整的建模实操案例,从数据准备到模型评估,逐步演示Python建模的完整流程。
案例:波士顿房价预测(线性回归模型)
导入必要的库
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 设置中文显示 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
加载数据与初步探索
# 加载波士顿房价数据集
boston = load_boston()
data = pd.DataFrame(boston.data, columns=boston.feature_names)
data['PRICE'] = boston.target
print("数据集形状:", data.shape)
print("\n前5行数据:")
print(data.head())
print("\n数据基本信息:")
print(data.info())
print("\n描述性统计:")
print(data.describe())
# 检查缺失值
print("\n缺失值情况:")
print(data.isnull().sum())
数据探索性分析(EDA)
# 房价分布直方图
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
sns.histplot(data['PRICE'], bins=30, kde=True)'房价分布')
plt.xlabel('价格(千美元)')
plt.subplot(1, 2, 2)
sns.boxplot(data['PRICE'])'房价箱线图')
plt.tight_layout()
plt.show()
# 相关性热力图
plt.figure(figsize=(12, 10))
correlation = data.corr()
sns.heatmap(correlation, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)'特征相关性热力图')
plt.show()
# 与房价相关性最高的前5个特征
corr_with_price = correlation['PRICE'].sort_values(ascending=False)
print("\n与房价相关性最高的特征:")
print(corr_with_price)
数据预处理
# 分离特征和目标变量
X = data.drop('PRICE', axis=1)
y = data['PRICE']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
print(f"训练集大小: {X_train.shape[0]} 样本")
print(f"测试集大小: {X_test.shape[0]} 样本")
# 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 转换为DataFrame方便查看
X_train_scaled = pd.DataFrame(X_train_scaled, columns=X.columns)
X_test_scaled = pd.DataFrame(X_test_scaled, columns=X.columns)
print("\n标准化后的训练集统计:")
print(X_train_scaled.describe().round(2))
模型训练
# 创建并训练线性回归模型
model = LinearRegression()
model.fit(X_train_scaled, y_train)
# 查看模型参数
print("模型截距:", round(model.intercept_, 4))
print("\n模型系数:")
coefficients = pd.DataFrame({
'特征': X.columns,
'系数': model.coef_
})
print(coefficients.sort_values('系数', ascending=False))
模型评估
# 训练集和测试集的预测
y_train_pred = model.predict(X_train_scaled)
y_test_pred = model.predict(X_test_scaled)
# 计算评估指标
train_mse = mean_squared_error(y_train, y_train_pred)
test_mse = mean_squared_error(y_test, y_test_pred)
train_r2 = r2_score(y_train, y_train_pred)
test_r2 = r2_score(y_test, y_test_pred)
print("模型评估结果:")
print(f"训练集 MSE: {train_mse:.4f}")
print(f"测试集 MSE: {test_mse:.4f}")
print(f"训练集 R²: {train_r2:.4f}")
print(f"测试集 R²: {test_r2:.4f}")
# 残差分析
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.scatter(y_test_pred, y_test_pred - y_test, alpha=0.6)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('预测值')
plt.ylabel('残差')'残差分布图')
plt.subplot(1, 2, 2)
residuals = y_test - y_test_pred
sns.histplot(residuals, bins=20, kde=True)
plt.xlabel('残差')
plt.ylabel('频数')'残差分布直方图')
plt.tight_layout()
plt.show()
结果可视化
plt.figure(figsize=(8, 6))
plt.scatter(y_test, y_test_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('预测房价')f'实际房价 vs 预测房价 (R² = {test_r2:.3f})')
plt.tight_layout()
plt.show()
预测示例
# 创建一个新样本进行预测
new_house = pd.DataFrame({
'CRIM': [0.00632], # 犯罪率
'ZN': [18.0], # 住宅用地比例
'INDUS': [2.31], # 非零售商业用地比例
'CHAS': [0.0], # 是否靠近查尔斯河
'NOX': [0.538], # 一氧化氮浓度
'RM': [6.575], # 房间数
'AGE': [65.2], # 老房子比例
'DIS': [4.0900], # 到就业中心距离
'RAD': [1.0], # 高速可达性
'TAX': [296.0], # 税率
'PTRATIO': [15.3], # 学生教师比例
'B': [396.9], # 黑人比例
'LSTAT': [4.98] # 低收入人口比例
})
# 对样本进行标准化
new_house_scaled = scaler.transform(new_house)
# 预测房价
predicted_price = model.predict(new_house_scaled)
print(f"预测的房价: ${predicted_price[0]*1000:.2f}")
完整的模型封装函数
def train_boston_model(data_path=None):
"""
完整的波士顿房价预测模型训练函数
"""
# 加载数据
if data_path:
data = pd.read_csv(data_path)
else:
boston = load_boston()
data = pd.DataFrame(boston.data, columns=boston.feature_names)
data['PRICE'] = boston.target
# 数据预处理
X = data.drop('PRICE', axis=1)
y = data['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)
# 训练模型
model = LinearRegression()
model.fit(X_train_scaled, y_train)
# 评估
y_pred = model.predict(X_test_scaled)
test_mse = mean_squared_error(y_test, y_pred)
test_r2 = r2_score(y_test, y_pred)
return model, scaler, test_mse, test_r2
# 使用封装的函数
model, scaler, mse, r2 = train_boston_model()
print(f"模型MSE: {mse:.4f}, R²: {r2:.4f}")
延伸案例:分类任务(鸢尾花分类)
# 导入必要库
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix
# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
# 划分数据
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 训练SVM分类器
svm_model = SVC(kernel='rbf', random_state=42)
svm_model.fit(X_train, y_train)
# 预测
y_pred = svm_model.predict(X_test)
# 评估
print("分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))
- 数据探索:先理解数据分布和相关性
- 特征工程:标准化对线性模型非常重要
- 模型选择:根据问题类型选择合适的模型
- 交叉验证:使用交叉验证评估模型稳定性
- 模型优化:尝试不同参数,使用网格搜索
这个案例覆盖了建模的主要步骤,您可以根据实际数据调整相应的代码,需要我详细讲解某个步骤吗?
标签: 案例实操