0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

機(jī)器學(xué)習(xí)中如何實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換?數(shù)據(jù)轉(zhuǎn)化的方法實(shí)踐詳細(xì)概述

lviY_AI_shequ ? 來源:未知 ? 作者:易水寒 ? 2018-08-18 09:36 ? 次閱讀

一.標(biāo)準(zhǔn)化的原因

通常情況下是為了消除量綱的影響。譬如一個(gè)百分制的變量與一個(gè)5分值的變量在一起怎么比較?只有通過數(shù)據(jù)標(biāo)準(zhǔn)化,都把它們標(biāo)準(zhǔn)到同一個(gè)標(biāo)準(zhǔn)時(shí)才具有可比性,一般標(biāo)準(zhǔn)化采用的是Z標(biāo)準(zhǔn)化,即均值為0,方差為1,當(dāng)然也有其他標(biāo)準(zhǔn)化,比如0--1標(biāo)準(zhǔn)化等等,可根據(jù)自己的數(shù)據(jù)分布情況和模型來選擇

二.適用情況

看模型是否具有伸縮不變性。

不是所有的模型都一定需要標(biāo)準(zhǔn)化,有些模型對量綱不同的數(shù)據(jù)比較敏感,譬如SVM等。當(dāng)各個(gè)維度進(jìn)行不均勻伸縮后,最優(yōu)解與原來不等價(jià),這樣的模型,除非原始數(shù)據(jù)的分布范圍本來就不叫接近,否則必須進(jìn)行標(biāo)準(zhǔn)化,以免模型參數(shù)被分布范圍較大或較小的數(shù)據(jù)主導(dǎo)。但是如果模型在各個(gè)維度進(jìn)行不均勻伸縮后,最優(yōu)解與原來等價(jià),例如logistic regression等,對于這樣的模型,是否標(biāo)準(zhǔn)化理論上不會改變最優(yōu)解。但是,由于實(shí)際求解往往使用迭代算法,如果目標(biāo)函數(shù)的形狀太“扁”,迭代算法可能收斂得很慢甚至不收斂。所以對于具有伸縮不變性的模型,最好也進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化。

三.三種數(shù)據(jù)變換方法的含義與應(yīng)用

Rescaling(重縮放/歸一化):通常是指增加或者減少一個(gè)常數(shù),然后乘以/除以一個(gè)常數(shù),來改變數(shù)據(jù)的衡量單位。例如:將溫度的衡量單位從攝氏度轉(zhuǎn)化為華氏溫度。

Normalizing(正則化):通常是指除以向量的范數(shù)。例如:將一個(gè)向量的歐氏長度等價(jià)于1 。在神經(jīng)網(wǎng)絡(luò)中,“正則化”通常是指將向量的范圍重縮放至最小化或者一定范圍,使所有的元素都在[0,1]范圍內(nèi)。通常用于文本分類或者文本聚類中。

Standardizing(標(biāo)準(zhǔn)化):通常是為了消除不同屬性或樣方間的不齊性,使同一樣方內(nèi)的不同屬性間或同一屬性在不同樣方內(nèi)的方差減小。例如:如果一個(gè)向量包含高斯分布的隨機(jī)值,你可能會通過除以標(biāo)準(zhǔn)偏差來減少均值,然后獲得零均值單位方差的“標(biāo)準(zhǔn)正態(tài)”隨機(jī)變量。

那么問題是,當(dāng)我們在訓(xùn)練模型的時(shí)候,一定要對數(shù)據(jù)進(jìn)行變換嗎?這得視情況而定。很多人對多層感知機(jī)有個(gè)誤解,認(rèn)為輸入的數(shù)據(jù)必須在[0,1]這個(gè)范圍內(nèi)。雖然標(biāo)準(zhǔn)化后在訓(xùn)練模型效果會更好,但實(shí)際上并沒有這個(gè)要求。但是最好使輸入數(shù)據(jù)中心集中在0周圍,所以把數(shù)據(jù)縮放到[0,1]其實(shí)并不是一個(gè)好的選擇。

如果你的輸出激活函數(shù)的范圍是[0,1](sigmoid函數(shù)的值域),那你必須保證你的目標(biāo)值也在這個(gè)范圍內(nèi)。但通常請款下,我們會使輸出激活函數(shù)的范圍適應(yīng)目標(biāo)函數(shù)的分布,而不是讓你的數(shù)據(jù)來適應(yīng)激活函數(shù)的范圍。

