2016-09-22 38 views
0

我在工作我認爲是一個相當簡單的機器學習問題。多類Logistic迴歸使用sklearn(代表Ÿ多級)

在我想分類這個問題的Y(標籤)是一種多級值。在這個數據集中,我有6種可能的選擇。

我一直在使用preprocessing.LabelBinarizer()函數將我的y設置爲1或0的數組,希望這足夠了(例如[0 0 0 0 0 1])。

下面這個代碼在model.fit失敗()由於一個ValueError:實測值陣列與樣品的不一致數:[217 1302] || 1302是217 * 6順便說一句

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

似乎含有的6位數字的陣列,其看起來像6列的算法,而不是1列中的二值化結果返回。

我已經嘗試使用以下代碼來迫使它進入一個數組模型,但隨後的另一個原因擬合函數箍架:ValueError異常:未知標籤類型陣列([數組[0,1,0,0,0]) ,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) 

我也試過sklearn_pandas.DataFrameMapper無濟於事,因爲它也產生6名不同的字段對6個值的陣列表示爲一個領域。

任何幫助或建議,將不勝感激......完整版我以爲這裏是正確的張貼清晰:

#!/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)。暫時堅持純num陣列可能更容易。在嘗試自己的數據以掌握正在發生的事情之前,請先考慮一些scikit-learn教程。 – sascha

+0

欣賞反饋。我只使用預處理邏輯,因爲我的印象是我的y必須根據我試圖識別的類數轉換爲0 1的數組。 X數據沒有被處理...... –

+0

我相信我解決了這個問題。我假設fit函數可以適用於同一個函數調用中的所有類。如果我迭代併爲每個類使用模型,它似乎工作。然後我找到預測最高概率的模型... –

回答

0

我的問題的根本原因是Y字段包含的字符串值,而不是數字。例如b12345作爲鍵而不是12345.一旦我改變了使用LabelEncoding和Decoding它就像一個冠軍一樣工作。