2014-02-07 46 views
5

作爲一個Python的相對新手,我試圖使用sklearn RandomForestClassifier。一個例子從如何對通過yhat指導如下:y,_賦值在python/sklearn中做什麼?

from sklearn.datasets import load_iris 
from sklearn.ensemble import RandomForestClassifier 
import pandas as pd 
import numpy as np 

iris = load_iris() 
df = pd.DataFrame(iris.data, columns=iris.feature_names) 
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75 
df['species'] = pd.Factor(iris.target, iris.target_names) 
df.head() 

train, test = df[df['is_train']==True], df[df['is_train']==False] 

features = df.columns[:4] 
clf = RandomForestClassifier(n_jobs=2) 
y, _ = pd.factorize(train['species']) # assignment I don't understand 
clf.fit(train[features], y) 

preds = iris.target_names[clf.predict(test[features])] 
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds']) 

一些能解釋一下什麼是Y,_分配功能以及它是如何工作的。它沒有明確地使用,但是如果我將其忽略掉,我會得到一個錯誤。

+0

我需要更多的瞭解代碼。 iris.target和y都與iris.target_names匹配是不是巧合?由於factorize()將輸入值編碼爲分類值,因此不能保證其編碼方式與從iris.target到iris.target_names的映射方式相同。例如0映射到setosa,但是如何保證factorize()在對值進行編碼時執行相同的映射?不知道你是否理解我的問題。謝謝! – zsong

回答

8

將返回的元組分解爲兩個不同的值:y_

_是「我不再需要這個值」的慣例。

這是基本相同:

y = pd.factorize(train['species'])[0] 

不同之處在於這個代碼將任何可轉位返回值的工作至少有1元,而你需要明確在返回的值完全兩個項目。

+1

......只是如果返回值有兩個以上的元素,'[0]'會起作用,所以使用'y,_ ='也是對'pd.factorize'輸出的一個完整檢查。 –

+0

這當然是對的,如果它至少有1個元素,它會起作用。我會添加它。 –

+0

有誰知道下劃線約定的由來? – Bach

3

這意味着pd.factorize(train['species'])正在返回一個元組/列表/生成器/可迭代的兩個項目。在Python中,你可以做

x, y = [1, 2] 

現在x == 1y == 2。在你的情況下,y成爲第一個值,變量_第二個。下劃線_通常用作不會使用的變量的名稱。

相關問題