當(dāng)我們使用激活函數(shù)的范圍為[0,1]時(shí),有些人可能更喜歡把目標(biāo)函數(shù)縮放到[0.1,0.9]這個(gè)范圍。我懷疑這種小技巧的之所以流行起來是因?yàn)榉聪騻鞑サ臉?biāo)準(zhǔn)化太慢了導(dǎo)致的。但用這種方法可能會使輸出的后驗(yàn)概率值不對。如果你使用一個(gè)有效的訓(xùn)練算法的話,完全不需要用這種小技巧,也沒有必要去避免溢出(overflow)

四.具體方法及代碼

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

1.1scale----零均值單位方差

from sklearn import preprocessing import numpy as np #raw_data X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) X_scaled = preprocessing.scale(X) #output X_scaled = [[ 0. -1.22474487 1.33630621] [ 1.22474487 0. -0.26726124] [-1.22474487 1.22474487 -1.06904497]] #scaled之后的數(shù)據(jù)零均值,單位方差 X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.]) X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])

1.2StandardScaler----計(jì)算訓(xùn)練集的平均值和標(biāo)準(zhǔn)差,以便測試數(shù)據(jù)集使用相同的變換

scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True) scaler.mean_ #out: array([ 1., 0. , 0.33333333]) scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913]) #測試將該scaler用于輸入數(shù)據(jù),變換之后得到的結(jié)果同上 scaler.transform(X) #out: array([[ 0., -1.22474487, 1.33630621], [ 1.22474487, 0. , -0.26726124], [-1.22474487,1.22474487, -1.06904497]]) scaler.transform([[-1., 1., 0.]]) #scale the new data, out: array([[-2.44948974, 1.22474487, -0.26726124]])

注:1)若設(shè)置with_mean=False 或者 with_std=False,則不做centering 或者scaling處理。

2)scale和StandardScaler可以用于回歸模型中的目標(biāo)值處理。

二)歸一化----將數(shù)據(jù)特征縮放至某一范圍(scalingfeatures to a range)

另外一種標(biāo)準(zhǔn)化方法是將數(shù)據(jù)縮放至給定的最小值與最大值之間,通常是0與1之間,可用MinMaxScaler實(shí)現(xiàn)?;蛘邔⒆畲蟮慕^對值縮放至單位大小,可用MaxAbsScaler實(shí)現(xiàn)。

使用這種標(biāo)準(zhǔn)化方法的原因是,有時(shí)數(shù)據(jù)集的標(biāo)準(zhǔn)差非常非常小,有時(shí)數(shù)據(jù)中有很多很多零(稀疏數(shù)據(jù))需要保存住0元素。

2.1MinMaxScaler(最小最大值標(biāo)準(zhǔn)化)

公式:X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) ;

X_scaler = X_std/ (max - min) + min

#例子:將數(shù)據(jù)縮放至[0, 1]間 X_train = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) min_max_scaler = preprocessing.MinMaxScaler() X_train_minmax = min_max_scaler.fit_transform(X_train) #out: array([[ 0.5 , 0. , 1. ], [ 1. , 0.5 , 0.33333333], [ 0. , 1. , 0. ]]) #將上述得到的scale參數(shù)應(yīng)用至測試數(shù)據(jù) X_test = np.array([[ -3., -1., 4.]]) X_test_minmax = min_max_scaler.transform(X_test) #out: array([[-1.5 , 0. , 1.66666667]]) #可以用以下方法查看scaler的屬性 min_max_scaler.scale_ #out: array([ 0.5 , 0.5, 0.33...]) min_max_scaler.min_ #out: array([ 0., 0.5, 0.33...])

2.2MaxAbsScaler(絕對值最大標(biāo)準(zhǔn)化)

與上述標(biāo)準(zhǔn)化方法相似,但是它通過除以最大值將訓(xùn)練集縮放至[-1,1]。這意味著數(shù)據(jù)已經(jīng)以0為中心或者是含有非常非常多0的稀疏數(shù)據(jù)。

X_train = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) max_abs_scaler = preprocessing.MaxAbsScaler() X_train_maxabs = max_abs_scaler.fit_transform(X_train) # out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]]) X_test = np.array([[ -3., -1., 4.]]) X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]]) max_abs_scaler.scale_ #out: array([ 2., 1., 2.])

其實(shí)在scale模塊里,也提供了這兩種方法:minmax_scale和maxabs_scale

