<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          算法基礎(chǔ)-數(shù)據(jù)預(yù)處理和特征工程

          共 10215字,需瀏覽 21分鐘

           ·

          2024-03-30 01:00

          來源: DA隨想隨筆

          一、 概述

          機器學(xué)習(xí)最基礎(chǔ)的5個流程,分別是數(shù)據(jù)獲取,數(shù)據(jù)預(yù)處理,特征工程,建模、測試和預(yù)測,上線與部署。

          如果用做菜來對比,數(shù)據(jù)獲取就好比買菜,數(shù)據(jù)預(yù)處理就好比洗菜,特征工程就好比主菜輔料加工準(zhǔn)備,建模就好比炒菜,上線部署就好比擺盤上菜。

          由此可見,數(shù)據(jù)預(yù)處理和特征工程在整個機器學(xué)習(xí)應(yīng)用工作中,占據(jù)了極其重要的地位。要是菜沒洗干凈,食材沒加工好,大廚手藝再高也做不出好吃的菜。

          數(shù)據(jù)預(yù)處理

          數(shù)據(jù)預(yù)處理主要是從數(shù)據(jù)角度和業(yè)務(wù)角度兩方面入手,從獲取的數(shù)據(jù)中查缺補漏,修正不準(zhǔn)確的數(shù)據(jù),剔除不適用的數(shù)據(jù)。

          數(shù)據(jù)預(yù)處理的主要目的就是讓數(shù)據(jù)符合模型需求,能正確表達業(yè)務(wù)意義。

          常見的需要處理的問題有:

          1. 數(shù)據(jù)類型問題:數(shù)據(jù)中有的是文本格式,有的是數(shù)值格式,有的同樣是時間序列但是格式不同。

          2. 數(shù)據(jù)質(zhì)量問題:數(shù)據(jù)存在重復(fù)值,異常值,缺失值,數(shù)據(jù)量綱不統(tǒng)一有的數(shù)據(jù)取值在(0,1)之間有的取值是百萬級的,樣本分布存在偏態(tài)有某幾類樣本量極大。

          3. 業(yè)務(wù)表達問題:有些數(shù)據(jù)從值上看符合一般邏輯,但是落在具體業(yè)務(wù)場景中,就會存在問題,因此要結(jié)合業(yè)務(wù)意義,剔除不符合要求的樣本數(shù)據(jù)。


          特征工程

          特征工程主要是對原始數(shù)據(jù)進行加工、組合、轉(zhuǎn)換、產(chǎn)生新的變量,使其更能代表預(yù)測模型的潛在問題。同時還可以通過特征工程,挑選和提取一些更有價值的特征,剔除一些對模型性能影響不大的特征,從而降低模型計算的復(fù)雜度。

          特征工程的主要目的是降低模型計算成本,提高模型精度。

          常見的需要處理的問題有:

          1. 相關(guān)性分析:特征與特征之間相關(guān)性強,說明具有多重共線性,可以將幾個特征組合成一個新特征,實現(xiàn)降維;特征與目標(biāo)之間的相關(guān)性強,說明特征對目標(biāo)的解釋性好,是可用的特征,反之,說明特征對目標(biāo)沒什么影響,則可以剔除該特征。

          2. 特征構(gòu)造:基于原始特征,進行組合,轉(zhuǎn)換,加工,生成新的特征,使得其更具有對目標(biāo)的解釋性。

          3. 特征降維:講一些解釋性弱的特征,業(yè)務(wù)意義不強的特征剔除,降低模型運算復(fù)雜度,提高性能。


          二、 常用功能

          接下來以python為例,介紹在數(shù)據(jù)預(yù)處理和特征工程過程中常用的一些方法。

                
                  
                    # 導(dǎo)入數(shù)據(jù),這里以python自帶的鳶尾花數(shù)據(jù)為例
                  
                
                
                  
                    from sklearn import datasets
                  
                
                
                  
                    import pandas as pd  
                  
                
                
                  
                    import numpy as np
                  
                
                
                  
                    # 加載數(shù)據(jù)集
                  
                
                
                  
                    data = datasets.load_iris()
                  
                
                
                  
                    X = data.data   # 特征值
                  
                
                
                  
                    y = data.target   # 目標(biāo)值
                  
                
                
                  
                    data_iris=pd.DataFrame(X)
                  
                
                
                  
                    data_iris['target']=pd.DataFrame(y)
                  
                
                
                  
                    data_iris=data_iris.rename(columns={0:'F1',1:'F2',2:'F3',3:'F4','target':'target'})
                  
                
                
                  
                    data_iris.head()
                  
                
              

          數(shù)據(jù)預(yù)處理

          重復(fù)值處理

                
                  
                    # 重復(fù)值刪除
                  
                
                
                  
                    data_iris = data_iris.drop_duplicates()
                  
                
              

          缺失值處理

                
                  
                    # 缺失值處理
                  
                
                
                  
                    ## 查看缺失值
                  
                
                
                  
                    data_iris.isnull().sum()
                  
                
                
                  
                    ## 缺失值刪除
                  
                
                
                  
                    ### 刪除含有缺失值的行  
                  
                
                
                  
                    data_iris = data_iris.dropna()  
                  
                
                
                  
                    
          ### 刪除含有缺失值的列 data_iris = data_iris.dropna(axis=1)
          ##缺失值填補 ### 用指定數(shù)值填充缺失值 ,如0 data_iris = data_iris.fillna(0) ### 用均值、中位數(shù)、眾數(shù)填補 data_iris = data_iris.fillna(data_iris.mean())

          異常值處理

                
                  
                    # 異常值識別
                  
                
                
                  
                    ## 分位數(shù)識別異常值,將上下四分位數(shù)之外的都定義為異常值
                  
                
                
                  
                    
          from scipy import stats
          ### 計算IQR Q1 = data_iris.quantile(0.25) Q3 = data_iris.quantile(0.75) IQR = Q3 - Q1
          ### 找出異常值 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR outliers = data_iris[(data_iris < lower_bound) | (data_iris > upper_bound)]
          ## 標(biāo)準(zhǔn)差識別異常值,在幾個標(biāo)準(zhǔn)差之外的數(shù)據(jù)定義為異常值 z_scores = (data_iris - data_iris.mean()) / data_iris.std() outliers_z = z_scores[abs(z_scores) > 3]
          # 異常值處理 # 異常值處理方式很多,如直接刪除或用均值替代等,其與缺失值處理方式基本一致,就不再額外贅述。

          分類變量編碼

          讓不可計算的分類變量轉(zhuǎn)化為可計算的數(shù)值或者矩陣

                
                  
                    # label編碼,將分類變量轉(zhuǎn)化成數(shù)值形式
                  
                
                
                  
                    from sklearn.preprocessing import LabelEncoder
                  
                
                
                  
                    data_iris.iloc[:,-1] = LabelEncoder().fit_transform(data_iris.iloc[:,-1])
                  
                
                
                  
                    # onehot編碼,創(chuàng)建虛擬變量,將分類變量轉(zhuǎn)化成01矩陣
                  
                
                
                  
                    from sklearn.preprocessing import OneHotEncoder
                  
                
                
                  
                    X = data_iris.iloc[:,1:-1]
                  
                
                
                  
                    enc = OneHotEncoder(categories='auto').fit(X)
                  
                
                
                  
                    result = enc.transform(X).toarray()
                  
                
                
                  
                    

          連續(xù)變量編碼

          將連續(xù)變量離散化,使得其可以根據(jù)有區(qū)分效果。

                
                  
                    # 二值化,大于閾值記為1,小于閾值記為0
                  
                
                
                  
                    from sklearn.preprocessing import Binarizer
                  
                
                
                  
                    X = data_iris.iloc[:,0].values.reshape(-1,1)               #類為特征專用,所以不能使用一維數(shù)組
                  
                
                
                  
                    transformer = Binarizer(threshold=30).fit_transform(X)
                  
                
                
                  
                    #transformer
                  
                
                
                  
                    # 分箱
                  
                
                
                  
                    from sklearn.preprocessing import KBinsDiscretizer
                  
                
                
                  
                    X = data_iris.iloc[:,0].values.reshape(-1,1) 
                  
                
                
                  
                    # n_bins設(shè)置要分幾箱,默認(rèn)為5;encode設(shè)置編碼方式,默認(rèn)onehot;
                  
                
                
                  
                    # strategy設(shè)置分箱方法,默認(rèn)為quantile等位分箱(每箱樣本數(shù)量相同),uniform等寬分箱,每個箱的上下限差值相同,kmeans聚類分箱
                  
                
                
                  
                    est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
                  
                
                
                  
                    est.fit_transform(X)
                  
                
                
                  
                    #查看轉(zhuǎn)換后分的箱:變成了一列中的三箱
                  
                
                
                  
                    set(est.fit_transform(X).ravel())
                  
                
                
                  
                    est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')#查看轉(zhuǎn)換后分的箱:變成了啞變量
                  
                
                
                  
                    est.fit_transform(X).toarray()
                  
                
              

          標(biāo)準(zhǔn)化

          消除變量的量綱,使得特征變量的值都收斂于同一個范圍。

                
                  
                    # maxmin標(biāo)準(zhǔn)化
                  
                
                
                  
                    from sklearn.preprocessing import MinMaxScaler
                  
                
                
                  
                    #實現(xiàn)歸一化
                  
                
                
                  
                    scaler = MinMaxScaler()                             
                  
                
                
                  
                    scaler = scaler.fit(data_iris)                           
                  
                
                
                  
                    result = scaler.transform(data_iris)                     
                  
                
                
                  
                    
          # z標(biāo)準(zhǔn)化 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler = scaler.fit(data_iris) result = scaler.transform(data_iris)

          特征工程

          業(yè)務(wù)理解

          通過數(shù)據(jù)預(yù)處理,數(shù)據(jù)邏輯上的錯誤基本已經(jīng)消除。但這是否就代表著可以建模了呢?當(dāng)然不是,這里還需要對特征進行處理。

          如果說數(shù)據(jù)預(yù)處理是對行數(shù)據(jù)進行操作,那么特征工程主要是對列進行操作。

          而這其中,最重要的一步,是對特征的業(yè)務(wù)理解。如,某一個數(shù)據(jù)集有幾列分別為地區(qū),天氣,降水量,空氣濕度,用戶年齡。

          如果現(xiàn)在是要對天氣情況進行分析,那么很明顯,用戶年齡這個特征字段對這個目標(biāo)是沒有用處的。因此從業(yè)務(wù)理解的角度考慮,首先就可以剔除一些沒有錯,但沒有用的特征變量。

          特征選擇-過濾法

                
                  
                    # 方差過濾
                  
                
                
                  
                    ## 如果一個特征的方差很小,說明數(shù)據(jù)都集中于一個范圍中,沒有什么差異性,甚至都是相同的值,該特征用處就不大
                  
                
                
                  
                    from sklearn.feature_selection import VarianceThreshold
                  
                
                
                  
                    #獲取刪除不合格特征之后的新特征矩陣
                  
                
                
                  
                    X = VairanceThreshold().fit_transform(data_iris) 
                  
                
                
                  
                    # 相關(guān)性過濾
                  
                
                
                  
                    ## 如果特征與標(biāo)簽之間沒有相關(guān)性,則可以剔除該特征,如果特征與特征之間相關(guān)性很強,則可以將特征組合,實現(xiàn)降維
                  
                
                
                  
                    ## 這里以卡方過濾為例,常見的還有F檢驗,互信息等
                  
                
                
                  
                    from sklearn.ensemble import RandomForestClassifier as RFC
                  
                
                
                  
                    from sklearn.model_selection import cross_val_score
                  
                
                
                  
                    from sklearn.feature_selection import SelectKBest
                  
                
                
                  
                    from sklearn.feature_selection import chi2
                  
                
                
                  
                    # k表示需要保留的特征個數(shù)
                  
                
                
                  
                    X_kafang = SelectKBest(chi2, k=3).fit_transform(data_iris.iloc[:,:-1], data_iris['target'])
                  
                
                
                  
                    ## 至于k怎么取值,一方面是可以根據(jù)業(yè)務(wù)實際需要取,也可以通過學(xué)習(xí)曲線取學(xué)習(xí)曲線中最高點對應(yīng)的k值
                  
                
                
                  
                    %matplotlib inline
                  
                
                
                  
                    import matplotlib.pyplot as plt
                  
                
                
                  
                    score = []
                  
                
                
                  
                    for i in range(3,0,-1):
                  
                
                
                  
                        X_fschi = SelectKBest(chi2, k=i).fit_transform(data_iris.iloc[:,:-1], data_iris['target'])
                  
                
                
                  
                        once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,data_iris['target'],cv=5).mean()
                  
                
                
                  
                        score.append(once)
                  
                
                
                  
                    plt.plot(range(3,0,-1),score)
                  
                
                
                  
                    plt.show()
                  
                
              

          特征選擇-嵌入法

          將特征嵌入模型,讓算法同時進行特征選擇和模型訓(xùn)練,然后輸出特征的權(quán)重參數(shù)值,通過排序選擇有用的特征,這里沒有一個統(tǒng)一的標(biāo)準(zhǔn)去判斷權(quán)重參數(shù)達到什么標(biāo)準(zhǔn)可以剔除。且不同算法對參數(shù)讀取的函數(shù)也略有不同,因此對本方法就不具體舉例了。

          特征選擇-包裝法

          通過引入一個函數(shù),來幫助算法在模型訓(xùn)練時自主選擇特征,不需要人工判斷參數(shù)值。該方法相對復(fù)雜,本文也不做舉例。

          三、 總結(jié)

          本文簡單介紹了數(shù)據(jù)分析過程中,數(shù)據(jù)預(yù)處理和特征工程的相關(guān)基礎(chǔ)內(nèi)容,并進行了一些舉例。但其實這兩部分內(nèi)容遠不是這么簡單,在實際操作中,所遇到的問題更加復(fù)雜,且可應(yīng)用的方法也非常多,本文所介紹的都是最基礎(chǔ)的方法,便于理解其用途。

          可以說數(shù)據(jù)分析結(jié)果好不好,很大程度取決于數(shù)據(jù)預(yù)處理和特征工程做的好不好。本文相對粗淺,感興趣的朋友,可以再深入研究。

          本文只做學(xué)術(shù)分享,如有侵權(quán),聯(lián)系刪文

          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产特级AAA精彩免费看 | 九哥操屄网 | 色逼逼视频 | 牛牛视频在线观看 | 亚洲天堂男人天堂 |