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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

sklearn 神经网络_sklearn中的数据预处理和特征工程

發(fā)布時間:2025/3/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sklearn 神经网络_sklearn中的数据预处理和特征工程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

小伙伴們大家好~o( ̄▽ ̄)ブ,今天我們看一下Sklearn中的數(shù)據(jù)預處理和特征工程,老規(guī)矩還是先強調(diào)一下,我的開發(fā)環(huán)境是Jupyter lab,所用的庫和版本大家參考:

Python 3.7.1(你的版本至少要3.4以上

Scikit-learn 0.20.0 (你的版本至少要0.19

Numpy 1.15.3, Pandas 0.23.4, Matplotlib 3.0.1, SciPy 1.1.0

1 sklearn中的數(shù)據(jù)預處理和特征工程

sklearn中包含眾多數(shù)據(jù)預處理和特征工程相關(guān)的模塊,雖然剛接觸sklearn時,大家都會為其中包含的各種算法的廣度深度所震驚,但其實sklearn六大板塊中有兩塊都是關(guān)于數(shù)據(jù)預處理和特征工程的,兩個板塊互相交互,為建模之前的全部工程打下基礎(chǔ)。

  • 模塊preprocessing:幾乎包含數(shù)據(jù)預處理的所有內(nèi)容
  • 模塊Impute:填補缺失值專用
  • 模塊feature_selection:包含特征選擇的各種方法的實踐
  • 模塊decomposition:包含降維算法

2 數(shù)據(jù)預處理 Preprocessing & Impute

2.1 數(shù)據(jù)無量綱化

在機器學習算法實踐中,我們往往有著將不同規(guī)格的數(shù)據(jù)轉(zhuǎn)換到同一規(guī)格,或不同分布的數(shù)據(jù)轉(zhuǎn)換到某個特定分布的需求,這種需求統(tǒng)稱為將數(shù)據(jù)“無量綱化”。譬如梯度和矩陣為核心的算法中,譬如邏輯回歸,支持向量機,神經(jīng)網(wǎng)絡(luò),無量綱化可以加快求解速度;而在距離類模型,譬如K近鄰,K-Means聚類中,無量綱化可以幫我們提升模型精度,避免某一個取值范圍特別大的特征對距離計算造成影響。(一個特例是決策樹和樹的集成算法們,對決策樹我們不需要無量綱化,決策樹可以把任意數(shù)據(jù)都處理得很好。)

數(shù)據(jù)的無量綱化可以是線性的,也可以是非線性的。線性的無量綱化包括中心化(Zero-centered或者Mean-subtraction)處理和縮放處理(Scale)。中心化的本質(zhì)是讓所有記錄減去一個固定值,即讓數(shù)據(jù)樣本數(shù)據(jù)平移到某個位置??s放的本質(zhì)是通過除以一個固定值,將數(shù)據(jù)固定在某個范圍之中,取對數(shù)也算是一種縮放處理。

  • preprocessing.MinMaxScaler

當數(shù)據(jù)(x)按照最小值中心化后,再按極差(最大值 - 最小值)縮放,數(shù)據(jù)移動了最小值個單位,并且會被收斂到[0,1]之間,而這個過程,就叫做數(shù)據(jù)歸一化(Normalization,又稱Min-Max Scaling)。注意,Normalization是歸一化,不是正則化,真正的正則化是regularization,不是數(shù)據(jù)預處理的一種手段。歸一化之后的數(shù)據(jù)服從正態(tài)分布,公式如下: $$ x^* = frac{x - min(x)}{max(x)-min(x)} $$ 在sklearn當中,我們使用preprocessing.MinMaxScaler來實現(xiàn)這個功能。MinMaxScaler有一個重要參數(shù),feature_range,控制我們希望把數(shù)據(jù)壓縮到的范圍,默認是[0,1]。

from sklearn.preprocessing import MinMaxScalerdata = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]#不太熟悉numpy的小伙伴,能夠判斷data的結(jié)構(gòu)嗎? #如果換成表是什么樣子? import pandas as pd pd.DataFrame(data)#實現(xiàn)歸一化 scaler = MinMaxScaler() #實例化 scaler = scaler.fit(data) #fit,在這里本質(zhì)是生成min(x)和max(x) result = scaler.transform(data) #通過接口導出結(jié)果 resultresult_ = scaler.fit_transform(data) #訓練和導出結(jié)果一步達成scaler.inverse_transform(result) #將歸一化后的結(jié)果逆轉(zhuǎn)#使用MinMaxScaler的參數(shù)feature_range實現(xiàn)將數(shù)據(jù)歸一化到[0,1]以外的范圍中data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] scaler = MinMaxScaler(feature_range=[5,10]) #依然實例化 result = scaler.fit_transform(data) #fit_transform一步導出結(jié)果 result#當X中的特征數(shù)量非常多的時候,fit會報錯并表示,數(shù)據(jù)量太大了我計算不了 #此時使用partial_fit作為訓練接口 #scaler = scaler.partial_fit(data)

BONUS: 使用numpy來實現(xiàn)歸一化

import numpy as np X = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])#歸一化 X_nor = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) X_nor#逆轉(zhuǎn)歸一化 X_returned = X_nor * (X.max(axis=0) - X.min(axis=0)) + X.min(axis=0) X_returned
  • preprocessing.StandardScaler

