Xgboost:如何在Dmatrix中为一个标签制作一个CSV文件

时间:2019-02-18 18:07:49

标签: python pandas scikit-learn xgboost

我尝试使用xgboost建立回归模型。

今天,我的每个输入都是一个二维数组,每个输入都有一个对应的值。

但是,我在将数据转换为Dmatrix时遇到问题。

X_data_train是3d数组(# shape(num_files, length,width)),而label_data_train是2d数组(# shape(num_files,1))。

将出现以下错误消息:

  

ValueError:输入numpy。 Ndarray必须是二维的

目前,我只能临时使用文件并将其转换为二维数组。

但是,当程序继续时,将出现以下错误消息:

  

检查失败:preds.Size()=信息。未正确提供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()

1 个答案:

答案 0 :(得分:0)

可能为时已晚,但我将为观众提供一个解决此问题的方法。

我想您需要像下面这样在代码中重塑您的解释变量。

假设X是一个解释变量,数据是使用Pandas的DataFrame对象,

self.data_x_value = self.data['X'].values.reshape(len(self.data['X']), 1)

谢谢