【实验一】Python 回归与分类模型
·
实验目标
本实验演示多种回归模型(OLS、Ridge、Lasso、ElasticNet、多项式回归)和分类模型(逻辑回归)在房价数据集中的应用,通过对比模型性能指标评估不同算法的拟合效果与预测能力。
实验环境
- Python 3.8
- 核心库:pandas、numpy、matplotlib/seaborn、scikit-learn
- 开发工具:Jupyter Notebook
数据加载与预处理
加载房价数据集(train.csv),包含1460条样本和81个特征。选取4个关键数值特征用于建模,目标变量为房屋售价(SalePrice)。数据分割为训练集和测试集(80:20比例),并进行标准化处理。
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
data = pd.read_csv("train.csv")
features = ['OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF']
X = data[features]
y = data['SalePrice']
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)
模型构建与评估
普通最小二乘法(OLS)
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
ols = LinearRegression()
ols.fit(X_train_scaled, y_train)
y_pred_ols = ols.predict(X_test_scaled)
print("MSE:", mean_squared_error(y_test, y_pred_ols))
print("R2:", r2_score(y_test, y_pred_ols))
岭回归(Ridge)
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=50)
ridge.fit(X_train_scaled, y_train)
y_pred_ridge = ridge.predict(X_test_scaled)
print("MSE:", mean_squared_error(y_test, y_pred_ridge))
print("R2:", r2_score(y_test, y_pred_ridge))
拉索回归(Lasso)
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=100)
lasso.fit(X_train_scaled, y_train)
y_pred_lasso = lasso.predict(X_test_scaled)
print("MSE:", mean_squared_error(y_test, y_pred_lasso))
print("R2:", r2_score(y_test, y_pred_lasso))
print("Number of zero coefficients:", np.sum(lasso.coef_ == 0))
弹性网络(ElasticNet)
from sklearn.linear_model import ElasticNet
enet = ElasticNet(alpha=50, l1_ratio=0.5)
enet.fit(X_train_scaled, y_train)
y_pred_enet = enet.predict(X_test_scaled)
print("MSE:", mean_squared_error(y_test, y_pred_enet))
print("R2:", r2_score(y_test, y_pred_enet))
多项式回归
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly_train = poly.fit_transform(X_train_scaled)
X_poly_test = poly.transform(X_test_scaled)
ols_poly = LinearRegression()
ols_poly.fit(X_poly_train, y_train)
y_pred_poly = ols_poly.predict(X_poly_test)
print("MSE:", mean_squared_error(y_test, y_pred_poly))
print("R2:", r2_score(y_test, y_pred_poly))
逻辑回归(分类任务)
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, roc_auc_score, roc_curve
import matplotlib.pyplot as plt
median_price = data['SalePrice'].median()
y_class = (y > median_price).astype(int)
X_train_c, X_test_c, y_train_c, y_test_c = train_test_split(X, y_class, test_size=0.2, random_state=42)
X_train_c_scaled = scaler.fit_transform(X_train_c)
X_test_c_scaled = scaler.transform(X_test_c)
log_reg = LogisticRegression()
log_reg.fit(X_train_c_scaled, y_train_c)
y_pred_c = log_reg.predict(X_test_c_scaled)
y_pred_prob = log_reg.predict_proba(X_test_c_scaled)[:, 1]
print("Accuracy:", accuracy_score(y_test_c, y_pred_c))
print("AUC:", roc_auc_score(y_test_c, y_pred_prob))
fpr, tpr, _ = roc_curve(y_test_c, y_pred_prob)
plt.plot(fpr, tpr)
plt.plot([0, 1], [0, 1], '--', color='gray')
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.show()
实验结果分析
- 回归模型中,多项式回归表现最佳(R2=0.86),其次是OLS(R2=0.79)
- 正则化模型中,Lasso表现优于Ridge和ElasticNet
- 逻辑回归在分类任务中取得良好效果(AUC>0.85)
- 可视化分析可通过绘制预测值与真实值散点图、残差图、ROC曲线等进一步验证模型性能
更多推荐
所有评论(0)