import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import cross_val_score
file_path = '数据挖掘——预测.xlsx'
data = pd.read_excel(file_path)
# 分离特征和目标变量
X = data.drop('target', axis=1)
y = data['target']
#计数、平均值、标准差、最小值、四分位数(25%、50%、75%)和最大值
print(X.describe())#打印X的描述性统计信息
# 检查缺失值
# 打印每列中缺失值的数量
print(X.isnull().sum())
# 检查是否有重复的行
print(X.duplicated().any())
#去掉重复行
X = X.drop_duplicates()
# 检查数据类型
print(X.dtypes)
# 检查数据分布
for col in X.columns:
print(col)
print(X[col].value_counts())
#检查异常值
for col in X.columns:
if X[col].dtype == 'object':
continue
else:
q1 = X[col].quantile(0.25)
q3 = X[col].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - (1.5 * iqr)
upper_bound = q3 + (1.5 * iqr)
outliers = X[(X[col] < lower_bound) | (X[col] > upper_bound)]
print(f"{col} 中的异常值: {outliers}")
corr_matrix = X.corr()#计算X的相关性矩阵
print(corr_matrix)
# 可视化相关性矩阵
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#可视化
plt.figure(figsize=(15, 8))
#annot=False意味着不在单元格中显示数值,颜色映射
sns.heatmap(corr_matrix, annot=False, cmap='coolwarm', xticklabels=X.columns, yticklabels=X.columns)
plt.title('特征相关性矩阵')
plt.xticks(rotation=0) # x轴标签旋转0度
plt.yticks(rotation=0) # y轴标签旋转0度
plt.show()
# 划分训练集和测试集
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}")#打印训练集大小
print(f"测试集大小: {X_test.shape}")#打印测试集大小
print(f"训练集目标变量的分布: {y_train.value_counts()}")#打印训练集目标变量的分布
print(f"测试集目标变量的分布: {y_test.value_counts()}")#打印测试集目标变量的分布
# 特征缩放
scaler = StandardScaler()#创建一个标准化器对象
X_train_scaled = scaler.fit_transform(X_train)#对训练集进行标准化处理
X_test_scaled = scaler.transform(X_test)#对测试集进行标准化处理
# 线性回归模型
linear_model = LinearRegression()#创建一个线性回归模型对象
linear_model.fit(X_train_scaled, y_train)#训练模型
y_train_pred_linear = linear_model.predict(X_train_scaled)#预测训练集
y_test_pred_linear = linear_model.predict(X_test_scaled)#预测测试集
mse_train_linear = mean_squared_error(y_train, y_train_pred_linear)#计算训练集和测试集的均方误差
mse_test_linear = mean_squared_error(y_test, y_test_pred_linear)#计算训练集和测试集的均方误差
print("线性回归模型:")
print(f"训练集上的均方误差(MSE): {mse_train_linear:.4f}")
print(f"测试集上的均方误差(MSE): {mse_test_linear:.4f}\n")
#结果可视化
plt.figure(figsize=(10, 6))
plt.scatter(y_train, y_train_pred_linear, label='训练集')
plt.scatter(y_test, y_test_pred_linear, color='red', label='测试集')
plt.plot([min(y), max(y)], [min(y), max(y)], linestyle='--', color='gray', linewidth=2)
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.legend()
plt.title('线性回归模型')
plt.show()
# 交叉验证线性回归模型
#使用5折交叉验证来评估一个线性模型在缩放后的训练数据集上的性能,并计算其均方误差
scores_linear = cross_val_score(linear_model, X_train_scaled, y_train, cv=5, scoring='neg_mean_squared_error')
#计算线性回归模型的交叉验证均方误差
print("线性回归模型 - CV MSE:", -scores_linear.mean(), "+/-", scores_linear.std(), "\n")
# 随机森林回归模型
# 初始化随机森林回归模型
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
# 训练模型
rf_model.fit(X_train_scaled, y_train)
# 预测
y_train_pred_rf = rf_model.predict(X_train_scaled)
y_test_pred_rf = rf_model.predict(X_test_scaled)
mse_train_rf = mean_squared_error(y_train, y_train_pred_rf)
mse_test_rf = mean_squared_error(y_test, y_test_pred_rf)
print("随机森林回归模型:")
print(f"训练集上的均方误差(MSE): {mse_train_rf:.4f}")
print(f"测试集上的均方误差(MSE): {mse_test_rf:.4f}\n")
#结果可视化
plt.figure(figsize=(10, 6))
plt.scatter(y_train, y_train_pred_rf, label='训练集')
plt.scatter(y_test, y_test_pred_rf, color='red', label='测试集')
plt.plot([min(y), max(y)], [min(y), max(y)], linestyle='--', color='gray', linewidth=2)
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.legend()
plt.title('随机森林回归模型')
plt.show()
# 交叉验证随机森林回归模型
scores_rf = cross_val_score(rf_model, X_train_scaled, y_train, cv=5, scoring='neg_mean_squared_error')
print("随机森林回归模型 - CV MSE:", -scores_rf.mean(), "+/-", scores_rf.std(), "\n")
# 初始化决策树回归模型
dt_model = DecisionTreeRegressor(random_state=42)
# 训练模型
dt_model.fit(X_train_scaled, y_train)
# 使用模型进行预测
y_train_pred_dt = dt_model.predict(X_train_scaled) # 训练集上的预测
y_test_pred_dt = dt_model.predict(X_test_scaled) # 测试集上的预测
# 计算均方误差(MSE)
mse_train_dt = mean_squared_error(y_train, y_train_pred_dt)
mse_test_dt = mean_squared_error(y_test, y_test_pred_dt)
# 输出MSE结果
print("决策树回归模型:")
print(f"训练集上的均方误差(MSE): {mse_train_dt:.4f}")
print(f"测试集上的均方误差(MSE): {mse_test_dt:.4f}\n")
#结果可视化
plt.figure(figsize=(10, 6))
plt.scatter(y_train, y_train_pred_dt, label='训练集')
plt.scatter(y_test, y_test_pred_dt, color='red', label='测试集')
plt.plot([min(y), max(y)], [min(y), max(y)], linestyle='--', color='gray', linewidth=2)
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.legend()
plt.title('决策树回归模型')
plt.show()
# 交叉验证决策树回归模型
scores_dt = cross_val_score(dt_model, X_train_scaled, y_train, cv=5, scoring='neg_mean_squared_error')
print("决策树回归模型 - CV MSE:", -scores_dt.mean(), "+/-", scores_dt.std(), "\n")
# 支持向量回归模型
svr_model = SVR(kernel='rbf', C=100, gamma='scale', epsilon=0.1)
svr_model.fit(X_train_scaled, y_train)
y_train_pred_svr = svr_model.predict(X_train_scaled)
y_test_pred_svr = svr_model.predict(X_test_scaled)
mse_train_svr = mean_squared_error(y_train, y_train_pred_svr)
mse_test_svr = mean_squared_error(y_test, y_test_pred_svr)
print("支持向量回归模型:")
print(f"训练集上的均方误差(MSE): {mse_train_svr:.4f}")
print(f"测试集上的均方误差(MSE): {mse_test_svr:.4f}\n")
#结果可视化
plt.figure(figsize=(10, 6))
plt.scatter(y_train, y_train_pred_svr, label='训练集')
plt.scatter(y_test, y_test_pred_svr, color='red', label='测试集')
plt.plot([min(y), max(y)], [min(y), max(y)], linestyle='--', color='gray', linewidth=2)
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.legend()
plt.title('支持向量回归模型')
plt.show()
# 交叉验证支持向量回归模型
scores_svr = cross_val_score(svr_model, X_train_scaled, y_train, cv=5, scoring='neg_mean_squared_error')
print("支持向量回归模型 - CV MSE:", -scores_svr.mean(), "+/-", scores_svr.std(), "\n")
# X.columns是一