2.3對稀疏數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化

對稀疏數(shù)據(jù)進(jìn)行中心化會破壞稀疏數(shù)據(jù)的結(jié)構(gòu),這樣做沒什么意義。但是我們可以對稀疏數(shù)據(jù)的輸入進(jìn)行標(biāo)準(zhǔn)化,尤其是特征在不同的標(biāo)準(zhǔn)時(shí)。MaxAbsScaler和maxabs_scale是專門為稀疏數(shù)據(jù)設(shè)計(jì)的,也是常用的方法。但是scale和StandardScaler只接受scipy.sparse的矩陣作為輸入,并且必須設(shè)置with_centering=False。否則會出現(xiàn)ValueError且破壞稀疏性,而且還會無意中分配更多的內(nèi)存導(dǎo)致內(nèi)存崩潰。RobustScaler不適用于稀疏數(shù)據(jù)的輸入,但是你可以用transform 方法。

scalers接受壓縮的稀疏行(Compressed Sparse Rows)和壓縮的稀疏列(Compressed Sparse Columns)的格式(具體參考scipy.sparse.csr_matrix 和scipy.sparse.csc_matrix)。其他的稀疏格式會被轉(zhuǎn)化成壓縮的稀疏行(Compressed Sparse Rows)格式。為了避免這種不必要的內(nèi)存拷貝,推薦使用CSR或者CSC的格式。如果數(shù)據(jù)很小,可以在稀疏矩陣上運(yùn)用toarray 方法。

2.4 對離群點(diǎn)進(jìn)行標(biāo)準(zhǔn)化

如果你的數(shù)據(jù)有離群點(diǎn)(上一篇我們提到過),對數(shù)據(jù)進(jìn)行均差和方差的標(biāo)準(zhǔn)化效果并不好。這種情況你可以使用robust_scale和RobustScaler作為替代。它們有對數(shù)據(jù)中心化和數(shù)據(jù)的縮放魯棒性更強(qiáng)的參數(shù)。

三)正則化

3.1L1、L2正則化

x=np.array([[1.,-1.,2.], [2.,0.,0.], [0.,1.,-1.]]) x_normalized=preprocessing.normalize(x,norm='l2') print(x_normalized) # 可以使用processing.Normalizer()類實(shí)現(xiàn)對訓(xùn)練集和測試集的擬合和轉(zhuǎn)換 normalizer=preprocessing.Normalizer().fit(x) print(normalizer) normalizer.transform(x)

四)二值化

4.1特征二值化

特征二值化是把數(shù)值特征轉(zhuǎn)化成布爾值的過程。這個(gè)方法對符合多變量伯努利分布的輸入數(shù)據(jù)進(jìn)行預(yù)測概率參數(shù)很有效。詳細(xì)可以見這個(gè)例子sklearn.neural_network.BernoulliRBM.

此外,在文本處理中也經(jīng)常會遇到二值特征值(很可能是為了簡化概率推理),即使在實(shí)際中正則化后的詞頻或者TF-IDF的值通常只比未正則化的效果好一點(diǎn)點(diǎn)。

對于Normalizer,Binarizer工具類通常是在Pipeline階段(sklearn.pipeline.Pipeline)的前期過程會用到。下面舉一個(gè)具體的例子:

#input X = [[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]] #binary binarizer = preprocessing.Binarizer().fit(X) # fit does nothing binarizer Binarizer(copy=True, threshold=0.0) #transform binarizer.transform(X) #out: array([[ 1., 0., 1.], [ 1., 0., 0.], [ 0., 1., 0.]]) # 調(diào)整閾值 binarizer = preprocessing.Binarizer(threshold=1.1) binarizer.transform(X) #out: array([[ 0., 0., 1.], [ 1., 0., 0.], [ 0., 0., 0.]])

五)對類別特征進(jìn)行編碼

我們經(jīng)常會遇到一些類別特征,這些特征不是離散型的數(shù)值,而是這樣的:["男性","女性"],["來自歐洲","來自美國","來自亞洲"],["使用Firefox瀏覽器","使用Chrome瀏覽器","使用Safari瀏覽器","使用IE瀏覽器"]等等。這種類型的特征可以被編碼為整型(int),如["男性","來自美國","使用IE瀏覽器"]可以表示成[0,1,3],["女性","來自亞洲","使用Chrome瀏覽器"]可以表示成[1,2,1]。這些整數(shù)式的表示不能直接作為sklearn的參數(shù),因?yàn)槲覀冃枰氖沁B續(xù)型的輸入,而且我們通常是有序的翻譯這些特征,而不是所有的特征都是有序化的(譬如瀏覽器就是按人工排的序列)。

