目录
任务描述
给定金融数据,预测贷款用户是否会逾期。(status是标签:0表示未逾期,1表示逾期。)
Misson1 - 构建逻辑回归模型进行预测
Misson2 - 构建SVM和决策树模型进行预测
Misson3 - 构建xgboost和lightgbm模型进行预测
Mission4 - 记录五个模型关于precision,rescore,f1,auc,roc的评分表格,画出auc和roc曲线图
Mission5 - 关于数据类型转换以及缺失值处理(尝试不同的填充看效果)以及你能借鉴的数据探索
Mission6 - 使用网格搜索对模型进行调优并采用五折交叉验证的方式进行模型评估
Mission7 - 用你目前评分最高的模型作为基准模型,和其他模型进行stacking融合,得到最终模型及评分
Mission8 - 分别用IV值和随机森林挑选特征,再构建模型,进行模型评估
实现过程
基本思路
主要分为以下若干步骤:
1)数据集预览
2)数据预处理:切分X,y;删除无用特征;字符型特征编码;缺失值填充 等
3)特征工程
4)模型选择:lr,svm,dt,xgboost,lightgbm 等
5)模型调参
6)性能评估
7)最终结果
1. 数据集预览
# 因为数据并非utf-8编码,要使用gbk编码读入,否则出错
data = pd.read_csv('./data/data.csv', index_col=0, encoding='gbk')
# 观察数据构成
# data.head()
print(data.shape) # (4754, 89)
2. 数据预处理
X, y 划分
# 划分 X, y
y = data['status']
X = data.drop('status', axis=1)
特征处理
# 首先剔除一些明显无用的特征,如 id_name, custid, trade_no, bank_card_no,
# 这些优点类似一个人的唯一信息,如果加入模型训练且对最终模型生效的话,很可能就是出现了过拟合
X.drop(['id_name', 'custid', 'trade_no', 'bank_card_no'], axis=1, inplace=True)
# 数值型变量
X_num = X.select_dtypes('number').copy()
# student_feature
X_num.fillna({'student_feature': 0}, inplace=True)
# 其他数值型变量使用均值代替
X_num.fillna(X_num.mean(), inplace=True)
# 字符型变量
X_str = X.select_dtypes(exclude='number').copy()
X_str_dummy = pd.get_dummies(X_str['reg_preference_for_trad'])
# 合并
X_cl = pd.concat([X_num, X_str_dummy], axis=1, sort=False)
X_cl.shape
3. 特征工程
由于特征工程比较浩大,所以新开一文章用以记录。
详见:https://blog.youkuaiyun.com/l75326747/article/details/84326897
4. 模型选择
4.1 数据及划分及数据归一化
# 数据划分
from sklearn.model_selection import train_test_split
random_state = 1115
X_train, X_test, y_train, y_test = train_test_split(X_cl, y, test_size=0.3, random_state=random_state)
# 归一化
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
X_train_std = ss.fit_transform(X_train)
X_test_std = ss.transform(X_test)
4.2 LR
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=0.05, penalty='l1')
lr.fit(X_train_std, y_train)
4.3 SVM
from sklearn.svm import SVC
# 线性 SVM
linear_svc = SVC(kernel='linear', probability=True)
linear_svc.fit(X_train_std, y_train)
# 多项式 SVM
poly_svc = SVC(kernel='poly', probability=True)
poly_svc.fit(X_train_std, y_train)