打卡第32天 文件的规范拆分

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

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

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

#导入依赖库
lass Circle:
    def __init__(self, radius):
        self.radius = radius

class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width

def create_shape(shape_type, *args):
    if shape_type == "circle":
        if len(args) != 1:
            raise ValueError("创建圆形需要1个参数:半径")
        return Circle(args[0])
    elif shape_type == "rectangle":
        if len(args) != 2:
            raise ValueError("创建矩形需要2个参数:长和宽")
        return Rectangle(args[0], args[1])
    else:
        raise ValueError(f"不支持的图形类型:{shape_type}")


#数据预处理
# 对object数据类型进行编码
# 将"female"编码为0,将"male"编码为1
# 下面的编码方式类似
dt['sex'][dt['sex'] == 0] = 'female'
dt['sex'][dt['sex'] == 1] = 'male'
 
dt['chest_pain_type'][dt['chest_pain_type'] == 1] = 'typical angina'
dt['chest_pain_type'][dt['chest_pain_type'] == 2] = 'atypical angina'
dt['chest_pain_type'][dt['chest_pain_type'] == 3] = 'non-anginal pain'
dt['chest_pain_type'][dt['chest_pain_type'] == 4] = 'asymptomatic'
 
dt['fasting_blood_sugar'][dt['fasting_blood_sugar'] == 0] = 'lower than 120mg/ml'
dt['fasting_blood_sugar'][dt['fasting_blood_sugar'] == 1] = 'greater than 120mg/ml'
 
dt['rest_ecg'][dt['rest_ecg'] == 0] = 'normal'
dt['rest_ecg'][dt['rest_ecg'] == 1] = 'ST-T wave abnormality'
dt['rest_ecg'][dt['rest_ecg'] == 2] = 'left ventricular hypertrophy'
 
dt['exercise_induced_angina'][dt['exercise_induced_angina'] == 0] = 'no'
dt['exercise_induced_angina'][dt['exercise_induced_angina'] == 1] = 'yes'
 
dt['st_slope'][dt['st_slope'] == 1] = 'upsloping'
dt['st_slope'][dt['st_slope'] == 2] = 'flat'
dt['st_slope'][dt['st_slope'] == 3] = 'downsloping'
 
dt['thalassemia'][dt['thalassemia'] == 1] = 'normal'
dt['thalassemia'][dt['thalassemia'] == 2] = 'fixed defect'
dt['thalassemia'][dt['thalassemia'] == 3] = 'reversable defect'




#数据可视化
# 设置可视化风格
sns.set(palette = 'pastel', rc = {"figure.figsize": (10,5), # 图形大小、
                                  "axes.titlesize" : 14,    # 标题文字尺寸
                                  "axes.labelsize" : 12,    # 坐标轴标签文字尺寸
                                  "xtick.labelsize" : 10,   # X轴刻度文字尺寸
                                  "ytick.labelsize" : 10 }) # Y轴刻度文字尺寸
a = sns.countplot(x = 'target', data = dt)               # 绘制计数图,其中x为target,数据为dt
a.set_title('Distribution of Presence of Heart Disease') # 设置图形标题
a.set_xticklabels(['Absent', 'Present'])                 # 将两个条形的标签分别设置为“Absent”(没有心脏病)和“Present”(有心脏病)
plt.xlabel("Presence of Heart Disease")                  # 设置X轴标签
 
# 显示图形
plt.show()
g = sns.countplot(x = 'age', data = dt) # 绘制计数图,其中x为age,数据为dt
g.set_title('Distribution of Age')      # 设置图形标题
plt.xlabel('Age')                       # 设置X轴标签
b = sns.countplot(x = 'target', data = dt, hue = 'sex')          # 创建一个计数图,其中x为target,数据为dt,用sex作为色相(切分类别)
plt.legend(['Female', 'Male'])                                    # 以female/male作为标签,在图形中嵌入图例
b.set_title('Distribution of Presence of Heart Disease by Sex')   # 设置图形标题
b.set_xticklabels(['Absent', 'Present'])                          # 设置条形图的标签
 
# 显示图形
plt.show()
# 可视化病患血清胆固醇浓度分布
sns.distplot(dt['chol'].dropna(), kde=True, color='darkblue', bins=40)





#创建机器学习模型
model = RandomForestClassifier(max_depth=5, n_estimators=10)    # 设置最大深度与基学习器等参数
model.fit(X_train, y_train)                                     # 使用随机森林拟合训练集



#模型预测
y_predict = model.predict(X_test)
# 生成一个nxm的矩阵,第i行表示第i个样本属于各个标签的概率
y_pred_quant = model.predict_proba(X_test)[:, 1]
y_pred_bin = model.predict(X_test)



#模型评估
total=sum(sum(confusion_matrix))
 
sensitivity = confusion_matrix[0,0]/(confusion_matrix[0,0]+confusion_matrix[1,0])
print('灵敏度 : ', sensitivity )
 
specificity = confusion_matrix[1,1]/(confusion_matrix[1,1]+confusion_matrix[0,1])
print('特异度 : ', specificity)

@浙大疏锦行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值