Xgboost: как сделать один CSV для одного ярлыка в Dmatrix - PullRequest
0 голосов
/ 18 февраля 2019

Я пытался использовать xgboost для построения регрессионной модели.

Сегодня каждый из моих входов представляет собой двумерный массив, и каждому входу соответствует одно значение.

Однако у меня возникла проблема с преобразованием данных в Dmatrix.

X_data_train - это трехмерный массив (# shape(num_files, length,width)), а label_data_train - это двумерный массив (# shape(num_files,1)).

Появится следующее сообщение об ошибке:

ValueError: Input numpy.Ndarray должен быть двухмерным

В настоящее время я могу временно использовать файл и преобразовать его в двумерный массив.

Однако при продолжении программы появится следующее сообщение об ошибке:

Проверка не пройдена: preds.Size () = info.Ярлыки Labels_.Size () (100 против 1) предоставлены неправильно

Но у меня есть только одна метка.Как я могу исправить эти сообщения об ошибках ??

import xgboost as xgb
from xgboost import plot_importance
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import numpy as npnter code here

mms = MinMaxScaler()

#dataset
files_num_train = 5
files_num_test  = 2

#for train
x_data_train = []
label_data_train = []
read_y_data_train = pd.read_csv('path/label.csv')
y_data_train = read_y_data_train['Label'].to_numpy()

#for test
x_data_test = []
label_data_test = []
read_y_data_test = pd.read_csv('path/label.csv')
y_data_test = read_y_data_test['Label'].to_numpy()

#training set
for i in range(files_num_train):
    read_x_data_train = pd.read_csv('path/train%s.csv'%i,index_col = 0).to_numpy()
    x_data_stc_train = mms.fit_transform(read_x_data_train)
    x_data_train.append(x_data_stc_train)
    label_data_train.append(y_data_train[i])

#testing set
for j in range(files_num_test):
    read_x_data_test = pd.read_csv('path/test%s.csv'%j,index_col = 0).to_numpy()
    x_data_stc_test = mms.transform(read_x_data_test)
    x_data_test.append(x_data_stc_test)
    label_data_test.append(y_data_test[j])

x_data_train = np.array(x_data_train)
label_data_train = np.array(label_data_train)
label_data_train = label_data_train.reshape((files_num_train,1,1))
print(x_data_train)#shape = (files_num_train,100,100)
print(label_data_train)#shape = (files_num_train,1,1)

params = {
    'booster': 'gbtree',
    'objective': 'reg:gamma',
    'gamma': 0.1,
    'max_depth': 5,
    'lambda': 3,
    'subsample': 0.7,
    'colsample_bytree': 0.7,
    'min_child_weight': 3,
    'silent': 1,
    'eta': 0.1,
    'seed': 1000,
    'nthread': 4,
}
#dtrain = xgb.DMatrix(x_data_train, label_data_train)
#will appear: ValueError: Input numpy.ndarray must be 2 dimensional

#temporarly use one file to train
dtrain = xgb.DMatrix(x_data_train[0], label_data_train[0])
num_rounds = 300
plst = params.items()
model = xgb.train(plst, dtrain, num_rounds)
#appear error message here:
#Check failed: preds.Size() == info.labels_.Size() (4000 vs. 1) labels are not correctly provided

x_data_test = np.array(x_data_test)
dtest = xgb.DMatrix(x_data_test)
ans = model.predict(dtest)

plot_importance(model)
plt.show()
...