當數(shù)據(jù)(x)按均值(μ)中心化后,再按標準差(σ)縮放,數(shù)據(jù)就會服從為均值為0,方差為1的正態(tài)分布(即標準正態(tài)分布),而這個過程,就叫做數(shù)據(jù)標準化(Standardization,又稱Z-score normalization),公式如下: $$ x^* = frac{x-μ}sigma $$

from sklearn.preprocessing import StandardScaler data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]scaler = StandardScaler() #實例化 scaler.fit(data) #fit,本質(zhì)是生成均值和方差scaler.mean_ #查看均值的屬性mean_ scaler.var_ #查看方差的屬性var_x_std = scaler.transform(data) #通過接口導出結(jié)果x_std.mean() #導出的結(jié)果是一個數(shù)組,用mean()查看均值 x_std.std() #用std()查看方差scaler.fit_transform(data) #使用fit_transform(data)一步達成結(jié)果scaler.inverse_transform(x_std) #使用inverse_transform逆轉(zhuǎn)標準化

對于StandardScaler和MinMaxScaler來說,空值NaN會被當做是缺失值,在fit的時候忽略,在transform的時候保持缺失NaN的狀態(tài)顯示。并且,盡管去量綱化過程不是具體的算法,但在fit接口中,依然只允許導入至少二維數(shù)組,一維數(shù)組導入會報錯。通常來說,我們輸入的X會是我們的特征矩陣,現(xiàn)實案例中特征矩陣不太可能是一維所以不會存在這個問題。

  • StandardScaler和MinMaxScaler選哪個?

看情況。大多數(shù)機器學習算法中,會選擇StandardScaler來進行特征縮放,因為MinMaxScaler對異常值非常敏感。在PCA,聚類,邏輯回歸,支持向量機,神經(jīng)網(wǎng)絡(luò)這些算法中,StandardScaler往往是最好的選擇。

MinMaxScaler在不涉及距離度量、梯度、協(xié)方差計算以及數(shù)據(jù)需要被壓縮到特定區(qū)間時使用廣泛,比如數(shù)字圖像處理中量化像素強度時,都會使用MinMaxScaler將數(shù)據(jù)壓縮于[0,1]區(qū)間之中。

建議先試試看StandardScaler,效果不好換MinMaxScaler。

除了StandardScaler和MinMaxScaler之外,sklearn中也提供了各種其他縮放處理(中心化只需要一個pandas廣播一下減去某個數(shù)就好了,因此sklearn不提供任何中心化功能)。比如,在希望壓縮數(shù)據(jù),卻不影響數(shù)據(jù)的稀疏性時(不影響矩陣中取值為0的個數(shù)時),我們會使用MaxAbsScaler;在異常值多,噪聲非常大時,我們可能會選用分位數(shù)來無量綱化,此時使用RobustScaler。更多詳情請參考以下列表。

2.2 缺失值

機器學習和數(shù)據(jù)挖掘中所使用的數(shù)據(jù),永遠不可能是完美的。很多特征,對于分析和建模來說意義非凡,但對于實際收集數(shù)據(jù)的人卻不是如此,因此數(shù)據(jù)挖掘之中,常常會有重要的字段缺失值很多,但又不能舍棄字段的情況。因此,數(shù)據(jù)預處理中非常重要的一項就是處理缺失值。

import pandas as pd data = pd.read_csv(r"C:worklearnbettermicro-classweek 3 PreprocessingNarrativedata.csv",index_col=0)data.head()

在這里,我們使用從泰坦尼克號提取出來的數(shù)據(jù),這個數(shù)據(jù)有三個特征,一個數(shù)值型,兩個字符型,標簽也是字符型。從這里開始,我們就使用這個數(shù)據(jù)給大家作為例子,讓大家慢慢熟悉sklearn中數(shù)據(jù)預處理的各種方式。

  • impute.SimpleImputer

class sklearn.impute.SimpleImputer(missing_values=nan, strategy=’mean’, fill_value=None, verbose=0, copy=True)

在講解隨機森林的案例時,我們用這個類和隨機森林回歸填補了缺失值,對比了不同的缺失值填補方式對數(shù)據(jù)的影響。這個類是專門用來填補缺失值的。它包括四個重要參數(shù):

