UserWarning: X has feature names, but RandomForestClassifier was fitted without feature names
warnings.warn
使用Sklearn建立随机森林模型后,使用建立模型预测另一个数据集,出现以上报错。
#准备数据集
import pandas as pd
import numpy as np
data = pd.read_csv("C:/Users/Administrator/Desktop/meta+ML/MLdata.csv")
data = pd.DataFrame(data, columns=['croptype', 'bio1', 'bio2', 'bio3', 'bio4', 'bio5', 'bio6', 'bio7','suitibility'])
lables = list(data.columns.values)
#print(lables)
x = data[['croptype', 'bio1', 'bio2', 'bio3', 'bio4', 'bio5', 'bio6', 'bio7']]
y = data['suitibility']
#print(x, y)
#建立模型
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=24)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
Estimator = RandomForestClassifier()
'''
param_dict = {"n_estimator": [120, 200, 300, 500, 800, 1200], "max_depth": [3, 5, 10]}
Estimator = GridSearchCV(Estimator, param_grid=param_dict, cv=3)
Estimator.fit(x_train, y_train)
y_predict = Estimator.predict(x_test)
score = Estimator.score(x_test, y_test)
print('Score: ', score)
# 导入并建立需要预测的数据集
predict = pd.read_csv("C:/Users/Administrator/Desktop/meta+ML/Predict.csv")
print(predict)
X = pd.DataFrame(predict, columns=['croptype', 'bio1', 'bio2', 'bio3', 'bio4', 'bio5', 'bio6', 'bio7'])
print(X)
X = X[['croptype', 'bio1', 'bio2', 'bio3', 'bio4', 'bio5', 'bio6', 'bio7']]
X = pd.DataFrame(X)
print(X)
# 运用模型预测
predict_result = Estimator.predict(X)
print(predict_result)
# 预测结果
X_result = pd.DataFrame(predict_result)
print(X_result)
y.to_csv('result.csv')
Score: 0.6923076923076923
croptype bio1 bio2 ... totc totn watercapab
0 1 10.835200 7.35701 ... 11.72 1.33 14
1 1 10.594600 7.27485 ... 11.72 1.33 14
2 1 10.820800 7.65421 ... 11.72 1.33 14
3 1 10.781500 7.59592 ... 11.72 1.33 14
4 1 10.527900 7.23958 ... 11.72 1.33 14
... ... ... ... ... ... ... ...
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\base.py:443: UserWarning: X has feature names, but RandomForestClassifier was fitted without feature names
warnings.warn(
[3 3 3 ... 3 3 3]
Process finished with exit code 0
可以看出,预测结果全部为3。尝试预测训练集,得到的结果也全是3类,报错内容一样。
这通常是由于你在建立随机森林模型时,没有指定特征名称。
在使用 Sklearn 建立随机森林模型时,可以使用 RandomForestClassifier 类的 fit 方法来训练模型。这个方法需要输入两个参数:X 和 y。其中,X 是训练数据的特征矩阵,y 是训练数据的标签。
如果你在建立随机森林模型时没有指定特征名称,那么 Sklearn 会自动生成特征名称,并使用默认的特征名称来训练模型。
当你使用建立的模型对另一个数据集进行预测时,如果你的数据集也有特征名称,但是模型没有使用特征名称训练,那么 Sklearn 就会弹出上述警告。