將這些類別特征轉(zhuǎn)化成sklearn參數(shù)中可以使用的方法是:使用one-of-K或者one-hot編碼(獨(dú)熱編碼OneHotEncoder)。它可以把每一個(gè)有m種類別的特征轉(zhuǎn)化成m中二值特征。舉例如下:

enc = preprocessing.OneHotEncoder() #input enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) OneHotEncoder(categorical_features='all', dtype=<... 'float'>,handle_unknown='error', n_values='auto', sparse=True) #transform enc.transform([[0, 1, 3]]).toarray() #out array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])

默認(rèn)情況下,特征的類別數(shù)量是從數(shù)據(jù)集里自動判斷出來的。當(dāng)然,你也可以用n_values這個(gè)參數(shù)。我們剛剛舉的例子中有兩種性別,三種地名和四種瀏覽器,當(dāng)我們fit之后就可以將我們的數(shù)據(jù)轉(zhuǎn)化為數(shù)值了。從結(jié)果中來看,第一個(gè)數(shù)字代表性別([0,1]代表男性,女性),第二個(gè)數(shù)字代表地名([0,1,2]代表歐洲、美國、亞洲),最后一個(gè)數(shù)字代表瀏覽器([3,0,1,2]代表四種瀏覽器)

此外,字典格式也可以編碼:Loading features from dicts

OneHotEncoder參數(shù):classsklearn.preprocessing.OneHotEncoder(n_values='auto',categorical_features='all',dtype=,sparse=True,handle_unknown='error')

n_values: ‘a(chǎn)uto’, int or array of ints

每個(gè)特征的數(shù)量

‘a(chǎn)uto’ : 從訓(xùn)練數(shù)據(jù)的范圍中得到

int : 所有特征的最大值(number)

array : 每個(gè)特征的最大值(number)

categorical_features: “all” or array of indices or mask:

確定哪些特征是類別特征

‘a(chǎn)ll’ (默認(rèn)): 所有特征都是類別特征,意味著所有特征都要進(jìn)行OneHot編碼

array of indices: 類別特征的數(shù)組索引

mask: n_features 長度的數(shù)組,切dtype = bool

非類別型特征通常會放到矩陣的右邊

dtype: number type, default=np.float

輸出數(shù)據(jù)的類型

sparse: boolean, default=True

設(shè)置True會返回稀疏矩陣,否則返回?cái)?shù)組

handle_unknown: str, ‘error’ or ‘ignore’

當(dāng)一個(gè)不明類別特征出現(xiàn)在變換中時(shí),報(bào)錯(cuò)還是忽略

六)缺失值的插補(bǔ)

上篇我們講了五種方法來解決缺失值的問題,其實(shí)sklearn里也有一個(gè)工具Imputer可以對缺失值進(jìn)行插補(bǔ)。Imputer類可以對缺失值進(jìn)行均值插補(bǔ)、中位數(shù)插補(bǔ)或者某行/列出現(xiàn)的頻率最高的值進(jìn)行插補(bǔ),也可以對不同的缺失值進(jìn)行編碼。并且支持稀疏矩陣。

import numpy as np from sklearn.preprocessing import Imputer #用均值插補(bǔ)缺失值 imp = Imputer(missing_values='NaN', strategy='mean', axis=0) imp.fit([[1, 2], [np.nan, 3], [7, 6]]) Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0) X = [[np.nan, 2], [6, np.nan], [7, 6]] print(imp.transform(X)) [[ 4. 2. ] [ 6. 3.666...] [ 7. 6. ]] #對稀疏矩陣進(jìn)行缺失值插補(bǔ) import scipy.sparse as sp X = sp.csc_matrix([[1, 2], [0, 3], [7, 6]]) imp = Imputer(missing_values=0, strategy='mean', axis=0) imp.fit(X) Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0) X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]]) print(imp.transform(X_test)) [[ 4. 2. ] [ 6. 3.666...] [ 7. 6. ]]

在稀疏矩陣中,缺失值被編碼為0存儲為矩陣中,這種格式是適合于缺失值比非缺失值多得多的情況。此外,Imputer類也可以用于Pipeline中

