尝试找到一个kaggle或者其他地方的结构化数据集,用之前的内容完成一个全新的项目。
要求:
1. 有数据地址的提供数据地址,没有地址的上传网盘贴出地址即可。
2. 尽可能与他人不同,优先选择本专业相关数据集
3. 探索一下开源数据的网站有哪些?
https://www.kaggle.com/c/bike-sharing-demand
# 先运行之前预处理好的代码
import pandas as pd
import pandas as pd #用于数据处理和分析,可处理表格数据。
import numpy as np #用于数值计算,提供了高效的数组操作。
import matplotlib.pyplot as plt #用于绘制各种类型的图表
import seaborn as sns #基于matplotlib的高级绘图库,能绘制更美观的统计图形。
import warnings
warnings.filterwarnings("ignore")
# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
data = pd.read_csv('data.csv') #读取数据
data = pd.read_csv("data.csv")
data.head()
# 定义离散变量列表
discrete_vars = ['season', 'holiday', 'workingday', 'weather', 'month', 'day', 'weekday', 'hour']
continuous_features = data.select_dtypes(include=['float64', 'int64']).columns.tolist()
# 创建子图布局
fig, axes = plt.subplots(nrows=4, ncols=2, figsize=(15, 20))
axes = axes.flatten()
# 遍历离散变量并绘制箱线图
for i, var in enumerate(discrete_vars):
sns.boxplot(data=data, x=var, y='count', ax=axes[i])
axes[i].set_title(f'Boxplot of count by {var}')
axes[i].set_xlabel(var)
axes[i].set_ylabel('Count')
# 调整子图布局
plt.tight_layout()
plt.show()
corr_df = data[["temp", "atemp", "humidity", "windspeed", "count"]].corr()
mask = np.array(corr_df)
mask[np.tril_indices_from(mask)] = False # mask = np.zeros_like(corr) # mask[np.triu_indices_from(mask)] = True
plt.figure(figsize=(10, 8))
sns.heatmap(corr_df, mask=mask, vmax=0.8, square=True, annot=True)
from sklearn.svm import SVC #支持向量机分类器
from sklearn.neighbors import KNeighborsClassifier #K近邻分类器
from sklearn.linear_model import LogisticRegression #逻辑回归分类器
import xgboost as xgb #XGBoost分类器
import lightgbm as lgb #LightGBM分类器
from sklearn.ensemble import RandomForestClassifier #随机森林分类器
from catboost import CatBoostClassifier #CatBoost分类器
from sklearn.tree import DecisionTreeClassifier #决策树分类器
from sklearn.naive_bayes import GaussianNB #高斯朴素贝叶斯分类器
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标
from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵
import warnings #用于忽略警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息
# XGBoost
xgb_model = xgb.XGBClassifier(random_state=42)
xgb_model.fit(X_train, y_train)
xgb_pred = xgb_model.predict(X_test)
print("\nXGBoost 分类报告:")
print(classification_report(y_test, xgb_pred))
print("XGBoost 混淆矩阵:")
print(confusion_matrix(y_test, xgb_pred))
xgb_accuracy = accuracy_score(y_test, xgb_pred)
xgb_precision = precision_score(y_test, xgb_pred)
xgb_recall = recall_score(y_test, xgb_pred)
xgb_f1 = f1_score(y_test, xgb_pred)
print("XGBoost 模型评估指标:")
print(f"准确率: {xgb_accuracy:.4f}")
print(f"精确率: {xgb_precision:.4f}")
print(f"召回率: {xgb_recall:.4f}")
print(f"F1 值: {xgb_f1:.4f}")
from xgboost import XGBRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error
# 定义参数网格
param_grid = {
'n_estimators': [50, 100, 150], # 树的数量
'max_depth': [3, 6, 9], # 树的最大深度
'learning_rate': [0.01, 0.1, 0.3], # 学习率
'subsample': [0.8, 1.0], # 每棵树使用的样本比例
'colsample_bytree': [0.8, 1.0], # 每棵树使用的特征比例
'reg_alpha': [0, 0.1, 1], # L1 正则化系数
'reg_lambda': [0, 0.1, 1] # L2 正则化系数
}
# 初始化 XGBoost 回归模型
xgb_model = XGBRegressor(random_state=42)
# 初始化 GridSearchCV
grid_search = GridSearchCV(
estimator=xgb_model,
param_grid=param_grid,
cv=5, # 5 折交叉验证
scoring='neg_mean_squared_error', # 使用负均方误差作为评分指标
n_jobs=1 # 使用所有可用的 CPU 核心
)
# 执行网格搜索
grid_search.fit(X_train, y_train)
# 输出最优参数
print(f"最优参数: {grid_search.best_params_}")
# 使用最优参数训练模型
best_xgb_model = grid_search.best_estimator_
best_xgb_model.fit(X_train, y_train)
# 预测
y_test_pred = best_xgb_model.predict(X_test)
# 计算 RMSE
test_rmse = mean_squared_error(y_test, y_test_pred, squared=False)
# 输出结果
print(f"优化后 XGBoost 模型测试集 RMSE: {test_rmse:.4f}")
import shap
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
import xgboost as xgb
from xgboost import XGBRegressor
from sklearn.metrics import mean_squared_error
# 初始化 XGBoost 回归模型(使用默认参数)
xgb_model = XGBRegressor(rlearning_rate=0.1, n_estimators=200, max_depth=6, subsample=0.8, colsample_bytree=0.8, random_state=42)
# 训练模型
xgb_model.fit(X_train, y_train)
# 使用 SHAP 进行解释
# 创建一个 SHAP 解释器
explainer = shap.Explainer(xgb_model)
# 计算 SHAP 值
shap_values = explainer.shap_values(X_train, check_additivity=False)
# SHAP 汇总图设置为条形图,可以显示特征重要性
shap.summary_plot(shap_values, X_train, plot_type="bar")