久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    特征工程與數(shù)據(jù)預(yù)處理的四個高級技巧

     LibraryPKU 2019-08-29

    折磨數(shù)據(jù),它會坦白任何事情。- 羅納德科斯

    用于創(chuàng)建新特征,檢測異常值,處理不平衡數(shù)據(jù)和估算缺失值的技術(shù)可以說,開發(fā)機(jī)器學(xué)習(xí)模型的兩個最重要的步驟是特征工程和預(yù)處理。特征工程包括特征的創(chuàng)建,而預(yù)處理涉及清理數(shù)據(jù)。

    我們經(jīng)常花費大量時間將數(shù)據(jù)精煉成對于建模有用的東西。為了使這項工作更有效,我想分享四個技巧,可以幫助你進(jìn)行特征工程和預(yù)處理。用于創(chuàng)建新特征,檢測異常值,處理不平衡數(shù)據(jù)和估算缺失值的技術(shù)可以說,開發(fā)機(jī)器學(xué)習(xí)模型的兩個最重要的步驟是特征工程和預(yù)處理。特征工程包括特征的創(chuàng)建,而預(yù)處理涉及清理數(shù)據(jù)。

    要注意到,領(lǐng)域知識是特征工程時最重要的事情之一(陳詞濫調(diào))。更好地了解你使用的特征可以幫助防止陷入欠擬合和過擬合的情況

    本鏈接(https://github.com/MaartenGr/feature-engineering)是特征工程分析的筆記。

    1. 重新采樣不平衡數(shù)據(jù)

    實際上,我們經(jīng)常會遇到不平衡的數(shù)據(jù)。如果目標(biāo)數(shù)據(jù)只有輕微的不平衡,這并不一定是一個問題。可以通過對數(shù)據(jù)使用適當(dāng)?shù)尿炞C措施來解決這個問題,比如平衡精度(Balanced Accuracy)精確召回曲線(Precision-Recall Curves)F1分?jǐn)?shù)(F1-score)

    不幸的是,情況并非總是如此,目標(biāo)變量可能非常不平衡(例如,10:1)。這種情況下,我們可以對該少數(shù)類(即樣本數(shù)少的類別)進(jìn)行過采樣,以便使用一種稱為SMOTE的技術(shù)來引入平衡。

    SMOTE

    SMOTE^SMOTE是合成少數(shù)類過采樣技術(shù) (Synthetic Minority Oversampling Technique)的縮寫,是一種用于增加少數(shù)類樣本的過采樣技術(shù)。

    它通過觀察目標(biāo)的特征空間和檢測最近鄰來生成新的樣本。然后,在相鄰樣本的特征空間內(nèi),簡單地選擇相似的樣本,每次隨機(jī)地改變一列。

    要實現(xiàn)SMOTE的模塊可以在imbalanced-learn包^imbalanced-learn中找到。導(dǎo)入該包并使用fit_transform方法:

    import pandas as pd
    from imblearn.over_sampling import SMOTE

    # 導(dǎo)入數(shù)據(jù)創(chuàng)建x和y
    df = pd.read_csv('creditcard_small.csv')
    X = df.iloc[:,:-1]
    y = df.iloc[:,-1].map({1:'Fraud'0:'No Fraud'})

    # 重新采樣數(shù)據(jù)
    X_resampled, y_resampled = SMOTE(sampling_strategy={'Fraud':1000}).fit_resample(X, y)
    X_resampled = pd.DataFrame(X_resampled, columns=X.columns)

    正如你所看到的,模型成功地對目標(biāo)變量進(jìn)行了過采樣。當(dāng)使用SMOTE進(jìn)行過采樣時,可以采用以下幾種策略:

    • “少數(shù)類(minority)”:僅重采樣少數(shù)類;

    • “非少數(shù)類(not minority)”:重新采樣除少數(shù)類以外的其他類;

    • “非多數(shù)類(not majority)”:重新采樣除了多數(shù)類的其他類;

    • '所有(all)':重新采樣所有類;

    • '詞典(dict)':鍵為目標(biāo)類,值對應(yīng)于每個目標(biāo)類所需的樣本數(shù)量。

    我選擇使用字典來指定我想要在多大程度上過采樣數(shù)據(jù)。

    附加提示1:如果數(shù)據(jù)集中有分類變量,那么可能會為那些不能發(fā)生的變量創(chuàng)建值。例如,如果有一個名為isMale的變量,它只能是0或1,SMOTE可能會創(chuàng)建0.365作為值。

    這種情況下,可以使用SMOTENC,它考慮到了分類變量的性質(zhì)。這個版本也可以在imbalanced-learn^imbalanced-learn包中找到。

    附加提示2:確保在訓(xùn)練集與測試集分割之后進(jìn)行過采樣,并且只對訓(xùn)練數(shù)據(jù)進(jìn)行過采樣。因為通常不在合成數(shù)據(jù)上測試模型的性能。

    2. 創(chuàng)建新的特征

    為了提高模型的質(zhì)量和預(yù)測能力,經(jīng)常從現(xiàn)有變量中創(chuàng)建新特征。我們可以在每對變量之間創(chuàng)建一些交互(例如,乘法或除法),希望找到一個有趣的新特征。然而,這是一個漫長的過程,需要大量的編碼。幸運的是,這可以使用深度特征綜合(Deep Feature Synthesis)自動完成。

    深度特征綜合

    深度特征綜合(DFS)是一種能夠快速創(chuàng)建具有不同深度的新變量的算法。例如,不僅可以對列進(jìn)行相乘,你也可以選擇先將列A與列B相乘,然后再添加列C。

    首先,讓我介紹將用于示例的數(shù)據(jù)。我選擇使用人力資源分析數(shù)據(jù)^人力資源分析數(shù)據(jù),因為這些特征很容易解釋:

    簡單地根據(jù)我們的直覺,我們可以將 average_monthly_hours 除以number_project的值添加為一個新變量。然而,如果我們只跟著直覺,我們可能會錯過很多的關(guān)系。

    如果你的數(shù)據(jù)如果是一個簡單的表格,你可以簡單地按照下面的代碼:

    import featuretools as ft
    import pandas as pd

    # 創(chuàng)建實體
    turnover_df = pd.read_csv('turnover.csv')
    es = ft.EntitySet(id = 'Turnover')
    es.entity_from_dataframe(entity_id = 'hr', dataframe = turnover_df, index = 'index')

    # 指定trans_primitives參數(shù)以執(zhí)行深度特征綜合
    feature_matrix, feature_defs = ft.dfs(entityset = es, target_entity = 'hr',
                                          trans_primitives = ['add_numeric''multiply_numeric'], 
                                          verbose=True)

    第一步是創(chuàng)建一個實體(entity),如果需要,可以從這個實體與其他表創(chuàng)建關(guān)系。接下來,我們可以簡單地運行ft.dfs來創(chuàng)建新變量。我們指定參數(shù)trans_primitives來表示以什么方式創(chuàng)建變量。這里我們選擇將數(shù)值變量相加或相乘。

    正如你在上面的圖中所看到的,我們僅使用幾行代碼就創(chuàng)建了另外668個特征。創(chuàng)建的一些特征示例:

    • last_evaluate乘以satisfaction_level

    • left乘以promotion_last_5years

    • average_monthly_hours乘以satisfaction_level加上time_spend_company

    附加技巧1:注意這里的實現(xiàn)是比較簡單基礎(chǔ)的。DFS最大的優(yōu)點是它可以進(jìn)行表之間的聚合中創(chuàng)建新的變量。有關(guān)示例,請參見此鏈接^鏈接。

    附加技巧2:運行ft.list_primitives(),以查看可以執(zhí)行的聚合的完整列表。它甚至處理時間戳(timestamps)、空值(null values)和經(jīng)緯度信息(long/lat information)。

    3. 處理缺失值

    像往常一樣,沒有一種處理缺失值的最佳方法。根據(jù)你的數(shù)據(jù),只需用特定組的平均值或模式填充它們就足夠了。然而,有一些高級技術(shù)使用數(shù)據(jù)的已知部分來估算(impute)缺失的值。
    其中一種方法來自Scikit-Learn中的一個新包叫做Iterative Imputer,它是基于R語言(MICE包)來估算缺失的變量。

    Iterative Imputer(迭代輸入器)

    雖然python是開發(fā)機(jī)器學(xué)習(xí)模型的一種很好的語言,但是仍然有很多方法在R中工作得更好。

    Iterative Imputer是由Scikit-Learn開發(fā)的,它將每個缺失值的特征作為其他特征的函數(shù)來建模。它使用該函數(shù)的值作為估算。在每個步驟中,選擇一個特征作為輸出y,其他所有特征作為輸入的X。然后在X和y上訓(xùn)練一個回歸器,用來預(yù)測y的缺失值。

    讓我們看一個例子。我使用的數(shù)據(jù)是著名的titanic數(shù)據(jù)集。在這個數(shù)據(jù)集中,Age列缺少我們希望填充的值。代碼總是很簡單:

    # 顯示的導(dǎo)入enable_iterative_imputer后
    # 再從sklearn.impute 導(dǎo)入IterativeImputer
    from sklearn.experimental import enable_iterative_imputer  
    from sklearn.impute import IterativeImputer

    from sklearn.ensemble import RandomForestRegressor
    import pandas as pd

    # 載入數(shù)據(jù)
    titanic = pd.read_csv('titanic.csv')
    titanic = titanic.loc[:, ['Pclass''Age''SibSp''Parch''Fare']]

    # 使用隨機(jī)森林估計器
    imp = IterativeImputer(RandomForestRegressor(), max_iter=10, random_state=0)
    titanic = pd.DataFrame(imp.fit_transform(titanic), columns=titanic.columns)

    這種方法的優(yōu)點是它允許使用你所選擇的估計器(estimator)。我使用隨機(jī)森林作為估計器來模擬在R中經(jīng)常使用的missForest。

    附加提示1:如果你有足夠的數(shù)據(jù),那么簡單地刪除缺少數(shù)據(jù)的示例可能是一個有吸引力的選項。但是,請記住,它可能會在你的數(shù)據(jù)中產(chǎn)生誤差,因為丟失的數(shù)據(jù)可能遵循了你錯過的模式。

    附加提示2:Iterative Imputer允許使用不同的估計器。經(jīng)過一些測試,我發(fā)現(xiàn)甚至可以使用Catboost作為估計器!不幸的是,LightGBM和XGBoost不能工作,因為它們的隨機(jī)狀態(tài)名(random state name)不同。

    4. 異常值檢測

    如果不能很好地理解數(shù)據(jù),就很難檢測出異常值。如果你很了解數(shù)據(jù),那么你可以很容易地指定數(shù)據(jù)還具有意義的閾值。

    有時這是不可能的,因為很難完全理解數(shù)據(jù)。這種情況下,你可以使用離群點檢測算法,比如流行的Isolation Forest

    Isolation Forest

    在Isolation Forest算法中,關(guān)鍵字是Isolation(孤立)。從本質(zhì)上說,該算法檢查了樣本是否容易被分離。這樣樣本就產(chǎn)生了一個孤立編號,這個孤立編號由隨機(jī)決策樹中孤立該樣本所需的分割數(shù)來計算。這個孤立編號在所有生成的樹上進(jìn)行平均。

    如果算法只需要做幾次分割就能找到一個樣本,那么該樣本更有可能是一個異常樣本。分割本身也是隨機(jī)劃分的,這樣異常樣本在樹中往往很淺(節(jié)點到根節(jié)點的路徑長度短)。因此,當(dāng)孤立編號在所有樹中都很小時,該樣本很可能是異常的。

    為了展示一個例子,我再次使用了我們之前使用的信用卡數(shù)據(jù)集:

    from sklearn.ensemble import IsolationForest
    import pandas as pd
    import seaborn as sns

    # 預(yù)測和可視化離群點
    credit_card = pd.read_csv('creditcard_small.csv').drop('Class'1)
    clf = IsolationForest(contamination=0.01, behaviour='new')
    outliers = clf.fit_predict(credit_card)
    sns.scatterplot(credit_card.V4, credit_card.V2, outliers, palette='Set1', legend=False)

    附加提示1:有一個擴(kuò)展版的IsolationForest可用,它改進(jìn)了一些缺點。然而,評論褒貶不一。

    結(jié)論

    希望本文中的技巧能夠幫助你設(shè)計和預(yù)處理這些特征,Jupyter寫的筆記在本鏈接: https://github.com/MaartenGr/feature-engineering/blob/master/Engineering%20Tips.ipynb

      本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 动漫AV纯肉无码AV电影网| 办公室强奷漂亮少妇同事| 人人澡人摸人人添| 欧美乱妇高清无乱码免费| 中文字幕无线码免费人妻| 熟女系列丰满熟妇AV| 欧洲人妻丰满AV无码久久不卡 | 又湿又紧又大又爽A视频| 丝袜人妻一区二区三区网站 | 办公室强奷漂亮少妇视频| 国产一区二区在线影院| 国内精品久久久久久无码不卡| 日韩在线视频线观看一区| 国产精品久久久久久AV| 亚洲人成电影在线天堂色| 国产人妇三级视频在线观看| 国产按头口爆吞精在线视频| 97人人添人人澡人人澡人人澡| 免费看女人与善牲交| 免费av深夜在线观看| 国内精品久久久久影院优| 国产乱码1卡二卡3卡四卡5 | 亚洲精品无码国产片| 中文人妻AV大区中文不卡| 午夜免费福利小电影| 超碰人人超碰人人| 在线看无码的免费网站| 日本理伦片午夜理伦片| 无码人妻斩一区二区三区 | 亚洲男女内射在线播放| 亚洲欧美日韩在线码| 麻豆成人精品国产免费| 国产亚洲一区二区在线观看| 亚洲国产精品久久久天堂麻豆宅男 | 饥渴的少妇2中文字幕| 亚洲中文字幕无码一区无广告| 亚洲中文久久久精品无码| 国产微拍精品一区二区| 国产亚洲欧美在线观看三区| 亚洲日本韩国欧美云霸高清| 少妇激情AV一区二区三区|