第一次接触xgboost,在前人的肩膀上开始自己的探索~文中代码是参考代码上略作调整,不一定正确,因为设备原因无法把自己的完整代码拷贝过来,只做一个自己的学习记录(是总结,没什么代码)
1.项目背景
大学生借贷款这个情景下,会有按时还款(好帐)或者拖欠不还(坏账)两种情况。要对贷款人进行判断,预测是否会出现赖账情况。
2.数据获取
已有两份数据,train与predict。数据集train是训练集,predict是测试集,也是最后用来预测评分的数据集。
3.探索性数据分析
这篇参考文档十分有用:
Exploratory analysis of Two Sigma Connect: Rental Listing Inquiries — pydata
value_counts / data.describe() 统计数据。发现部分数据缺失值过大【查看缺失值:df.isnull().sum()】/分布异常。
数据集中有数值型数据与categories类别型数据。
4.数据清洗
1)客户id中并不包含有效信息,于是删去。有的场景下数据集客户id是包含有效特征的,但这个场景下的id只是编号,并无用处;
2)对数据进行shuffle,消除潜在的连续数值影响。
3)数据缺失处理,fillna 或 sklearn.impute.SimpleImputer方法进行填充。部分特征数值缺失值超过70%,删除这个特征。
4)数值特征不需要处理。进行strip等操作删除数值前后的空格或字符。
5)类别特征转为数值特征,可采用one-hot独热编码或labelencoder方法。xgboost分类并不适用于onehot编码(之后填充),我这里采用labelencoder编码。
5.特征工程
#读取数据为DataFrame格式
train_df = pd.read_csv(train_file)
predict_df = pd.read_csv(predict_file)
print(train_df.shape)
print(predict_df.shape)
数值特征的保留与非数值特征的转换:有额外信息的非数值变量转化为对应的数值。删除稀疏特征:空值/同一值占绝大比例的列。使用中位数填充空值,通常数据分布不对称时,中位数比平均数更能保持排序关系。
#feature_to_use中是在特征处理后将要用到的特征
features_to_use = ["feature_name", "feature_name", "feature_name", "feature_name"]
建立特征数据和标签数据,进行数据集拆分。在数据集中,客户编号在训练集和测试集中没有重合部分,也不涉及分行编号,意义不大,遂删除之。
xgb不能够处理分类特征,labelencoder编码将特征编码为数值。因为xgb对缺失值不敏感,删除了缺失值处理。注意有的特征虽然看起来是数值,但因为前后包含字符,是string类型,注意辨别处理。
#转换成数值特征
categorical = ["feature1", "feature2", "feature3"]
for f in categorical:
if train_df[f].dtype=='object':
#print(f)
lbl = preprocessing.LabelEncoder()
lbl.fit(list(train_df[f].values) + list(prdict_df[f].values))
train_df[f] = lbl.transform(list(train_df[f].values))
test_df[f] = lbl.trans