scikit-learn提供了一系列轉換庫,他們可以清洗,降維,提取特征等。
在數據轉換中有三個很重要的方法,fit,fit_transform,transform
ss=StandardScaler() X_train = ss.fit_transform(X_train) X_test = ss.transform(X_test)
- 1
- 2
- 3
初學時候好奇為何,訓練樣本用fit_transform,而測試樣本用transform?
仔細閱讀官方文檔發現,fit方法是用於從一個訓練集中學習模型參數,其中就包括了歸一化時用到的均值,標准偏差。transform方法就是用於將模型用於位置數據,fit_transform就很高效的將模型訓練和轉化合並到一起,訓練樣本先做fit,得到mean,standard deviation,然后將這些參數用於transform(歸一化訓練數據),使得到的訓練數據是歸一化的,而測試數據只需要在原先得到的mean,std上來做歸一化就行了,所以用transform就行了。
StandardScaler對矩陣作歸一化處理,變換后的矩陣各特征均值為0,方差為1
網上抄來抄去都是一個意思,
fit_transform是fit和transform的組合。
我們知道fit(x,y)在新手入門的例子中比較多,但是這里的fit_transform(x)的括號中只有一個參數,這是為什么呢?
fit(x,y)傳兩個參數的是有監督學習的算法,fit(x)傳一個參數的是無監督學習的算法,比如降維、特征提取、標准化
然后解釋為什么出來fit_transform()這個東西,下面是重點:
fit和transform沒有任何關系,之所以出來這么個函數名,僅僅是為了寫代碼方便,
所以會發現transform()和fit_transform()的運行結果是一樣的。
注意:運行結果一模一樣不代表這兩個函數可以互相替換,絕對不可以!!!
transform函數是一定可以替換為fit_transform函數的
fit_transform函數不能替換為transform函數!!!理由解釋如下:
sklearn里的封裝好的各種算法都要fit、然后調用各種API方法,transform只是其中一個API方法,所以當你調用除transform之外的方法,必須要先fit,為了通用的寫代碼,還是分開寫比較好
也就是說,這個fit相對於transform而言是沒有任何意義的,但是相對於整個代碼而言,fit是為后續的API函數服務的,所以fit_transform不能改寫為transform。