Python打卡 DAY 15

发布于:2025-05-07 ⋅ 阅读:(26) ⋅ 点赞:(0)
尝试找到一个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")

@浙大疏锦行


网站公告

今日签到

点亮在社区的每一天
去签到