2016-09-22 4 views
0

私はかなり単純な機械学習の問題だと思ったことに取り組んでいます。sklearnを使用したマルチクラスロジスティック回帰(マルチクラスとしてyを表す)

この問題では、私が分類したいy(ラベル)はマルチクラスの値です。このデータセットには6つの選択肢があります。

私は、十分な(たとえば、[0 0 0 0 0 1])ように、yのセットを1または0の配列にピボットするためにpreprocessing.LabelBinarizer()関数を使用しています。

次のコードは、ValueErrorのためにmodel.fit()で失敗します。サンプル数が一致しない配列が見つかりました:[217 1302] || 1302は、それが6桁の配列を含むアルゴリズムの代わりに1列に6列のように見える値化戻る結果と思わ217 * 6 BTW

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

あります。

私は以下のコードを使用して配列モデルに強制しようとしましたが、別の理由でフィット関数が使用できなくなりました:ValueError:Unknown label type array([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

あなたの質問は読みにくいです。また、エラーを間違って解釈します。 '' 'サンプル数が一致しない配列を見つけた"とは、第1次元で何かが間違っていて、第2(フィーチャ/列)ではないということです。また、最初の部分のコードの多くはあまり意味がありません。 df-frame(whery no yが処理された)でトレーニングするだけで、なぜプリプロセスオブジェクトを準備するのですか?現時点では純粋な配列に固執する方が簡単かもしれません。何が起こっているのかを把握するために、自分のデータを試す前に、いくつかのscikit-learnチュートリアルに取り組むことを検討してください。 – sascha

+0

フィードバックを心から感謝します。私は、識別しようとしているクラスの数に基づいてyを0の配列に変換する必要があるという印象を受けているので、前処理ロジックのみを使用しています。 Xデータはまったく処理されていません... –

+0

私は問題を解決したと信じています。フィット関数が同じ関数呼び出しですべてのクラスに適合すると仮定していました。もし私が反復し、各クラスのモデルを持っていれば、動作するようです。私はそれから最高の確率を予測するモデルを見つけます。 –

答えて

0

私の問題の根本的な原因ではなく、数値のYフィールドに含まれる文字列値でした。たとえば、12345の代わりにb12345をキーとして使用します。LabelEncodingとDecodingを使用するように変更したら、それはチャンピオンのように機能しました。

関連する問題