講清楚fit_transform()和transform()的區(qū)別及說明
fit_transform()和transform()的區(qū)別
網(wǎng)上抄來抄去都是一個意思,
fit_transform是fit和transform的組合
我們知道fit(x,y)在新手入門的例子中比較多,但是這里的fit_transform(x)的括號中只有一個參數(shù),這是為什么呢?
fit(x,y)傳兩個參數(shù)的是有監(jiān)督學(xué)習(xí)的算法,fit(x)傳一個參數(shù)的是無監(jiān)督學(xué)習(xí)的算法,比如降維、特征提取、標(biāo)準(zhǔn)化
解釋為什么出來fit_transform()這個東西
下面是重點:
fit和transform沒有任何關(guān)系,僅僅是數(shù)據(jù)處理的兩個不同環(huán)節(jié),之所以出來這么個函數(shù)名,僅僅是為了寫代碼方便,
所以會發(fā)現(xiàn)transform()和fit_transform()的運行結(jié)果是一樣的。
注意:
運行結(jié)果一模一樣不代表這兩個函數(shù)可以互相替換,絕對不可以?。?!
- transform函數(shù)是一定可以替換為fit_transform函數(shù)的
- fit_transform函數(shù)不能替換為transform函數(shù)?。?!理由解釋如下:
sklearn里的封裝好的各種算法都要fit、然后調(diào)用各種API方法,transform只是其中一個API方法,所以當(dāng)你調(diào)用除transform之外的方法,必須要先fit,為了通用的寫代碼,還是分開寫比較好
也就是說,這個fit相對于transform而言是沒有任何意義的,但是相對于整個代碼而言,fit是為后續(xù)的API函數(shù)服務(wù)的,所以fit_transform不能改寫為transform。
下面的代碼用來舉例示范
數(shù)據(jù)集是代碼自動從網(wǎng)上下載的
如果把下面的乳腺癌相關(guān)的機器學(xué)習(xí)代碼中的fit_transform改為transform,編譯器就會報錯。
(下面給出的是無錯誤的代碼)
# coding: utf-8
# 導(dǎo)入pandas與numpy工具包。
import pandas as pd
import numpy as np
# 創(chuàng)建特征列表。
column_names = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses', 'Class']
# 使用pandas.read_csv函數(shù)從互聯(lián)網(wǎng)讀取指定數(shù)據(jù)。
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data', names = column_names )
# 將?替換為標(biāo)準(zhǔn)缺失值表示。
data = data.replace(to_replace='?', value=np.nan)
# 丟棄帶有缺失值的數(shù)據(jù)(只要有一個維度有缺失)。
data = data.dropna(how='any')
# 輸出data的數(shù)據(jù)量和維度。
data.shape
# In[2]:
# 使用sklearn.cross_valiation里的train_test_split模塊用于分割數(shù)據(jù)。
from sklearn.cross_validation import train_test_split
# 隨機采樣25%的數(shù)據(jù)用于測試,剩下的75%用于構(gòu)建訓(xùn)練集合。
X_train, X_test, y_train, y_test = train_test_split(data[column_names[1:10]], data[column_names[10]], test_size=0.25, random_state=33)
# print "data[column_names[10]]",data[column_names[10]]
# 查驗訓(xùn)練樣本的數(shù)量和類別分布。
y_train=pd.Series(y_train)
y_train.value_counts()
# 查驗測試樣本的數(shù)量和類別分布。
y_test=pd.Series(y_test)
y_test.value_counts()
# 從sklearn.preprocessing里導(dǎo)入StandardScaler。
from sklearn.preprocessing import StandardScaler
# 從sklearn.linear_model里導(dǎo)入LogisticRegression與SGDClassifier。
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
#標(biāo)準(zhǔn)化數(shù)據(jù),保證每個維度的特征數(shù)據(jù)方差為1,均值為0。使得預(yù)測結(jié)果不會被某些維度過大的特征值而主導(dǎo)。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
#
# 初始化LogisticRegression與SGDClassifier。
lr = LogisticRegression()
sgdc = SGDClassifier()
# 調(diào)用LogisticRegression中的fit函數(shù)/模塊用來訓(xùn)練模型參數(shù)。
lr.fit(X_train, y_train)
# 使用訓(xùn)練好的模型lr對X_test進行預(yù)測,結(jié)果儲存在變量lr_y_predict中。
lr_y_predict = lr.predict(X_test)
# 調(diào)用SGDClassifier中的fit函數(shù)/模塊用來訓(xùn)練模型參數(shù)。
sgdc.fit(X_train, y_train)
# 使用訓(xùn)練好的模型sgdc對X_test進行預(yù)測,結(jié)果儲存在變量sgdc_y_predict中。
sgdc_y_predict = sgdc.predict(X_test)
# 從sklearn.metrics里導(dǎo)入classification_report模塊。
from sklearn.metrics import classification_report
# 使用邏輯斯蒂回歸模型自帶的評分函數(shù)score獲得模型在測試集上的準(zhǔn)確性結(jié)果。
print ("Accuracy of LR Classifier:", lr.score(X_test, y_test))
# 利用classification_report模塊獲得LogisticRegression其他三個指標(biāo)的結(jié)果。
print (classification_report(y_test, lr_y_predict, target_names=['Benign', 'Malignant']))
# 使用隨機梯度下降模型自帶的評分函數(shù)score獲得模型在測試集上的準(zhǔn)確性結(jié)果。
print 'Accuarcy of SGD Classifier:', sgdc.score(X_test, y_test)
# 利用classification_report模塊獲得SGDClassifier其他三個指標(biāo)的結(jié)果。
print classification_report(y_test, sgdc_y_predict, target_names=['Benign', 'Malignant'])
會得到報錯信息:
AttributeError: 'StandardScaler' object has no attribute 'mean_'
有的版本報錯更加直接:
sklearn.exceptions.NotFittedError: This StandardScaler instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.
原因就是因為代碼中的fit_transform函數(shù)被改為了transform函數(shù)。
所以總結(jié)
fit_transform與transform運行結(jié)果一致,但是fit與transform無關(guān),只是數(shù)據(jù)處理的兩個環(huán)節(jié),fit是為了程序的后續(xù)函數(shù)transform的調(diào)用而服務(wù)的,是個前提條件。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中的Logging模塊在項目應(yīng)用小結(jié)
Python標(biāo)準(zhǔn)庫中的logging模塊為我們提供了強大而靈活的日志記錄功能,本文將介紹如何使用logging模塊,并探討其在Python開發(fā)中的實際應(yīng)用,感興趣的朋友一起看看吧2024-04-04
win與linux系統(tǒng)中python requests 安裝
requests是Python的一個HTTP客戶端庫,跟urllib,urllib2類似,今天我們主要來談?wù)剋in與linux系統(tǒng)中python requests的安裝方法以及使用指南2016-12-12
Python讀取txt文件數(shù)據(jù)的方法(用于接口自動化參數(shù)化數(shù)據(jù))
這篇文章主要介紹了Python讀取txt文件數(shù)據(jù)的方法(用于接口自動化參數(shù)化數(shù)據(jù)),需要的朋友可以參考下2018-06-06
python入門課程第四講之內(nèi)置數(shù)據(jù)類型有哪些
這篇文章主要介紹了python入門課程第四講之內(nèi)置數(shù)據(jù)類型有哪些?本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
Python中的異常處理:try?except?Exception?as?e解決辦法
這篇文章主要介紹了Python中的異常處理機制,包括try、except、finally語句的基本用法和高級用法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-04-04

