出现该问题是因为模型期望的目标变量(y)是二分类问题,而实际上目标变量可能是多分类问题。
要解决这个问题,可以尝试以下几种方法:
-
确认目标变量的类别数量:检查 y 列中的唯一值数量,确定是二分类问题还是多分类问题。如果唯一值数量超过2个,则是多分类问题。
-
处理多分类问题:如果目标变量是多分类问题,您可以尝试使用适合多分类问题的分类器,如
RandomForestClassifier
的多分类版本RandomForestClassifier
。 -
转换成二分类问题:如果您希望将问题转换为二分类问题,可以考虑对目标变量进行处理,例如将多分类问题转换为二分类问题,或者只选择数据集中的二分类样本进行建模。
-
调整评分指标:在使用
RFECV
时,您指定了scoring="roc_auc"
,这通常用于二分类问题。如果您处理的是多分类问题,可以尝试使用适合多分类问题的评分指标,如scoring="accuracy"
。 -
检查数据预处理:确保数据集中没有缺失值,并且特征和目标变量之间的数据类型正确匹配。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import RFECV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
import joblib
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
data=pd.read_excel("./data/result_gen.xlsx")
# data.drop(data.iloc[:,0],inplace=True)
print(data.shape)
y=data["PVT"]
del data["PVT"]
del data["编号"]
print(data.shape)
print(y.shape)
#创建一个决策树模型
estimator = DecisionTreeClassifier()
#创建RFE选择器
np.random.seed(10)
selector = RFECV(estimator,step=1,scoring="roc_auc",cv=5)
#拟合数据
selector = selector.fit(data,y)
# joblib.dump(selector,"RF_selecter.pkl")
# 画出特征数目和得分的关系图像
plt.figure()
plt.xlabel("Number of features selected",loc="right")
plt.ylabel("Cross validation score (nb of roc and auc)",loc="top")
plt.plot(range(1, len(selector.cv_results_['mean_test_score']) + 1), selector.cv_results_['mean_test_score'],marker="*",lw=3)
plt.xticks(np.arange(0,54,1))
plt.show()
# 输出选定的特征
print(selector.support_)
# 输出特征排名
print(selector.ranking_)
# 获取特征重要性
feature_importance = selector.estimator_.feature_importances_
#获取选择的特征索引
selected_features = selector.get_support()
# 获取特征名称
feature_names = data.columns
selected_feature_names = [feature_names[i] for i, selected in enumerate(selected_features) if selected]
# 打印选择的特征名称
print("Selected Features:")
print(selected_feature_names)
# 绘制特征重要性图
plt.figure()
plt.barh(selected_feature_names, feature_importance,color=(0.6,0.6,0.7))
plt.ylabel('selected_feature_names',loc="top")
plt.xlabel('Feature Importance',loc="right")
plt.title('Feature Importance of Decision Tree')
plt.tick_params(labelsize=8)
plt.show()