Imputor類的參數(shù):classsklearn.preprocessing.Imputer(missing_values='NaN',strategy='mean',axis=0,verbose=0,copy=True)

missing_values: int或"NaN",默認(rèn)NaN(String類型)

strategy: string, 默認(rèn)為mean,可選則mean、median、most_frequent

axis:int, 默認(rèn)為0(axis = 0,對列進(jìn)行插值;axis= 1,對行進(jìn)行插值)

verbose: int, 默認(rèn)為0

copy: boolean, 默認(rèn)為True

True:會創(chuàng)建一個(gè)X的副本

False:在任何合適的地方都會進(jìn)行插值。

但是以下四種情況,計(jì)算設(shè)置的copy = Fasle,也會創(chuàng)建一個(gè)副本:

1.X不是浮點(diǎn)型數(shù)組

2.X是稀疏矩陣,而且miss_value = 0

3.axis= 0,X被編碼為CSR矩陣

4.axis= 1,X被編碼為CSC矩陣、

舉個(gè)實(shí)例(在用隨機(jī)森林算法之前先用Imputer類進(jìn)行處理):

import numpy as np from sklearn.datasets import load_boston from sklearn.ensemble import RandomForestRegressor from sklearn.pipeline import Pipeline from sklearn.preprocessing import Imputer from sklearn.cross_validation import cross_val_score rng = np.random.RandomState(0) dataset = load_boston() X_full, y_full = dataset.data, dataset.target n_samples = X_full.shape[0] n_features = X_full.shape[1] # Estimate the score on the entire dataset, with no missing values estimator = RandomForestRegressor(random_state=0, n_estimators=100) score = cross_val_score(estimator, X_full, y_full).mean() print("Score with the entire dataset = %.2f" % score) # Add missing values in 75% of the lines missing_rate = 0.75 n_missing_samples = np.floor(n_samples * missing_rate) missing_samples = np.hstack((np.zeros(n_samples - n_missing_samples, dtype=np.bool), np.ones(n_missing_samples, dtype=np.bool))) rng.shuffle(missing_samples) missing_features = rng.randint(0, n_features, n_missing_samples) # Estimate the score without the lines containing missing values X_filtered = X_full[~missing_samples, :] y_filtered = y_full[~missing_samples] estimator = RandomForestRegressor(random_state=0, n_estimators=100) score = cross_val_score(estimator, X_filtered, y_filtered).mean() print("Score without the samples containing missing values = %.2f" % score) # Estimate the score after imputation of the missing values X_missing = X_full.copy() X_missing[np.where(missing_samples)[0], missing_features] = 0 y_missing = y_full.copy() estimator = Pipeline([("imputer", Imputer(missing_values=0, strategy="mean", axis=0)), ("forest", RandomForestRegressor(random_state=0, n_estimators=100))]) score = cross_val_score(estimator, X_missing, y_missing).mean() print("Score after imputation of the missing values = %.2f" % score)

結(jié)果:

Score with the entire dataset = 0.56 Score without the samples containing missing values = 0.48 Score after imputation of the missing values = 0.55

七)生成多項(xiàng)式特征

在輸入數(shù)據(jù)中增加非線性特征可以有效的提高模型的復(fù)雜度。簡單且常用的方法就是使用多項(xiàng)式特征(polynomial features),可以得到特征的高階交叉項(xiàng):

import numpy as np from sklearn.preprocessing import PolynomialFeatures X = np.arange(6).reshape(3, 2) X array([[0, 1], [2, 3], [4, 5]]) poly = PolynomialFeatures(2) poly.fit_transform(X) array([[ 1., 0., 1., 0., 0., 1.], [ 1., 2., 3., 4., 6., 9.], [ 1., 4., 5., 16., 20., 25.]])

然而有時(shí)候我們只需要特征的交叉項(xiàng),可以設(shè)置interaction_only=True來得到:

X = np.arange(9).reshape(3, 3) X array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) poly = PolynomialFeatures(degree=3, interaction_only=True) poly.fit_transform(X) array([[ 1., 0., 1., 2., 0., 0., 2., 0.], [ 1., 3., 4., 5., 12., 15., 20., 60.], [ 1., 6., 7., 8., 42., 48., 56., 336.]])

這個(gè)方法可能大家在工作中比較少見,但世界上它經(jīng)常用于核方法中,如選擇多項(xiàng)式核時(shí)(sklearn.svm.SVC,sklearn.decomposition.KernelPCA)

