Xgboost : 如何在Dmatrix中把一个CSV变成一个标签?

问题描述 投票:1回答:1

我试着用 xgboost 来建立一个回归模型。

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

然而,我在将数据转换为Dmatrix时遇到了问题。

X_data_train是一个三维数组(# shape(num_files, length,width)),而label_data_train是一个二维数组(# shape(num_files,1)).

将出现以下错误信息。

ValueError: 输入的numpy.Ndarray必须是二维的。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()
python pandas scikit-learn xgboost
1个回答
0
投票

可能太晚了,但我会写一个解决这个问题的方法给观众。

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

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

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

谢谢你

© www.soinside.com 2019 - 2024. All rights reserved.