1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        機(jī)器學(xué)習(xí)基礎(chǔ):缺失值的處理技巧(附Python代碼)

        共 4198字,需瀏覽 9分鐘

         ·

        2020-08-27 01:59

        ↑↑↑點(diǎn)擊上方藍(lán)字,回復(fù)資料,10個(gè)G的驚喜

        在數(shù)據(jù)分析和建模中,經(jīng)常會(huì)遇到變量值缺失的情況,這是非常常見的。為了保證數(shù)據(jù)指標(biāo)的完整性以及可利用性,通常我們會(huì)采取特殊的方式對(duì)其進(jìn)行處理。

        1、缺失查看

        首先,需要查看缺失值的缺失數(shù)量以及比例(#數(shù)據(jù)使用的kaggle平臺(tái)上預(yù)測(cè)房?jī)r(jià)的數(shù)據(jù))

        import pandas as pd
        # 統(tǒng)計(jì)缺失值數(shù)量missing=data.isnull().sum().reset_index().rename(columns={0:'missNum'})# 計(jì)算缺失比例missing['missRate']=missing['missNum']/data.shape[0]# 按照缺失率排序顯示miss_analy=missing[missing.missRate>0].sort_values(by='missRate',ascending=False)# miss_analy 存儲(chǔ)的是每個(gè)變量缺失情況的數(shù)據(jù)框

        柱形圖可視化

        import matplotlib.pyplot as pltimport pylab as pl
        fig = plt.figure(figsize=(18,6))plt.bar(np.arange(miss_analy.shape[0]), list(miss_analy.missRate.values), align = 'center',color=['red','green','yellow','steelblue'])
        plt.title('Histogram of missing value of variables')plt.xlabel('variables names')plt.ylabel('missing rate')# 添加x軸標(biāo)簽,并旋轉(zhuǎn)90度plt.xticks(np.arange(miss_analy.shape[0]),list(miss_analy['index']))pl.xticks(rotation=90)# 添加數(shù)值顯示for x,y in enumerate(list(miss_analy.missRate.values)): plt.text(x,y+0.12,'{:.2%}'.format(y),ha='center',rotation=90) plt.ylim([0,1.2])
        plt.show()

        這樣的統(tǒng)計(jì)計(jì)算以及可視化基本已經(jīng)看出哪些變量缺失,以及缺失比例情況,對(duì)數(shù)據(jù)即有個(gè)缺失概況。下面將對(duì)缺失變量進(jìn)行相應(yīng)處理。

        2、缺失處理

        方式1:刪除

        直接去除含有缺失值的記錄,這種處理方式是簡(jiǎn)單粗暴的,適用于數(shù)據(jù)量較大(記錄較多)且缺失比較較小的情形,去掉后對(duì)總體影響不大。一般不建議這樣做,因?yàn)楹芸赡軙?huì)造成數(shù)據(jù)丟失、數(shù)據(jù)偏移。

        func: df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
        # 1、刪除‘a(chǎn)ge’列df.drop('age', axis=1, inplace=True)
        # 2、刪除數(shù)據(jù)表中含有空值的行df.dropna()
        # 3、丟棄某幾列有缺失值的行df.dropna(axis=0, subset=['a','b'], inplace=True)

        直接去除缺失變量,基于第一步我們已經(jīng)知道每個(gè)變量的缺失比例,如果一個(gè)變量的缺失比例過高,基本也就失去了預(yù)測(cè)意義,這樣的變量我們可以嘗試把它直接去掉。

        # 去掉缺失比例大于80%以上的變量data=data.dropna(thresh=len(data)*0.2, axis=1)

        方式2:常量填充

        在進(jìn)行缺失值填充之前,我們要先對(duì)缺失的變量進(jìn)行業(yè)務(wù)上的了解,即變量的含義、獲取方式、計(jì)算邏輯,以便知道該變量為什么會(huì)出現(xiàn)缺失值、缺失值代表什么含義。比如,‘a(chǎn)ge’ 年齡缺失,每個(gè)人均有年齡,缺失應(yīng)該為隨機(jī)的缺失,‘loanNum’貸款筆數(shù),缺失可能代表無貸款,是有實(shí)在意義的缺失。

        全局常量填充:可以用0,均值、中位數(shù)、眾數(shù)等填充。

        平均值適用于近似正態(tài)分布數(shù)據(jù),觀測(cè)值較為均勻散布均值周圍;中位數(shù)適用于偏態(tài)分布或者有離群點(diǎn)數(shù)據(jù),中位數(shù)是更好地代表數(shù)據(jù)中心趨勢(shì);眾數(shù)一般用于類別變量,無大小、先后順序之分。

        # 均值填充data['col'] = data['col'].fillna(data['col'].means())# 中位數(shù)填充data['col'] = data['col'].fillna(data['col'].median())# 眾數(shù)填充data['col'] = data['col'].fillna(stats.mode(data['col'])[0][0])

        也可以借助Imputer類處理缺失:

        from sklearn.preprocessing import Imputerimr = Imputer(missing_values='NaN', strategy='mean', axis=0)imputed_data =pd.DataFrame(imr.fit_transform(df.values),columns=df.columns)imputed_data

        方式3:插值填充

        采用某種插入模式進(jìn)行填充,比如取缺失值前后值的均值進(jìn)行填充:

        #  interpolate()插值法,缺失值前后數(shù)值的均值,但是若缺失值前后也存在缺失,則不進(jìn)行計(jì)算插補(bǔ)。df['a'] = df['a'].interpolate()
        # 用前面的值替換, 當(dāng)?shù)谝恍杏腥笔е禃r(shí),該行利用向前替換無值可取,仍缺失df.fillna(method='pad')
        # 用后面的值替換,當(dāng)最后一行有缺失值時(shí),該行利用向后替換無值可取,仍缺失df.fillna(method='backfill')#用后面的值替換

        方式4:KNN填充

        利用knn算法填充,其實(shí)是把目標(biāo)列當(dāng)做目標(biāo)標(biāo)量,利用非缺失的數(shù)據(jù)進(jìn)行knn算法擬合,最后對(duì)目標(biāo)列缺失進(jìn)行預(yù)測(cè)。(對(duì)于連續(xù)特征一般是加權(quán)平均,對(duì)于離散特征一般是加權(quán)投票)

        fancyimpute 類

        from fancyimpute import KNNfill_knn = KNN(k=3).fit_transform(data)data = pd.DataFrame(fill_knn)

        sklearn類

        from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
        def knn_filled_func(x_train, y_train, test, k = 3, dispersed = True): # params: x_train 為目標(biāo)列不含缺失值的數(shù)據(jù)(不包括目標(biāo)列) # params: y_train 為不含缺失值的目標(biāo)列 # params: test 為目標(biāo)列為缺失值的數(shù)據(jù)(不包括目標(biāo)列) if dispersed: knn= KNeighborsClassifier(n_neighbors = k, weights = "distance") else: knn= KNeighborsRegressor(n_neighbors = k, weights = "distance")
        knn.fit(x_train, y_train) return test.index, knn.predict(test)

        方式5:隨機(jī)森林填充

        隨機(jī)森林算法填充的思想和knn填充是類似的,即利用已有數(shù)據(jù)擬合模型,對(duì)缺失變量進(jìn)行預(yù)測(cè)。

        from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
        def knn_filled_func(x_train, y_train, test, k = 3, dispersed = True): # params: x_train 為目標(biāo)列不含缺失值的數(shù)據(jù)(不包括目標(biāo)列) # params: y_train 為不含缺失值的目標(biāo)列 # params: test 為目標(biāo)列為缺失值的數(shù)據(jù)(不包括目標(biāo)列) if dispersed: rf= RandomForestRegressor() else: rf= RandomForestClassifier()
        rf.fit(x_train, y_train) return test.index, rf.predict(test)

        3、缺失衍生

        有時(shí)候,可以根據(jù)某個(gè)字段是否缺失,進(jìn)行新變量的衍生,比如,"信用卡數(shù)量",若該字段缺失,代表'無信用卡',則可以根據(jù)"信用卡數(shù)量"是否缺失衍生'有無信用卡'字段,這種衍生很可能是很有效果的。

        4、總結(jié)

        總之,處理缺失值是需要研究數(shù)據(jù)規(guī)律與缺失情況來進(jìn)行處理的,復(fù)雜的算法不一定有好的效果,因此,還要具體問題具體分析,尤其是要搞明白字段含義以及缺失意義,這往往容易被忽略。個(gè)人經(jīng)驗(yàn),數(shù)據(jù)處理需要去探索,沒有一成不變的萬全之策。

        作者:星星之火

        https://zhuanlan.zhihu.com/p/98007066

        END
        如果看到這里,說明你喜歡這篇文章,請(qǐng)轉(zhuǎn)發(fā)、點(diǎn)贊。微信搜索「hych666」,歡迎添加我的微信,更多精彩,盡在我的朋友圈。
        掃描二維碼添加好友↓

        推薦閱讀

        (點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)

        當(dāng) 當(dāng) 網(wǎng),花160買400的書!

        數(shù)學(xué)中蘊(yùn)含的人生哲理

        揭秘!阿里巴巴電商算法首次對(duì)外公開

        在機(jī)器學(xué)習(xí)項(xiàng)目中該如何選擇優(yōu)化器

        機(jī)器學(xué)習(xí)基礎(chǔ):詳解 5 大常用特征選擇方法

        NumPy庫(kù)入門教程:基礎(chǔ)知識(shí)總結(jié)

        老鐵,三連支持一下,好嗎?↓↓↓

        瀏覽 60
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            操碰免费视频 | 韩国三级日本三级香港三级黄 | 国产AV女主播 | 操屄大片 | 欧美精品第二页 | 69精品一区二区三区无码吞精 | 精品无码一区二区人妻久久蜜桃 | 国产1234在线观看 | 天天操天天干天天射 | 亚洲精品无码久久毛片18特黄 |