Python简易建模案例实操?

wen python案例 1

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))
  1. 数据探索:先理解数据分布和相关性
  2. 特征工程:标准化对线性模型非常重要
  3. 模型选择:根据问题类型选择合适的模型
  4. 交叉验证:使用交叉验证评估模型稳定性
  5. 模型优化:尝试不同参数,使用网格搜索

这个案例覆盖了建模的主要步骤,您可以根据实际数据调整相应的代码,需要我详细讲解某个步骤吗?

标签: 案例实操

抱歉,评论功能暂时关闭!