| 參數(shù) | 含義&輸入 | | -------------- | ------------------------------------------------------------ | | missing_values | 告訴SimpleImputer,數(shù)據(jù)中的缺失值長什么樣,默認空值np.nan | | strategy | 我們填補缺失值的策略,默認均值。
輸入“mean”使用均值填補(僅對數(shù)值型特征可用)
輸入“median"用中值填補(僅對數(shù)值型特征可用)
輸入"most_frequent”用眾數(shù)填補(對數(shù)值型和字符型特征都可用)
輸入“constant"表示請參考參數(shù)“fill_value"中的值(對數(shù)值型和字符型特征都可用) | | fill_value | 當參數(shù)startegy為”constant"的時候可用,可輸入字符串或數(shù)字表示要填充的值,常用0 | | copy | 默認為True,將創(chuàng)建特征矩陣的副本,反之則會將缺失值填補到原本的特征矩陣中去。 |

data.info() #填補年齡Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn當中特征矩陣必須是二維 Age[:20]from sklearn.impute import SimpleImputer imp_mean = SimpleImputer() #實例化,默認均值填補 imp_median = SimpleImputer(strategy="median") #用中位數(shù)填補 imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填補imp_mean = imp_mean.fit_transform(Age) #fit_transform一步完成調(diào)取結(jié)果 imp_median = imp_median.fit_transform(Age) imp_0 = imp_0.fit_transform(Age)imp_mean[:20] imp_median[:20] imp_0[:20]#在這里我們使用中位數(shù)填補Age data.loc[:,"Age"] = imp_mediandata.info()#使用眾數(shù)填補Embarked Embarked = data.loc[:,"Embarked"].values.reshape(-1,1) imp_mode = SimpleImputer(strategy = "most_frequent") data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)data.info()

BONUS:用Pandas和Numpy進行填補其實更加簡單

import pandas as pd data = pd.read_csv(r"C:worklearnbettermicro-classweek 3 PreprocessingNarrativedata.csv",index_col=0)data.head()data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median()) #.fillna 在DataFrame里面直接進行填補data.dropna(axis=0,inplace=True) #.dropna(axis=0)刪除所有有缺失值的行,.dropna(axis=1)刪除所有有缺失值的列 #參數(shù)inplace,為True表示在原數(shù)據(jù)集上進行修改,為False表示生成一個復制對象,不修改原數(shù)據(jù),默認False

2.3 處理分類型特征:編碼與啞變量

在機器學習中,大多數(shù)算法,譬如邏輯回歸,支持向量機SVM,k近鄰算法等都只能夠處理數(shù)值型數(shù)據(jù),不能處理文字,在sklearn當中,除了專用來處理文字的算法,其他算法在fit的時候全部要求輸入數(shù)組或矩陣,也不能夠?qū)胛淖中蛿?shù)據(jù)(其實手寫決策樹和普斯貝葉斯可以處理文字,但是sklearn中規(guī)定必須導入數(shù)值型)。然而在現(xiàn)實中,許多標簽和特征在數(shù)據(jù)收集完畢的時候,都不是以數(shù)字來表現(xiàn)的。比如說,學歷的取值可以是["小學",“初中”,“高中”,"大學"],付費方式可能包含["支付寶",“現(xiàn)金”,“微信”]等等。在這種情況下,為了讓數(shù)據(jù)適應算法和庫,我們必須將數(shù)據(jù)進行編碼,即是說,將文字型數(shù)據(jù)轉(zhuǎn)換為數(shù)值型。

  • preprocessing.LabelEncoder:標簽專用,能夠?qū)⒎诸愞D(zhuǎn)換為分類數(shù)值
from sklearn.preprocessing import LabelEncodery = data.iloc[:,-1] #要輸入的是標簽,不是特征矩陣,所以允許一維le = LabelEncoder() #實例化 le = le.fit(y) #導入數(shù)據(jù) label = le.transform(y) #transform接口調(diào)取結(jié)果le.classes_ #屬性.classes_查看標簽中究竟有多少類別 label #查看獲取的結(jié)果labelle.fit_transform(y) #也可以直接fit_transform一步到位le.inverse_transform(label) #使用inverse_transform可以逆轉(zhuǎn)data.iloc[:,-1] = label #讓標簽等于我們運行出來的結(jié)果data.head()#如果不需要教學展示的話我會這么寫: from sklearn.preprocessing import LabelEncoder data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
  • preprocessing.OrdinalEncoder:特征專用,能夠?qū)⒎诸愄卣鬓D(zhuǎn)換為分類數(shù)值
from sklearn.preprocessing import OrdinalEncoder#接口categories_對應LabelEncoder的接口classes_,一模一樣的功能 data_ = data.copy()data_.head()OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])data_.head()
  • preprocessing.OneHotEncoder:獨熱編碼,創(chuàng)建啞變量