八)自定義轉(zhuǎn)換

如果以上的方法覺得都不夠,譬如你想用對數(shù)據(jù)取對數(shù),可以自己用FunctionTransformer自定義一個(gè)轉(zhuǎn)化器,并且可以在Pipeline中使用

import numpy as np from sklearn.preprocessing import FunctionTransformer transformer = FunctionTransformer(np.log1p)#括號內(nèi)的就是自定義函數(shù) X = np.array([[0, 1], [2, 3]]) transformer.transform(X) array([[ 0. , 0.69314718], [ 1.09861229, 1.38629436]])

告訴你怎么用:

如果你在做一個(gè)分類任務(wù)時(shí),發(fā)現(xiàn)第一主成分與這個(gè)不相關(guān),你可以用FunctionTransformer把第一列除去,剩下的列用PCA:

import matplotlib.pyplot as plt import numpy as np from sklearn.cross_validation import train_test_split from sklearn.decomposition import PCA from sklearn.pipeline import make_pipeline # from sklearn.preprocessing import FunctionTransformer # 如果報(bào)錯(cuò)ImportError: cannot import name FunctionTransformer,可以使用下面的語句 from sklearn.preprocessing import * def _generate_vector(shift=0.5, noise=15): return np.arange(1000) + (np.random.rand(1000) - shift) * noise def generate_dataset(): """ This dataset is two lines with a slope ~ 1, where one has a y offset of ~100 """ return np.vstack(( np.vstack(( _generate_vector(), _generate_vector() + 100, )).T, np.vstack(( _generate_vector(), _generate_vector(), )).T, )), np.hstack((np.zeros(1000), np.ones(1000))) def all_but_first_column(X): return X[:, 1:] def drop_first_component(X, y): """ Create a pipeline with PCA and the column selector and use it to transform the dataset. """ pipeline = make_pipeline( PCA(), FunctionTransformer(all_but_first_column), ) X_train, X_test, y_train, y_test = train_test_split(X, y) pipeline.fit(X_train, y_train) return pipeline.transform(X_test), y_test if __name__ == '__main__': X, y = generate_dataset() plt.scatter(X[:, 0], X[:, 1], c=y, s=50) plt.show() X_transformed, y_transformed = drop_first_component(*generate_dataset()) plt.scatter( X_transformed[:, 0], np.zeros(len(X_transformed)), c=y_transformed, s=50, ) plt.show()

結(jié)果:

寫到這里基本上關(guān)于數(shù)據(jù)轉(zhuǎn)化的方法已經(jīng)介紹的差不多了

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:機(jī)器學(xué)習(xí)基礎(chǔ)與實(shí)踐(二)----數(shù)據(jù)轉(zhuǎn)換

