CDA Level2 模拟题1 Python代码实现

前言: 由于是模拟题,且除了数据清洗外没有答案,所以建模部分没有做特征工程,用了最简单的随机森林的分类树且没有做交叉验证甚至没有调参,也就是说用这个代码的话顶多弄个及格分。
一、数据下载:
http://exam.cda.cn/static/exam_attachment/L2jmjxshiti.zip

二、案例背景和要求:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三、Python代码实现

1、数据导入

import pandas as pd
import numpy as np

pd.set_option('display.max_columns', None) #显示所有列
pd.set_option('display.float_format', lambda x: '%.2f' % x) #取消科学计数法

train_data = pd.read_csv('cs-training.csv')
test_data = pd.read_csv('cs-test.csv')
train_data.info()

2、数据预处理前的数据描述

test_data.info()

在这里插入图片描述
分析:可以看到MonthlyIncome和NumberOfDependents是有缺失值的

train_data.describe()

在这里插入图片描述

test_data.describe()

在这里插入图片描述
3、均值填充

#对训练集进行均值填充
per_columns = set(train_data.columns) - set(['CustomerID', 'SeriousDlqin2yrs'])

for column in per_columns:
    temp_mean = train_data[column].mean()
    train_data[column] = train_data[column].fillna(temp_mean)
train_data.info()

在这里插入图片描述
说明:缺失值已经填充完毕

#对测试集进行均值填充
for column in per_columns:
    temp_mean = test_data[column].mean()
    test_data[column] = test_data[column].fillna(temp_mean)
test_data.info()

4、异常值盖帽法处理

def cap(x, quantile=[0.05, 0.95]):
    """盖帽法处理异常值
    Args:
    x:pd.Series列,连续变量
    quantile:指定盖帽法的上下分位数范围
    """ 
    # 生成分位数
    Q05, Q95=x.quantile(quantile).values.tolist()
    # 替换异常值为指定的分位数
    if Q05 > x.min():
        x = x.copy()
        x.loc[x<Q05] = Q05
    if Q95 < x.max():
        x = x.copy()
        x.loc[x>Q95] = Q95
    return(x)

#对训练集进行盖帽法
train_data_2 = train_data[per_columns]
train_data_2 = train_data_2.apply(cap)
new_train_data = pd.concat([train_data[['CustomerID', 'SeriousDlqin2yrs']], train_data_2], axis=1)
new_train_data = new_train_data[train_data.columns]
new_train_data.describe()

#对测试集进行盖帽法
test_data_2 = test_data[per_columns]
test_data_2 = test_data_2.apply(cap)
new_test_data = pd.concat([test_data[['CustomerID', 'SeriousDlqin2yrs']], test_data_2], axis=1)
new_test_data = new_test_data[test_data.columns]
new_test_data.describe()

在这里插入图片描述
说明:训练集均值填充和盖帽后的结果

5、建模预测(请自行完善)

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

X_train, X_val, y_train, y_val = train_test_split(new_train_data[per_columns], new_train_data['SeriousDlqin2yrs'], 
                test_size=0.2, random_state=2019, stratify=new_train_data['SeriousDlqin2yrs'])

rf = RandomForestClassifier()
rf.fit(X_train, y_train)
pred1 = rf.predict(X_val)

print(pred1)
print(classification_report(pred1, y_val))

在这里插入图片描述
说明:红色方块处的就是f-measure结果,成绩低的可怜。
如果要提升成绩,有几个选择:
1、对样本进行上下采样;
2、进一步做一下数据分析,如Anova检验、相关系数检验等;
3、作图并看下是否可以如数据分箱、特征合并等可能;
4、模型调参;
5、5折交叉验证;
6、再选几种模型,如Logistc Regression、LightGBM等进行模型融合。

以上全部做好的话,虽然得分不会有很大提升,但是因为考试是和其他人比,时间又有限,所以应该就会比较靠前了。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值