Neo Anderson's Blog

构建信用评分卡模型通用步骤实现细节(二) - 数据处理

字数统计: 809阅读时长: 3 min
2019/10/21
  • 数据处理

    • 缺失数据替换,拟合,虚拟变量

      • 获取缺失值数据密度分布,找到需要填充的字段,并决策使用哪类填充方法
        1
        2
        tain_data.info() # 查看各字段null值分布情况
        sns.boxplot(tain_data[tain_data.MonthlyIncome < 1000000]['MonthlyIncome'], palette='Set3', orient='v') # 绘制箱图看数据分布点,去除异常点
      • 替换缺失值(所有可用的填充方式) 后续新key 可能出现index数量和填充值不同的异常, 这里主要用于展示各类型填充, 正常使用,直接替换原key就没有异常了.
        script
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        #按平均值替换:适用于呈现正态分布定量/定比数据
        tain_data['MonthlyIncomeAvg' ] = tain_data['MonthlyIncome'].fillna(tain_data['MonthlyIncome'].mean())

        #按中位数替换()
        tain_data['MonthlyIncomeAvg' ] = tain_data['MonthlyIncome'].fillna(tain_data['MonthlyIncome'].median())

        #按众数替换(mode):适用于固定类数据
        tain_data['MonthlyIncomeAvg' ] = tain_data['MonthlyIncome'].fillna(tain_data['MonthlyIncome'].mode())

        #按特殊值替换(unknown)
        tain_data['MonthlyIncomeExp' ] = tain_data['MonthlyIncome'].fillna('unknown')

        #人工手工替换
        tain_data['MonthlyIncomeMan' ] = tain_data['MonthlyIncome'].fillna(-1)

        #热卡替换
        @todo

        #K最近邻法(K-means clustering)替换(选定相邻特征单位必须一致)
        kmeans_data = tain_data[:,[5,6,7,4]]
        know_data = kmeans_data[kmeans_data.MonthlyIncome.notnull()].fillna(0).values
        unknow_data = kmeans_data[kmeans_data.MonthlyIncome.isnull()].fillna(0).values
        knn = KNeighborsClassifier(n_neighbors=2, weights='distance') # 初始化knn模型
        knn.fit(know_data[:,0:2],know_data[:,2]) #加载训练集数据,训练模型
        tain_data.loc[tain_data.MonthlyIncomeKnn.isnull(),'MonthlyIncomeKnn'] = knn.knn.predict(unknow_data[:,0:2]) # 预测数据,填充原空数据


      • 拟合缺失值(缺失值必须是连续定量,才可使用该方法预测)
        script
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        #回归预测
        @todo

        # 极大似然估计( Maximum likelyhood)
        @todo
        # 多重插补
        @todo

        #随机森林方法拟合
        process_miss = tain_data.iloc[:,[5,0,1,2,3,4,6,7,8,9]]
        XTrain = know_data[:,1:]
        yTrain = know_data[:,0]
        random_forest = RandomForestRegressor(n_jobs=-1, random_state=0, max_depth=3, n_estimators=200) #初始化随机森林模型
        random_forest.fit(xTrain,yTrain) #训练
        predict = random_forest.predict(unknow_data[:,1:]).round(0) #预测
        tain_data.loc[tain_data.MonthlyIncome.isnull(),'MonthlyIncome'] = predict
      • 虚拟变量
    • 异常数据处理(离群值等)

      • 直接删除异常边界值
        script
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        # 同类绘制箱型图
        fig = plt.figure() #画布
        ax = fig.add_subplot(111) # 1*1 布局 第1处
        ax.boxplot([data_train.percentage, data_train.DebtRation]) # 给坐标数据值
        ax.set_xticklabels(['percentage','DebtRation']) #给坐标lable内容

        #去除掉不符合认知的数据
        data_train = data_train[(data_train.age > 0) & (data_train.age <100)] # 取0-100范围数据为正常
        data_train = data_train[(data_train.percentage<1) & (data_train.DebtRatio < 1)] # 百分比阈值不超过1

        #变量0-59天,60-89天,90-三个异常值处理 ,同类绘制箱式图
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.boxplot([data_train['30-59'],data_train['60-89'],data_train['90-']])
        ax.set_xticklabels(['30-59','60-89','90-'])
        plt.show()
        #三个变量都有离群值,查看各个特征离群值数量
        data_train[data_train['30-59']>30].shape
        data_train[data_train['60-89']>60].shape
        data_train[data_train['90-']>90].shape
        #离群值数量较少,全部删除
        data_train= data_train[data_train['30-59']<30]
        data_train = data_train[data_train['60-89']<60]
        data_train = data_train[data_train['90-']<90]
        data_train = data_train.reset_index(drop=True)#重设索引

    • 数据切分

      • sklearn 内置切分数据训练集和测试集
        script
        1
        2
        from sklearn.model_selection import train_test_split
        x_train, x_test, y_train, y_test = train_test_split(data_train.drop(['target'],axis=1), data_train['target'],test_size=0.3, random_state=10)
CATALOG
  1. 1. 数据处理
    1. 1.1. 缺失数据替换,拟合,虚拟变量
      1. 1.1.1. 获取缺失值数据密度分布,找到需要填充的字段,并决策使用哪类填充方法
      2. 1.1.2. 替换缺失值(所有可用的填充方式) 后续新key 可能出现index数量和填充值不同的异常, 这里主要用于展示各类型填充, 正常使用,直接替换原key就没有异常了.
      3. 1.1.3. 拟合缺失值(缺失值必须是连续定量,才可使用该方法预测)
      4. 1.1.4. 虚拟变量
    2. 1.2. 异常数据处理(离群值等)
      1. 1.2.1. 直接删除异常边界值
    3. 1.3. 数据切分
      1. 1.3.1. sklearn 内置切分数据训练集和测试集