我們剛才已經(jīng)用OrdinalEncoder把分類變量Sex和Embarked都轉(zhuǎn)換成數(shù)字對應的類別了。在艙門Embarked這一列中,我們使用[0,1,2]代表了三個不同的艙門,然而這種轉(zhuǎn)換是正確的嗎?

我們來思考三種不同性質(zhì)的分類數(shù)據(jù):

1) 艙門(S,C,Q)

? 三種取值S,C,Q是相互獨立的,彼此之間完全沒有聯(lián)系,表達的是S≠C≠Q(mào)的概念。這是名義變量。

2) 學歷(小學,初中,高中)

? 三種取值不是完全獨立的,我們可以明顯看出,在性質(zhì)上可以有高中>初中>小學這樣的聯(lián)系,學歷有高低,但是學歷取值之間卻不是可以計算的,我們不能說小學 + 某個取值 = 初中。這是有序變量。

3) 體重(>45kg,>90kg,>135kg)

? 各個取值之間有聯(lián)系,且是可以互相計算的,比如120kg - 45kg = 90kg,分類之間可以通過數(shù)學計算互相轉(zhuǎn)換。這是有距變量。

然而在對特征進行編碼的時候,這三種分類數(shù)據(jù)都會被我們轉(zhuǎn)換為[0,1,2],這三個數(shù)字在算法看來,是連續(xù)且可以計算的,這三個數(shù)字相互不等,有大小,并且有著可以相加相乘的聯(lián)系。所以算法會把艙門,學歷這樣的分類特征,都誤會成是體重這樣的分類特征。這是說,我們把分類轉(zhuǎn)換成數(shù)字的時候,忽略了數(shù)字中自帶的數(shù)學性質(zhì),所以給算法傳達了一些不準確的信息,而這會影響我們的建模。

類別OrdinalEncoder可以用來處理有序變量,但對于名義變量,我們只有使用啞變量的方式來處理,才能夠盡量向算法傳達最準確的信息:

這樣的變化,讓算法能夠徹底領(lǐng)悟,原來三個取值是沒有可計算性質(zhì)的,是“有你就沒有我”的不等概念。在我們的數(shù)據(jù)中,性別和艙門,都是這樣的名義變量。因此我們需要使用獨熱編碼,將兩個特征都轉(zhuǎn)換為啞變量。

data.head()from sklearn.preprocessing import OneHotEncoder X = data.iloc[:,1:-1]enc = OneHotEncoder(categories='auto').fit(X) result = enc.transform(X).toarray() result#依然可以直接一步到位,但為了給大家展示模型屬性,所以還是寫成了三步 OneHotEncoder(categories='auto').fit_transform(X).toarray()#依然可以還原 pd.DataFrame(enc.inverse_transform(result))enc.get_feature_names()result result.shape#axis=1,表示跨行進行合并,也就是將量表左右相連,如果是axis=0,就是將量表上下相連 newdata = pd.concat([data,pd.DataFrame(result)],axis=1)newdata.head()newdata.drop(["Sex","Embarked"],axis=1,inplace=True)newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]newdata.head()

特征可以做啞變量,標簽也可以嗎?可以,使用類sklearn.preprocessing.LabelBinarizer可以對做啞變量,許多算法都可以處理多標簽問題(比如說決策樹),但是這樣的做法在現(xiàn)實中不常見,因此我們在這里就不贅述了。

2.4 處理連續(xù)型特征:二值化與分段

  • sklearn.preprocessing.Binarizer

根據(jù)閾值將數(shù)據(jù)二值化(將特征值設(shè)置為0或1),用于處理連續(xù)型變量。大于閾值的值映射為1,而小于或等于閾值的值映射為0。默認閾值為0時,特征中所有的正值都映射到1。二值化是對文本計數(shù)數(shù)據(jù)的常見操作,分析人員可以決定僅考慮某種現(xiàn)象的存在與否。它還可以用作考慮布爾隨機變量的估計器的預處理步驟(例如,使用貝葉斯設(shè)置中的伯努利分布建模)。

#將年齡二值化data_2 = data.copy()from sklearn.preprocessing import Binarizer X = data_2.iloc[:,0].values.reshape(-1,1) #類為特征專用,所以不能使用一維數(shù)組 transformer = Binarizer(threshold=30).fit_transform(X)transformer
  • preprocessing.KBinsDiscretizer

這是將連續(xù)型變量劃分為分類變量的類,能夠?qū)⑦B續(xù)型變量排序后按順序分箱后編碼??偣舶齻€重要參數(shù):

from sklearn.preprocessing import KBinsDiscretizerX = data.iloc[:,0].values.reshape(-1,1) 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()

總結(jié)

以上是生活随笔為你收集整理的sklearn 神经网络_sklearn中的数据预处理和特征工程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。