2015-11-08 173 views
3

我想將一個sklearn預測添加到熊貓數據框中,以便我可以對預測進行全面評估。的初步認識的代碼如下:將scikit-klearn(sklearn)預測添加到熊貓數據框中

clf = linear_model.LinearRegression() 
clf.fit(Xtrain,ytrain) 
ypred = pd.DataFrame({'pred_lin_regr': pd.Series(clf.predict(Xtest))}) 

的dataframes看起來像這樣:

XTEST

 axial_MET cos_theta_r1 deltaE_abs lep1_eta lep1_pT lep2_eta 
8000 1.383026  0.332365 1.061852 0.184027 0.621598 -0.316297 
8001 -1.054412  0.046317 1.461788 -1.141486 0.488133 1.011445 
8002 0.259077  0.429920 0.769219 0.631206 0.353469 1.027781 
8003 -0.096647  0.066200 0.411222 -0.867441 0.856115 -1.357888 
8004 0.145412  0.371409 1.111035 1.374081 0.485231 0.900024 

ytest

8000 1 
8001 0 
8002 0 
8003 0 
8004 0 

ypred

 pred_lin_regr 
0  0.461636 
1  0.314448 
2  0.363751 
3  0.291858 
4  0.416056 

串聯XTEST和ytest正常工作:

df_total = pd.concat([Xtest, ytest], axis=1) 

但ypred事件信息丟失。

什麼是必須的python/pandas/numpy樣的方式來做到這一點?

我使用以下版本:

argparse==1.2.1 
cycler==0.9.0 
decorator==4.0.4 
ipython==4.0.0 
ipython-genutils==0.1.0 
matplotlib==1.5.0 
nose==1.3.7 
numpy==1.10.1 
pandas==0.17.0 
path.py==8.1.2 
pexpect==4.0.1 
pickleshare==0.5 
ptyprocess==0.5 
py==1.4.30 
pyparsing==2.0.5 
pytest==2.8.2 
python-dateutil==2.4.2 
pytz==2015.7 
scikit-learn==0.16.1 
scipy==0.16.1 
simplegeneric==0.8.1 
six==1.10.0 
sklearn==0.0 
traitlets==4.0.0 
wsgiref==0.1.2 

我試過如下:

df_total["pred_lin_regr"] = clf.predict(Xtest) 

似乎做的工作,但我想我不能確定的事件相匹配正確

回答

4

您的第二行df_total["pred_lin_regr"] = clf.predict(Xtest)正確無誤,效率更高。

在這一個中,你正在輸出clf.predict(),這恰好是array,並將其添加到數據框。你從陣列本身收到的輸出是爲了匹配Xtest,因爲這樣的話,將它添加到一個numpy數組將而不是改變或改變該順序。

下面是這個example一點證明:

採取以下protion:

import numpy as np 

import pandas as pd 
from sklearn import datasets, linear_model 

# Load the diabetes dataset 
diabetes = datasets.load_diabetes() 

# Use only one feature 
diabetes_X = diabetes.data[:, np.newaxis, 2] 

# Split the data into training/testing sets 
diabetes_X_train = diabetes_X[:-20] 
diabetes_X_test = diabetes_X[-20:] 

# Split the targets into training/testing sets 
diabetes_y_train = diabetes.target[:-20] 
diabetes_y_test = diabetes.target[-20:] 

# Create linear regression object 
regr = linear_model.LinearRegression() 

# Train the model using the training sets 
regr.fit(diabetes_X_train, diabetes_y_train) 

print(regr.predict(diabetes_X_test)) 

df = pd.DataFrame(regr.predict(diabetes_X_test)) 

print(df) 

第一print()功能將給我們的預期numpy的數組:

[ 225.9732401 115.74763374 163.27610621 114.73638965 120.80385422 
    158.21988574 236.08568105 121.81509832 99.56772822 123.83758651 
    204.73711411 96.53399594 154.17490936 130.91629517 83.3878227 
    171.36605897 137.99500384 137.99500384 189.56845268 84.3990668 ] 

那順序與第二個print()函數相同,我們將結果添加到數據框中:

   0 
0 225.973240 
1 115.747634 
2 163.276106 
3 114.736390 
4 120.803854 
5 158.219886 
6 236.085681 
7 121.815098 
8 99.567728 
9 123.837587 
10 204.737114 
11 96.533996 
12 154.174909 
13 130.916295 
14 83.387823 
15 171.366059 
16 137.995004 
17 137.995004 
18 189.568453 
19 84.399067 

重新運行該代碼用於測試的一部分,將給予我們相同的排序結果,例如:

print(regr.predict(diabetes_X_test[0:5])) 

df = pd.DataFrame(regr.predict(diabetes_X_test[0:5])) 

print(df) 

[ 225.9732401 115.74763374 163.27610621 114.73638965 120.80385422] 
      0 
0 225.973240 
1 115.747634 
2 163.276106 
3 114.736390 
4 120.803854