我试着用 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()
可能太晚了,但我会写一个解决这个问题的方法给观众。
我想你需要在你的代码中重塑你的解释变量,就像下面这样。
假设,X是一个解释变量,数据是DataFrame对象,使用Pandas。
self.data_x_value = self.data['X'].values.reshape(len(self.data['X']), 1)
谢谢你