2014-02-07 2 views
5

Python의 새로운 상대로서 나는 sklearn RandomForestClassifier를 사용하려고합니다. A는 어떻게에 yhat에 의해 인도에서 하나의 예는 다음과 같다 :파이썬/sklearn에서 y, _ assignment는 무엇을합니까?

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_이라는 두 개의 고유 한 값으로 분해합니다.

_은 "나는 더 이상 값을 필요로하지 않습니다."라고 규정하고 있습니다. 당신이 명시 적으로 반환 된 값에 정확히 두 개의 항목을 필요로하는 동안이 코드는, 적어도 1 요소와 어떤 색인 반환 값을 위해 일 것이라는 점을 제외하고

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

:

그것은 기본적으로 동일합니다.

+1

... 반환 값에 두 개 이상의 요소가있는 경우'[0]'이 작동한다는 것을 제외하면'y, _ = '를 사용하면'pd.factorize'의 출력을 온 전성 검사로 사용할 수 있습니다. –

+0

물론 그것이 맞습니다. 적어도 하나의 요소가 있다면 작동 할 것입니다. 나는 그것을 추가 할 것이다. –

+0

누구나 밑줄 대회의 출처를 알고 있습니까? – Bach

3

즉, pd.factorize(train['species'])은 두 항목의 튜플/목록/생성자/반복 가능을 반환하고 있음을 의미합니다. 파이썬에서는

x, y = [1, 2] 

지금 x == 1y == 2을 할 수 있습니다. 귀하의 경우 y이 첫 번째 값이되고 변수 _이 두 번째가됩니다. Underscore _은 종종 사용되지 않을 변수의 이름으로 사용됩니다.