前言: 由于是模拟题,且除了数据清洗外没有答案,所以建模部分没有做特征工程,用了最简单的随机森林的分类树且没有做交叉验证甚至没有调参,也就是说用这个代码的话顶多弄个及格分。
一、数据下载:
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等进行模型融合。
以上全部做好的话,虽然得分不会有很大提升,但是因为考试是和其他人比,时间又有限,所以应该就会比较靠前了。