2016-09-22 2 views
0

나는 매우 간단한 기계 학습 문제라고 생각하는 것에 노력하고 있습니다.sklearn을 사용하는 다중 클래스 로지스틱 회귀 (다중 클래스로 y를 나타냄)

이 문제는 내가 분류하고자하는 y (레이블)은 다중 클래스 값입니다. 이 데이터 세트에는 6 가지 가능한 선택이 있습니다.

저는 preprocessing.LabelBinarizer() 함수를 사용하여 y가 1 또는 0의 배열로 충분하도록하기 위해 (예 : [0 0 0 0 0 1]) 피벗했습니다.

아래의 코드는 ValueError로 인해 model.fit()에서 실패합니다. 일치하지 않는 샘플 수의 배열을 찾았습니다 : [217 1302] || 1302 BTW

lb = preprocessing.LabelBinarizer() 
api_y = lb.fit_transform(df['gear']) 
y = pd.DataFrame(api_y) 
y = np.ravel(y) 

열 알고리즘을 대신 1~6 열 같이 표시 화기 반환 결과는 6 자리의 배열을 포함하는 것으로 보인다 217 * 6이다.

아래 코드를 사용하여 배열 모델에 강제로 넣으려고했으나 다른 이유로 fit 함수가 실패합니다. ValueError : 알 수없는 레이블 유형 배열 ([array [0,1,0,0,0]) 이도 6 개 고유 필드를 만든 대 (6)의 값의 배열로 표시 한 바와 같이, arrary ([0,1,0,0 ...])

lb = preprocessing.LabelBinarizer() 
api_y = lb.fit_transform(df['gear']) 
y_list = [] 
for x in api_y: 
    item = {'gear': np.array(x)} 
    y_list.append(item) 
y = pd.DataFrame(y_list) 
print("after changing to binary classes array y is "+repr(y.shape)) 
y = np.ravel(y) 

I는 아무 소용 sklearn_pandas.DataFrameMapper 시도 들.

어떤 도움이나 제안을 주시면 감사하겠습니다 ... 내가 바로 명확성을 위해 여기에 게시 된 무슨 생각의 전체 버전 :

#!/Library/Frameworks/Python.framework/Versions/3.5/bin/python3 
import pandas as pd 
import numpy as np 
from patsy import dmatrices 
from sklearn.linear_model import LogisticRegression 
from sklearn import preprocessing 
from sklearn.cross_validation import train_test_split, cross_val_score 
from sklearn import metrics 
import sklearn_pandas 
# 
# load traing data taken from 2 years of strava rides 
df = pd.DataFrame.from_csv("gear_train.csv") 
# 
# Prepare data for logistic regression 
# 
y, X = dmatrices('gear ~ distance + moving_time + total_elevation_gain + average_speed + max_speed + average_cadence + has_heartrate + device_watts', df, return_type="dataframe") 
# 
# Fix up y to be a flattened array of 1 column (binary array?) 
# 
lb = preprocessing.LabelBinarizer() 
api_y = lb.fit_transform(df['gear']) 
y = pd.DataFrame(api_y) 
y = np.ravel(y) 
# 
# run the logistic regression 
# 
model = LogisticRegression() 
model = model.fit(X, y) 
score = model.score(X, y) 
# 
# evaluate the model by splitting into training and testing data sets 
# 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) 
model2 = LogisticRegression() 
model2.fit(X_train, y_train) 
predicted = model2.predict(X_test) 
print("predicted="+repr(lb2.inverse_transform(predicted))) 
print(metrics.classification_report(y_test, predicted)) 
# 
# do a 10-fold CV test to see if this model holds up 
# 
scores = cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=10) 
print(scores.mean())enter code here 
+0

귀하의 질문을 읽기가 어렵습니다. 또한 오류를 잘못 해석합니다. ''''샘플 수가 일치하지 않는 배열을 찾는다 '는 것은 두 번째 (피처/컬럼)가 아니라 첫 번째 차원에서 문제가 있음을 의미합니다. 또한 첫 번째 부분의 코드 대부분은별로 의미가 없습니다. 왜 df-frame (whery no y가 처리되었는지)에 대한 훈련 만하는 전처리 객체를 준비하십시오. 순식간에 순열 배열에 집착하는 것이 더 쉬울 수도 있습니다. 어떤 일이 벌어지고 있는지 파악하기 위해 자신의 데이터를 시도하기 전에 먼저 scikit-learn 자습서를 작성하십시오. – sascha

+0

의견에 감사드립니다. 나는 y를 식별하려고하는 클래스의 수를 기반으로 0 1의 배열로 변환해야한다는 인상을 받기 때문에 전처리 논리 만 사용하고 있습니다. X 데이터가 전혀 처리되지 않고 있습니다 ... –

+0

나는이 문제를 해결했다고 믿습니다. 맞춤 함수가 동일한 함수 호출에서 모든 클래스에 적합하다고 가정합니다. 만약 내가 반복하고 각 클래스에 대한 모델을 가지고 그것이 작동하는 것. 나는 그때 가장 높은 확률을 예측하는 모델을 찾는다. –

답변

0

내 문제의 근본 원인은 Y 필드 포함 된 문자열 값 대신 숫자였다. 예를 들어, 12345 대신에 키로 b12345를 사용합니다. LabelEncoding을 사용하도록 변경하고 디코딩하면 챔피언처럼 작동합니다.