Python打卡DAY31

今日的示例代码包含2个部分

  1. notebook文件夹内的ipynb文件,介绍下今天的思路
  2. 项目文件夹中其他部分:拆分后的信贷项目,学习下如何拆分的,未来你看到的很多大项目都是类似的拆分方法

知识点回顾

  1. 规范的文件命名
  2. 规范的文件夹管理
  3. 机器学习项目的拆分
  4. 编码格式和类型注解

作业:尝试针对之前的心脏病项目ipynb,将他按照今天的示例项目整理成规范的形式,思考下哪些部分可以未来复用。

src/data/data_loader.py

import pandas as pd
from sklearn.model_selection import train_test_split

def load_and_split_data(file_path, target_column, test_size=0.2, random_state=42):
    """
    加载数据并划分训练集和测试集
    """
    data = pd.read_csv(file_path)
    X = data.drop(target_column, axis=1)
    y = data[target_column]
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)
    return X_train, X_test, y_train, y_test
src/models/random_forest.py
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
import time

def train_random_forest(X_train, y_train, X_test, y_test, random_state=42):
    """
    训练随机森林模型并评估性能
    """
    start_time = time.time()
    model = RandomForestClassifier(random_state=random_state)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    end_time = time.time()

    print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
    print("\n默认随机森林 在测试集上的分类报告:")
    print(classification_report(y_test, y_pred))
    print("默认随机森林 在测试集上的混淆矩阵:")
    print(confusion_matrix(y_test, y_pred))
    return model

src/utils/visualization.py

import shap
import matplotlib.pyplot as plt

def plot_shap_values(model, X_test):
    """
    绘制SHAP值的条形图、蜂巢图和依赖图
    """
    explainer = shap.TreeExplainer(model)
    shap_values = explainer.shap_values(X_test)

    print("shap_values[0] shape:", shap_values[0].shape)
    print("X_test shape:", X_test.shape)

    # SHAP特征重要性条形图
    print("--- 1. SHAP 特征重要性条形图 ---")
    shap.summary_plot(shap_values[0], X_test, plot_type="bar", show=False)
    plt.title("SHAP Feature Importance (Bar Plot)")
    plt.show()

    # SHAP特征重要性蜂巢图
    print("--- 2. SHAP 特征重要性蜂巢图 ---")
    shap.summary_plot(shap_values[0], X_test, plot_type="violin", show=False, max_display=10)
    plt.title("SHAP Feature Importance (Violin Plot)")
    plt.show()

    # SHAP特征重要性依赖图
    print("--- 3. SHAP 特征重要性依赖图 ---")
    shap.dependence_plot('Years in current job', shap_values[0], X_test, show=False)
    plt.title("SHAP Feature Importance (dependence plot)")
    plt.show()
src/main.py
from src.data.data_loader import load_and_split_data
from src.models.random_forest import train_random_forest
from src.utils.visualization import plot_shap_values

if __name__ == "__main__":
    # 数据加载与划分
    file_path = "data/raw/heart.csv"
    target_column = "target"
    X_train, X_test, y_train, y_test = load_and_split_data(file_path, target_column)

    # 模型训练与评估
    model = train_random_forest(X_train, y_train, X_test, y_test)

    # SHAP值可视化
    plot_shap_values(model, X_test)

@浙大疏锦行

Python中实现打卡兑换礼物的功能,通常会涉及到以下几个步骤: 1. **数据结构设计**:创建一个数据库或数据结构来存储用户的打卡记录,比如字典或列表,其中每个元素包含用户ID、日期等信息。 ```python users_gifts = {} # 使用字典,key为用户ID,value为打卡记录 ``` 2. **添加打卡功能**:编写函数,当用户调用时,检查用户是否存在并更新打卡次数。例如,可以使用`datetime`库来记录每日打卡时间。 ```python import datetime def check_in(user_id): today = datetime.datetime.now().strftime("%Y-%m-%d") if user_id not in users_gifts: users_gifts[user_id] = {today: 1} else: if today not in users_gifts[user_id]: users_gifts[user_id][today] = 1 else: users_gifts[user_id][today] += 1 ``` 3. **条件判断与兑换规则**:设定一个规则,如连续7天打卡即可兑换一份礼物。可以遍历用户的打卡记录,检查是否符合条件。 ```python def can_exchange(user_id): user_history = users_gifts.get(user_id, {}) consecutive_days = {} for date, count in user_history.items(): if date - consecutive_days.get(date, '') <= datetime.timedelta(days=6): # 连续6天 consecutive_days[date] = count if len(consecutive_days) == 7: # 找到7连日 return True return False ``` 4. **兑换操作**:如果满足兑换条件,可以删除已达到兑换的打卡记录,并通知用户兑换成功。 ```python def redeem_gift(user_id): if can_exchange(user_id): for day, _ in list(users_gifts[user_id].items())[:7]: # 删除前7天的打卡记录 del users_gifts[user_id][day] print(f"恭喜用户{user_id},您的7天连续打卡已成功兑换礼物!") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值