文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【「時(shí)間序列與機(jī)器學(xué)習(xí)」閱讀體驗(yàn)】全書概覽與時(shí)間序列概述

    數(shù)據(jù)中提取特征并將其轉(zhuǎn)化為交易策略,以及機(jī)器學(xué)習(xí)在其他金融領(lǐng)域(包括資產(chǎn)定價(jià)、資產(chǎn)配置、波動率預(yù)測)的應(yīng)用。 全書彩版印刷,內(nèi)容結(jié)構(gòu)嚴(yán)整,條理清晰,循序漸進(jìn),由淺入深,是很好的時(shí)間序列
    發(fā)表于 08-07 23:03

    遷移學(xué)習(xí)

    的領(lǐng)域適配。遷移效果的可視化,利用機(jī)器學(xué)習(xí)庫scikit-learn的t-SNE對遷移過后的高維數(shù)據(jù)進(jìn)行可視化。十、實(shí)驗(yàn)實(shí)操之圖片與視頻風(fēng)格遷移實(shí)
    發(fā)表于 04-21 15:15

    機(jī)器學(xué)習(xí)簡介與經(jīng)典機(jī)器學(xué)習(xí)算法人才培養(yǎng)

    。遷移效果的可視化,利用機(jī)器學(xué)習(xí)庫scikit-learn的t-SNE對遷移過后的高維數(shù)據(jù)進(jìn)行可視化。十、實(shí)驗(yàn)實(shí)操之圖片與視頻風(fēng)格遷移實(shí)踐
    發(fā)表于 04-28 18:56

    什么是機(jī)器學(xué)習(xí)? 機(jī)器學(xué)習(xí)基礎(chǔ)入門

    的、面向任務(wù)的智能,這就是機(jī)器學(xué)習(xí)的范疇。我過去聽到的機(jī)器學(xué)習(xí)定義的最強(qiáng)大的方法之一是與傳統(tǒng)的、用于經(jīng)典計(jì)算機(jī)編程的算法
    發(fā)表于 06-21 11:06

    機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘方法和應(yīng)用

    機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘方法和應(yīng)用(經(jīng)典)
    發(fā)表于 09-26 07:56

    機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘:方法和應(yīng)用》

    和應(yīng)用》的介紹及下載地址 贊助本站 《機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘:方法和應(yīng)用》分為5個(gè)部分,共18章,較為全面地介紹了機(jī)器
    發(fā)表于 06-27 18:38 ?722次閱讀

    為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)的應(yīng)用詳細(xì)資料概述免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)的應(yīng)用詳細(xì)資料概述免費(fèi)下載包括了:
    發(fā)表于 09-11 17:15 ?13次下載
    為什么要<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>數(shù)據(jù)</b>結(jié)構(gòu)?<b class='flag-5'>數(shù)據(jù)</b>結(jié)構(gòu)的應(yīng)用<b class='flag-5'>詳細(xì)</b>資料<b class='flag-5'>概述</b>免費(fèi)下載

    組態(tài)王與數(shù)據(jù)庫連接的實(shí)現(xiàn)方法詳細(xì)資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是組態(tài)王與數(shù)據(jù)庫連接的實(shí)現(xiàn)方法詳細(xì)資料概述。
    發(fā)表于 10-31 08:00 ?21次下載
    組態(tài)王與<b class='flag-5'>數(shù)據(jù)</b>庫連接的<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>方法</b><b class='flag-5'>詳細(xì)</b>資料<b class='flag-5'>概述</b>

    機(jī)器學(xué)習(xí)的幾種數(shù)據(jù)偏差

    機(jī)器學(xué)習(xí)數(shù)據(jù)偏差是一種錯(cuò)誤,其中數(shù)據(jù)集的某些元素比其他元素具有更大的權(quán)重和或表示。有偏見的數(shù)據(jù)
    的頭像 發(fā)表于 01-05 17:54 ?2771次閱讀

    深度學(xué)習(xí)框架pytorch入門與實(shí)踐

    深度學(xué)習(xí)框架pytorch入門與實(shí)踐 深度學(xué)習(xí)機(jī)器學(xué)習(xí)的一個(gè)分支,它使用多層神經(jīng)網(wǎng)絡(luò)對大量
    的頭像 發(fā)表于 08-17 16:03 ?1464次閱讀

    python機(jī)器學(xué)習(xí)概述

    Python機(jī)器學(xué)習(xí)概述 機(jī)器學(xué)習(xí)是人工智能領(lǐng)域的一個(gè)重要分支,是一種可以自動改進(jìn)和學(xué)習(xí)的算法。
    的頭像 發(fā)表于 08-17 16:11 ?957次閱讀

    數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)有什么關(guān)系

    數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)有什么關(guān)系 數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)是兩個(gè)不同的概念,但它們有一些重要的相似之處。這
    的頭像 發(fā)表于 08-17 16:29 ?2319次閱讀

    機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘的區(qū)別 機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘的關(guān)系

    機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘的區(qū)別 , 機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘的關(guān)系 機(jī)器
    的頭像 發(fā)表于 08-17 16:30 ?1884次閱讀

    機(jī)器學(xué)習(xí)數(shù)據(jù)預(yù)處理與特征工程

    機(jī)器學(xué)習(xí)的整個(gè)流程,數(shù)據(jù)預(yù)處理與特征工程是兩個(gè)至關(guān)重要的步驟。它們直接決定了模型的輸入質(zhì)量,進(jìn)而影響模型的訓(xùn)練效果和泛化能力。本文將從數(shù)據(jù)
    的頭像 發(fā)表于 07-09 15:57 ?197次閱讀

    機(jī)器學(xué)習(xí)數(shù)據(jù)分割方法

    機(jī)器學(xué)習(xí),數(shù)據(jù)分割是一項(xiàng)至關(guān)重要的任務(wù),它直接影響到模型的訓(xùn)練效果、泛化能力以及最終的性能評估。本文將從多個(gè)方面詳細(xì)探討
    的頭像 發(fā)表于 07-10 16:10 ?618次閱讀