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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

利用多项式特征生成与递归特征消除解决特征组合与特征选择问题

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用多项式特征生成与递归特征消除解决特征组合与特征选择问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 項目背景
    • 技術棧
    • 實現
      • 數據
      • 代碼
    • 總結

項目背景

無論是對于什么數據都存在兩個非常經典的問題:問題一是,數據與標簽之間,數據與數據之間的一些實際關系很難搞清楚。有些時候特征A,特征B可能都與標簽存在正向關系。然而實際上的關系卻可能是標簽與特征A,B的乘積存在實際關系;問題二,在不同機器學習的模型中,特征的最佳選擇往往并不一致。比如當模型選擇為模型model1的時候,特征可能為特征ABC,而當模型變為model2的時候,最佳特征可能就變為了ACD。

為了解決這兩個問題,有一個比較成熟的自動化方案可供我們使用。那就是多項式特征生成與自動特征選擇。

這里我們借助sklearn中的多項式特征生成(sklearn.preprocessing.PolynomialFeatures)與RFECV(sklearn.feature_selection.RFECV,遞歸式特征消除)來解決這個問題。前者的作用是自動生成多項式特征,如,x1,x2,生成特征為x1**x1,x1*x2,x2**x2等。而遞歸式特征消除,則是一種利用模型進行特征消除的方法,需要模型本身帶有特征的重要程度這一項,之后則不斷地遞歸調用自身,將不重要的特征去除,直到去除某個特征后,模型的預測效果下降為止。

技術棧

  • Python3
  • scikit-learn
  • pandas
  • numpy
  • matplotlib

實現

數據

特征的自由組合有時會帶來性能提升,但并不一定一定是有效的。更多的時候我們需要要考慮的是實際業務的需要。這里我們選擇UCI的紅酒質量數據集進行處理,從實際業務上來說,紅酒質量數據集中的特征都是單項的紅酒指標,但是實際上紅酒的評分本就并非直接與單項數據成正比,有些則是與特征之間的組合或者特征的幾次方成有效關系。因此我們這里就是用多項式特征生成與遞歸特征消除來自動獲取符合實際業務的模型。

該數據的下載可以前往:http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv

代碼

首先加載有關類庫

import numpy as np from sklearn.feature_selection import RFECV from sklearn.linear_model import LassoCV from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler

之后創建數據加載的方法,并調用數據;要注意的是我們這里使用的train_test_split方法進行數據的分割,其中test_size=0.30,表示分割出百分之三十的數據作為測試數據集,隨機數種子為random_state=531,為隨機數種子賦值后我們將

def GetDataByPandas():import pandas as pdwine = pd.read_csv("/home/fonttian/Data/dataset/wine/wine.csv")y = np.array(wine.quality)X = np.array(wine.drop("quality", axis=1))columns = np.array(wine.columns)return X, y, columns X, y, wineNames = GetDataByPandas() scalar = StandardScaler() X = scalar.fit_transform(X)train_data, test_data, train_labels, test_labels = train_test_split(X, y, test_size=0.30, random_state=531)

之后首先使用多項式特征生成方法進行特征的自動生成,具體代碼如下:

from sklearn.preprocessing import PolynomialFeaturespoly = PolynomialFeatures(2) print("原始數據的形狀:") print(train_data.shape) train_data_new = poly.fit_transform(train_data) test_data_new = poly.fit_transform(test_data) print("生成多項式特征之后的數據形狀:") print(train_data_new.shape) 原始數據的形狀: (1119, 11) 生成多項式特征之后的數據形狀: (1119, 78)

此處參數2表示,特征生成的程度,如果需要生成3程度(也就是三次方和三個特征自由組合),只需要設置參數為3即可。另外還有一個參數interaction_only,表示是否只生成交互特征,如果為True,將不會生成特征與自身交互產生的特征(也就是幾次方之類的),該參數默認為False。
之后我們需要選擇一個模型進行數據的預測,同時為了方便觀察以及避免超參數帶來的偶然性。我們這里選擇LassoCV方法進行建模,該方法會使用交叉驗證自動選擇Lasso的最佳超參數alpha,這樣可以很大程度避免默認超參數對實際結果的影響。具體代碼如下:

%matplotlib inline def LassoCV_plot(model):import matplotlib.pyplot as plotplot.figure()plot.plot(model.alphas_, model.mse_path_, ':')plot.plot(model.alphas_, model.mse_path_.mean(axis=-1),label='Average MSE Across Folds', linewidth=2)plot.axvline(model.alpha_, linestyle='--',label='CV Estimate of Best alpha')plot.semilogx()plot.legend()ax = plot.gca()ax.invert_xaxis()plot.xlabel('alpha')plot.ylabel('Mean Square Error')plot.axis('tight')plot.show()# print out the value of alpha that minimizes the Cv-errorprint("alpha Value that Minimizes CV Error ", model.alpha_)print("Minimum MSE ", min(model.mse_path_.mean(axis=-1)))# Call LassoCV from sklearn.linear_model lcv_1 = LassoCV(cv=10,n_jobs=-1) wineModel = lcv_1.fit(train_data, train_labels) LassoCV_plot(wineModel) lcv_2 = LassoCV(cv=10,n_jobs=-1) wineModel_new = lcv_2.fit(train_data_new, train_labels) LassoCV_plot(wineModel_new)estimator = LassoCV(cv=10,n_jobs=-1) selector = RFECV(estimator, step=1, cv=5,n_jobs=-1) selector = selector.fit(X, y)selector_train_data = selector.fit_transform(train_data, train_labels) test_data_selector = selector.transform(test_data)

alpha Value that Minimizes CV Error 0.005057237342969403 Minimum MSE 0.42849753501285

alpha Value that Minimizes CV Error 0.0061927974491236 Minimum MSE 0.4236178162163108

從最終結果來看,我們直接使用生成的67種特征+原11種特征進行建模的效果并不好于直接使用原11種特征,這是必然是因為產生了大量的無用特征的緣故。下一步我們就需要借助遞歸式特征消除進行特征選擇,將真正有效的特征選擇出來。

print("使用特征選擇,并進行效果對比:")estimator = LassoCV(cv=10,n_jobs=-1) selector = RFECV(estimator, step=1, cv=5,n_jobs=-1) selector = selector.fit(X, y)selector_train_data = selector.fit_transform(train_data, train_labels) test_data_selector = selector.transform(test_data)print("特征選擇之后數據的shape:",selector_train_data.shape) wineModel = lcv_1.fit(selector_train_data, train_labels) print("alpha Value that Minimizes CV Error ", wineModel.alpha_) print("Minimum MSE ", min(wineModel.mse_path_.mean(axis=-1)))selector_train_data_new = selector.fit_transform(train_data_new, train_labels) test_data_new_selector = selector.transform(test_data_new)print("特征選擇之后數據的shape:",selector_train_data_new.shape) wineModel_new = lcv_2.fit(selector_train_data_new, train_labels) print("alpha Value that Minimizes CV Error ", wineModel_new.alpha_) print("Minimum MSE ", min(wineModel_new.mse_path_.mean(axis=-1))) 使用特征選擇,并進行效果對比: 特征選擇之后數據的shape: (1119, 7) alpha Value that Minimizes CV Error 0.0008837665882418426 Minimum MSE 0.427181140352486 特征選擇之后數據的shape: (1119, 38) alpha Value that Minimizes CV Error 0.00038256145886961614 Minimum MSE 0.4002180554706169

上面即是進行特征選擇后的實際結果,可以很明顯的看到,如果僅僅對原始數據進行特征選擇,那么大概能夠降低0.00413的平均誤差以及0.001的最小MSE;但是在對生成的多項式特征進行特征選擇之后,其結果則得到的極大的下降(0.00588,0.234)。而且各位重要的是進行特征選擇后的多項式數據集的擬合結果已經明顯高于原有數據集的擬合結果。但是除了擬合結果之外更好地應該是預測結果的變化,下面的代碼則是預測結果的變化:

# 輸出預測值 def show_prediction(model, X, y):prediction = model.predict(X)print("RMSE", np.sqrt(mean_squared_error(y, prediction)))print("MSE", mean_squared_error(y, prediction))show_prediction(lcv_1, test_data_selector, test_labels) show_prediction(lcv_2, test_data_new_selector, test_labels) RMSE 0.6440234501860966 MSE 0.4147662043896037 RMSE 0.6390612669439588 MSE 0.40839930290801785

總結

從預測結果看,很明顯經過多項式特征生成與遞歸特征消除的模型效果依舊要好于原有模型很多。同時更重要的地方在于,目前對于模型效果具有正面效果的數據很有可能是有意義的特殊特征組合。利用該方法我們也可以快速的獲得一個可能有用特殊意義的特征組合的集合,并引導我們發現這些特殊特征組合的現實意義。

總結

以上是生活随笔為你收集整理的利用多项式特征生成与递归特征消除解决特征组合与特征选择问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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