2016-05-06 7 views
0

Я практикуюсь на таких конкурсах, как kaggle, и я пытался использовать XGBoost, и я пытаюсь узнать себя с сторонними библиотеками python, такими как pandas и numpy.ValueError: длина массива не соответствует длине индекса

Я просматривал сценарии этого соревнования под названием «Классификация удовлетворенности клиентов Santander», и я модифицировал разные разветвленные сценарии, чтобы поэкспериментировать с ними.

Вот один модифицированный скрипт, через который я пытаюсь реализовать XGBoost:

import pandas as pd 
from sklearn import cross_validation as cv 
import xgboost as xgb 

df_train = pd.read_csv("/Users/pavan7vasan/Desktop/Machine_Learning/Project Datasets/Santander_Customer_Satisfaction/train.csv") 
df_test = pd.read_csv("/Users/pavan7vasan/Desktop/Machine_Learning/Project Datasets/Santander_Customer_Satisfaction/test.csv") 

df_train = df_train.replace(-999999,2) 

id_test = df_test['ID'] 
y_train = df_train['TARGET'].values 
X_train = df_train.drop(['ID','TARGET'], axis=1).values 
X_test = df_test.drop(['ID'], axis=1).values 

X_train, X_test, y_train, y_test = cv.train_test_split(X_train, y_train, random_state=1301, test_size=0.4) 

clf = xgb.XGBClassifier(objective='binary:logistic', 
       missing=9999999999, 
       max_depth = 7, 
       n_estimators=200, 
       learning_rate=0.1, 
       nthread=4, 
       subsample=1.0, 
       colsample_bytree=0.5, 
       min_child_weight = 3, 
       reg_alpha=0.01, 
       seed=7) 

clf.fit(X_train, y_train, early_stopping_rounds=50, eval_metric="auc", eval_set=[(X_train, y_train), (X_test, y_test)]) 
y_pred = clf.predict_proba(X_test) 

print("Cross validating and checking the score...") 
scores = cv.cross_val_score(clf, X_train, y_train) 
''' 
test = [] 
result = [] 
for each in id_test: 
    test.append(each) 
for each in y_pred[:,1]: 
    result.append(each) 

print len(test) 
print len(result) 
''' 
submission = pd.DataFrame({"ID":id_test, "TARGET":y_pred[:,1]}) 
#submission = pd.DataFrame({"ID":test, "TARGET":result}) 
submission.to_csv("submission_XGB_Pavan.csv", index=False) 

Вот StackTrace:

Traceback (most recent call last): 
    File "/Users/pavan7vasan/Documents/workspace/Machine_Learning_Project/Kaggle/XG_Boost.py", line 45, in <module> 
submission = pd.DataFrame({"ID":id_test, "TARGET":y_pred[:,1]}) 
    File "/anaconda/lib/python2.7/site-packages/pandas/core/frame.py", line 214, in __init__ 
mgr = self._init_dict(data, index, columns, dtype=dtype) 
    File "/anaconda/lib/python2.7/site-packages/pandas/core/frame.py", line 341, in _init_dict 
dtype=dtype) 
    File "/anaconda/lib/python2.7/site-packages/pandas/core/frame.py", line 4798, in _arrays_to_mgr 
index = extract_index(arrays) 
    File "/anaconda/lib/python2.7/site-packages/pandas/core/frame.py", line 4856, in extract_index 
raise ValueError(msg) 
ValueError: array length 30408 does not match index length 75818 

Я попытался решения, основанные на моих поисках различных решений, но Я не могу понять, что это за ошибка. В чем я ошибался? Пожалуйста, дайте мне знать

+0

Где моя трасса? Предоставьте минимальный скрипт, который может выполнить любой другой человек (например, без внешних данных csv), и мы можем помочь вам лучше – tdihp

+0

вы определяете 'X_test' дважды, это может вызвать проблемы – maxymoo

+0

@tdihp: О, я полностью забыл !!! Спасибо за напоминание, сейчас обновим его –

ответ

0

Проблема в том, что вы определяете X_test дважды, как указано @maxymoo. Сначала вы определили его как

X_test = df_test.drop(['ID'], axis=1).values 

И тогда вы переопределять, что с:

X_train, X_test, y_train, y_test = cv.train_test_split(X_train, y_train, random_state=1301, test_size=0.4) 

Что означает, что теперь X_test имеют размер, равный 0.4*len(X_train). Тогда после того, как:

y_pred = clf.predict_proba(X_test) 

вы получили предсказание для той части X_train и вы пытаетесь создать dataframe с той и начальной id_test, который имеет длину исходного X_test.
Вы можете использовать X_fit и X_eval в train_test_split и не скрывает первоначальный X_train и X_test потому, что для вашего cross_validation вы также имеет различные X_train означает, что вы не получите правильный ответ или вы cv бы неточными с государственным/частным счетом.

+0

Спасибо Антон, я смог решить проблему –