日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

特征工程(上)

發布時間:2025/3/21 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特征工程(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 預覽數據
  • 數據預處理
    • 缺失值處理
    • 數值型
      • 數值縮放
      • 統計值
      • 離散化/分箱/分桶
  • 特征選擇
    • Filter
      • 卡方(Chi2)檢驗
      • Pearson相關系數
    • Wrapper
      • 遞歸特征消除
    • Embedded
      • 基于L1的特征選擇

特征工程可能包含的內容

  • 基礎特征構造
  • 數據預處理
  • 特征衍生
  • 特征變換
  • 特征篩選
  • 本文以kaggle入門賽的Titanic數據集為例,講解一些特征工程中通用的方法,主要是數據預處理這部分。

    預覽數據

    import pandas as pd import numpy as npdf_train = pd.read_csv('train.csv') df_train.shape df_train.info() df_train.describe()#變量的百分位以及離群點 %matplotlib inline df_train.boxplot(column='Age')%matplotlib inline import seaborn as sns sns.set(color_codes=True) np.random.seed(sum(map(ord, "distributions"))) sns.distplot(df_train.Age, kde=True, bins=20, rug=True)

    數據預處理

    缺失值處理

    df_train['Age'].fillna(value=df_train['Age'].mean())from sklearn.preprocessing import Imputer imp = Imputer(missing_values='NaN', strategy='mean', axis=0) age = imp.fit_transform(df_train[['Age']].values).copy() df_train.loc[:,'Age'] = df_train['Age'].fillna(value=df_train['Age'].mean()).copy()

    數值型

    數值縮放

    # 取對數等變換 import numpy as np log_age = df_train['Age'].apply(lambda x:np.log(x)) df_train.loc[:,'log_age'] = log_age# 幅度縮放,最大最小值縮放到[0,1]區間內 from sklearn.preprocessing import MinMaxScaler mm_scaler = MinMaxScaler() fare_trans = mm_scaler.fit_transform(df_train[['Fare']])# 幅度縮放,將每一列的數據標準化為正態分布的 from sklearn.preprocessing import StandardScaler std_scaler = StandardScaler() fare_std_trans = std_scaler.fit_transform(df_train[['Fare']])#中位數或者四分位數去中心化數據,對異常值不敏感 from sklearn.preprocessing import robust_scale fare_robust_trans = robust_scale(df_train[['Fare','Age']])#將同一行數據規范化,前面的同一變為1以內也可以達到這樣的效果 from sklearn.preprocessing import Normalizer normalizer = Normalizer() fare_normal_trans = normalizer.fit_transform(df_train[['Age','Fare']]) fare_normal_trans

    統計值

    # 最大最小值 max_age = df_train['Age'].max() min_age = df_train["Age"].min()# 分位數,極值處理,我們最粗暴的方法就是將前后1%的值抹去 age_quarter_01 = df_train['Age'].quantile(0.01) age_quarter_99 = df_train['Age'].quantile(0.99)# 四則運算 df_train.loc[:,'family_size'] = df_train['SibSp']+df_train['Parch']+1# 多項式特征生成 from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree=2) df_train[['SibSp','Parch']].head() poly_fea = poly.fit_transform(df_train[['SibSp','Parch']])

    離散化/分箱/分桶

    #等距切分 df_train.loc[:, 'fare_cut'] = pd.cut(df_train['Fare'], 20)# 等頻切分 df_train.loc[:,'fare_qcut'] = pd.qcut(df_train['Fare'], 10)#OneHot encoding/獨熱向量編碼 embarked_oht = pd.get_dummies(df_train[['Embarked']])

    特征選擇

    一般可以從兩個方面考慮來選擇特征:

  • 特征是否發散
    如果一個特征不發散,例如方差接近于0,也就是說樣本在這個特征上基本上沒有差異,這個特征對于樣本的區分并沒有什么用。

  • 特征與目標的相關性
    這點比較顯見,與目標相關性高的特征,應當優選選擇。除移除低方差法外,本文介紹的其他方法均從相關性考慮。

  • 特征選擇可以分為3種:

  • Filter:過濾法,按照發散性或者相關性對各個特征進行評分,設定閾值或者待選擇閾值的個數,選擇特征。
    • 移除低方差的特征
    • 單變量特征選擇
  • Wrapper:包裝法,根據目標函數(通常是預測效果評分),每次選擇若干特征,或者排除若干特征。
    • 遞歸特征消除
  • Embedded:嵌入法,先使用某些機器學習的算法和模型進行訓練,得到各個特征的權值系數,根據系數從大到小選擇特征。類似于Filter方法,但是是通過訓練來確定特征的優劣。
    • 使用SelectFromModel選擇特征
    • 將特征選擇過程融入pipeline
  • Filter

  • 移除低方差的特征
  • from sklearn.feature_selection import VarianceThreshold X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]] sel = VarianceThreshold(threshold=(.8 * (1 - .8))) sel.fit_transform(X)
  • 單變量特征選擇
  • 對于分類問題(y離散),可采用:

    • 卡方檢驗
    • f_classif
    • mutual_info_classif
    • 互信息

    對于回歸問題(y連續),可采用:

    • 皮爾森相關系數
    • f_regression,
    • mutual_info_regression
    • 最大信息系數

    卡方(Chi2)檢驗

    經典的卡方檢驗是檢驗定性自變量對定性因變量的相關性。比如,我們可以對樣本進行一次chi2 測試來選擇最佳的兩項特征:

    from sklearn.datasets import load_iris from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 iris = load_iris() X, y = iris.data, iris.target X_new = SelectKBest(chi2, k=2).fit_transform(X, y)

    Pearson相關系數

    皮爾森相關系數是一種最簡單的,能幫助理解特征和響應變量之間關系的方法,該方法衡量的是變量之間的線性相關性。

    import numpy as np from scipy.stats import pearsonr np.random.seed(0) size = 300 x = np.random.normal(0, 1, size) # pearsonr(x, y)的輸入為特征矩陣和目標向量,能夠同時計算 相關系數 和p-value. print("Lower noise", pearsonr(x, x + np.random.normal(0, 1, size))) print("Higher noise", pearsonr(x, x + np.random.normal(0, 10, size)))

    注意,使用Pearson相關系數主要是為了看特征之間的相關性,而不是和因變量之間的。

    Wrapper

    遞歸特征消除

    遞歸消除特征法使用一個基模型來進行多輪訓練,每輪訓練后,移除若干權值系數的特征,再基于新的特征集進行下一輪訓練。

    對特征含有權重的預測模型(例如,線性模型對應參數coefficients),RFE通過遞歸減少考察的特征集規模來選擇特征。首先,預測模型在原始特征上訓練,每個特征指定一個權重。之后,那些擁有最小絕對值權重的特征被踢出特征集。如此往復遞歸,直至剩余的特征數量達到所需的特征數量。

    RFECV 通過交叉驗證的方式執行RFE,以此來選擇最佳數量的特征:對于一個數量為d的feature的集合,他的所有的子集的個數是2的d次方減1(包含空集)。指定一個外部的學習算法,比如SVM之類的。通過該算法計算所有子集的validation error。選擇error最小的那個子集作為所挑選的特征。

    from sklearn.feature_selection import RFE from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_irisrf = RandomForestClassifier() iris=load_iris() X,y=iris.data,iris.target rfe = RFE(estimator=rf, n_features_to_select=3) X_rfe = rfe.fit_transform(X,y) X_rfe.shape

    Embedded

    基于L1的特征選擇

    使用L1范數作為懲罰項的線性模型(Linear models)會得到稀疏解:大部分特征對應的系數為0。當你希望減少特征的維度以用于其它分類器時,可以通過 feature_selection.SelectFromModel 來選擇不為0的系數。

    特別指出,常用于此目的的稀疏預測模型有 linear_model.Lasso(回歸), linear_model.LogisticRegression 和 svm.LinearSVC(分類)

    from sklearn.feature_selection import SelectFromModel from sklearn.svm import LinearSVC lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X,y) model = SelectFromModel(lsvc, prefit=True) X_embed = model.transform(X) X_embed.shape

    說了這么多,大概把特征工程中經典的方法都提了。大家可能看的云里霧里的,上手做工程的時候還是一臉懵圈。明天還會更一篇,主要針對風控建模中常用的特征工程的方法,今天的內容有個大致的了解就行。

    【作者】:Labryant
    【原創公眾號】:風控獵人
    【簡介】:某創業公司策略分析師,積極上進,努力提升。乾坤未定,你我都是黑馬。
    【轉載說明】:轉載請說明出處,謝謝合作!~

    總結

    以上是生活随笔為你收集整理的特征工程(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。