一、导出包和数据
1.1 导入包
# 导入包
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
%matplotlib inline
1.2 导入源数据
org_data = pd.read_csv("data.csv", encoding = 'gbk')
print(org_data.shape)
# (4754, 90)
二、数据探索
写在最前面:因组织者未提供本次task数据的配套字段说明、任务描述也很简略,故大概走下流程吧,后续会持续完善。
2.1 浏览数据
org_data.head()
第一列初步估计是导出的索引,去掉第一列
org_data = org_data.ix[:,1:]
正样本占比为25%,比例较低
org_data.groupby('status')['status'].count()
2.2 数据类型分析
org_data.dtypes
org_data.info(memory_usage='deep')
2.3 缺失数据分析
缺失变量占比统计:居然有70个变量都有缺失!
missing_rate_t = 1 - org_data.describe().T['count'] / len(org_data)
missing_rate = missing_rate_t[missing_rate_t > 0].sort_values(ascending = False)
print(len(missing_rate))
删除缺失比例较高的变量,这里删除缺失超过50%的变量
missing_rate_50 = missing_rate_t[missing_rate_t > 0.5].sort_values(ascending = False)
print(missing_rate_50)
删除缺失占比超过50%的变量student_feature
org_data1 = org_data.drop(missing_rate_50.index, axis=1)
剩下69个缺失变量,缺失比例较低,对数值缺失变量采用均值替换,对分类变量采用众数替换
2.4 无关特征删除
2.4.1 连续变量——相关系数,将相关系数较低的变量删除
# 连续变量——相关系数,将相关系数较低的变量删除
org_data1_corr = abs(org_data1.corr()['status'])
org_data1_corr_re = org_data1_corr[org_data1_corr.values < 0.02].index
print(org_data1_corr_re)
#数值型变量剩余61个,依然较多
var_num_f =list(set(var_num)- set(org_data1_corr_re))
print(len(var_num_f))
2.4.2 分类变量——卡方检验,检验不显著的删除
除日期变量外仅一个分类变量,暂时不做处理
三、模型构建和评估
tf = RandomForestClassifier(n_estimators=500, min_samples_leaf = 5)
tf_model = tf.fit(x_train, y_train)
tf_model
# 存在过拟合的情况,需要调整
print("拟合效果:")
print(tf_model.score(x_train, y_train))
print(classification_report(y_train, tf_model.predict(x_train)))
print("预测效果:")
print(tf_model.score(x_test, y_test))
print(classification_report(y_test, tf_model.predict(x_test)))