2016-08-06 5 views
0

サブモデルを作成するために列の値がグループ単位で使用されるpandasデータフレームがあります。pandas groupbyを使用してサブモデルを作成し、テストデータを含む各モデルを検索します。

import pandas as pd 
from sklearn.linear_model import Ridge 

data = pd.DataFrame({"Name": ["A", "A", "A", "B", "B", "B"], "Score": [90, 80, 90, 92, 87, 80], "Age": [10, 12, 14, 9, 11, 12], "Training": [0, 1, 2, 0, 1, 2]}) 

"Name"各個体のサブモデルを作成するための基礎として使用されます。私は、"Age""Training"という変数を使用して、1つの個体"Name"(つまり、"A"とこの場合は"B")の"Score"を予測します。私は"A"を持っていると"A""Age""Training"を知っていればそれは、私が"Score"を予測する"A""Age""Training"を使用するのが大好きだれます。ただし"A"が他のモデル以外のモデルにアクセスするには、"A"を使用する必要があります。

grouped_df = data.groupby(['Name']) 
for key, item in grouped_df: 
    Score = grouped_df['Score'] 
    Y = grouped_df['Age', 'Training'] 
    Score_item = Score.get_group(key) 
    Y_item = Y.get_group(key) 
    model = Ridge(alpha = 1.2) 
    modelfit = model.fit(Y_item, Score_item) 
    modelpred = model.predict(Y_item) 
    modelscore = model.score(Y_item, Score_item) 
    print modelscore 

はここまで、私はサブグループABにシンプルリッジモデルを構築しています。

私の質問は以下のようにテストデータと、次のとおりです。

test_data = [u"A, 13, 0", u"B, 12, 1", u"A 10, 0"] ##each element, respectively, represents `Name`, `Age` and `Training` 

予測モデルにデータをフィードする方法は? 私はこれが私のテストデータのパンダのデータフレームを与える

line = test_data 
Name = [line[i].split()[0] for i in range(len(line))] 
Age = [line[i].split()[1] for i in range(len(line))] 
Training = [line[i].split()[2] for i in range(len(line))] 
Y = pd.DataFrame({"Name": Name, "Age": Age, "Training": Training}) 

を持っています。しかし、私はモデルにテストデータを供給するためにさらに進める方法がわかりません。私はあなたの助けに非常に感謝します。ありがとうございました!!

UPDATE

私はパフェのコードを採用した後、コードが良く見えます。しかし、私はtestdataの別のパンダデータフレームを作成しませんでした(私はそこで行を扱う方法がわかりません)。代わりに、私は文字列を分割してテスト値を入力します。以下のようなエラーが出ました。私は検索し、ここに関連するPreprocessing in scikit learn - single sample - Depreciation warningの投稿を見つけました。しかし、私はテストデータの形を変えようとしましたが、リスト形式になっていますので、再構成の属性はありません。私は誤解していると思う。このエラーを修正する方法を教えていただければ幸いです。ありがとうございました。

import pandas as pd 
from sklearn.linear_model import Ridge 
import numpy as np 

data = pd.DataFrame({"Name": ["A", "A", "A", "B", "B", "B"], "Score": [90, 80, 90, 92, 87, 80], "Age": [10, 12, 14, 9, 11, 12], "Training": [0, 1, 2, 0,$ 


modeldict = {}           # INITIALIZE DICT 
grouped_df = data.groupby(['Name']) 

for key, item in grouped_df: 
    Score = grouped_df['Score'] 
    Y = grouped_df['Age', 'Training'] 
    Score_item = Score.get_group(key) 
    Y_item = Y.get_group(key) 
    model = Ridge(alpha = 1.2) 
    modelfit = model.fit(Y_item, Score_item) 
    modelpred = model.predict(Y_item) 
    modelscore = model.score(Y_item, Score_item) 
    modeldict[key] = modelfit       # SAVE EACH FITTED MODEL TO DICT 


line = [u"A, 13, 0", u"B, 12, 1", u"A, 10, 0"] 
Name = [line[i].split(",")[0] for i in range(len(line))] 
Age = [line[i].split(",")[1] for i in range(len(line))] 
Training = [line[i].split(",")[2] for i in range(len(line))] 


for i in range(len(line)): 
Name = line[i].split(",")[0] 
Age = line[i].split(",")[1] 
Training = line[i].split(",")[2] 
model = modeldict[Name] 
ip = [float(Age), float(Training)] 
score = model.predict(ip) 

print score 

ERROR

/opt/conda/lib/python2.7/site-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample. DeprecationWarning) 
86.6666666667 
/opt/conda/lib/python2.7/site-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.DeprecationWarning) 
83.5320600273 
/opt/conda/lib/python2.7/site-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.DeprecationWarning) 
86.6666666667 
/opt/conda/lib/python2.7/site-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.DeprecationWarning) 
[ 86.66666667] 
/opt/conda/lib/python2.7/site-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.DeprecationWarning) 
[ 83.53206003] 
/opt/conda/lib/python2.7/site-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample. DeprecationWarning) 
[ 86.66666667] 

答えて

0

対応するモデルに行のを整列各行の操作を実行するpandas.DataFrame.apply()を実行し、キーとしてと辞書にサブモデルを保存すると考えてください。

注:以下はテストされていないコードですが、適切に調整できる一般的な考えがあります。主な問題は、apply()で使用されるrunModelという定義された関数のmodel.predict()入力と出力です。 年齢およびトレーニングの値は、model.predict()で使用され、おそらくサンプルサイズ(つまり、各行)に等しいnumpyを返します。Ridge model

modeldict = {}           # INITIALIZE DICT 
grouped_df = data.groupby(['Name']) 

for key, item in grouped_df: 
    Score = grouped_df['Score'] 
    Y = grouped_df['Age', 'Training'] 
    Score_item = Score.get_group(key) 
    Y_item = Y.get_group(key) 
    model = Ridge(alpha = 1.2) 
    modelfit = model.fit(Y_item, Score_item) 
    modelpred = model.predict(Y_item) 
    modelscore = model.score(Y_item, Score_item) 
    print modelscore 

    modeldict[key] = modelfit       # SAVE EACH FITTED MODEL TO DICT 

line = [u"A, 13, 0", u"B, 12, 1", u"A 10, 0"] 
Name = [line[i].split()[0] for i in range(len(line))] 
Age = [line[i].split()[1] for i in range(len(line))] 
Training = [line[i].split()[2] for i in range(len(line))] 

testdata = pd.DataFrame({"Name": Name, "Age": Age, "Training": Training}) 

def runModel(row): 
    # LOCATE MODEL BY NAME KEY 
    model = modeldict[row['Name']] 
    # PREDICT VALUES 
    score = model.predict(np.matrix([row['Age'], row['Training']]) 
    # RETURN SCALAR FROM score ARRAY 
    return(score[0])  

testdata['predictedScore'] = testdata.apply(runModel, axis=1) 
関連する問題