我正在使用一个多类分类就绪数据集,其中包含14个连续变量和类,从1到10。
我的目标是将scikit学习高斯NB模型应用于数据,但是在二进制分类任务中,只有2类是正标签,其余的类都是负数。为此,我执行了以下代码:
from sklearn.naive_bayes import GaussianNB, CategoricalNB
import pandas as pd
dataset = pd.read_csv("PD_21_22_HA1_dataset.txt", index_col=False, sep="\t")
x_d = dataset.values[:, :-1]
y_d = dataset.values[:, -1]
### train_test_split to split the dataframe into train and test sets
## with a partition of 20% for the test https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
X_TRAIN, X_IVS, y_TRAIN, y_IVS = train_test_split(x_d, y_d, test_size=0.20, random_state=23)
yc_TRAIN=np.array([int(i==2) for i in y_TRAIN])
mdl = GaussianNB()
mdl.fit(X_TRAIN, yc_TRAIN)
preds = mdl.predict(X_IVS)
# binarization of "y_true" array
yc_IVS=np.array([int(i==2) for i in y_IVS])
print("The Precision is: %7.4f" % precision_score(yc_IVS, preds))
print("The Matthews correlation coefficient is: %7.4f" % matthews_corrcoef(yc_IVS, preds))但是,在计算精度时,我会收到以下警告信息:
UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples.马修的相关系数函数也输出0,并给出一个runtimewarning: invalid value encountered in double_scalars消息。
此外,通过检查preds,我得到模型只预测负数/零。
我试着增加20%的测试分区,就像一些论坛建议的那样,但是它没有做任何事情。
这仅仅是一个模型无法与数据相匹配的问题,还是我做错了什么可能将错误的数据格式/类型输入到模型中的问题?
编辑:yc_TRAIN是将所有案例从第2类转换为真正的正数"1“,将其余的类转换为否定句/0的结果,所以它是长度为9450的一维数组(与我的预测案例总数相匹配),超过8697个和7531个,所以它的方面应该是这样的:
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] 发布于 2022-03-20 13:08:30
您的代码看起来很好;这是一个典型的不平衡数据集问题,它实际上意味着您没有足够的培训数据来正确分类罕见的正类。
在给定的代码中,唯一可以改进的是在stratify=y_d中设置train_test_split,以便获得分层的训练集;减小测试集的大小(即留下更多的样本供培训)也可能有帮助:
X_TRAIN, X_IVS, y_TRAIN, y_IVS = train_test_split(x_d, y_d, test_size=0.10, random_state=23, stratify=y_d)如果这不起作用,您应该开始考虑应用类不平衡技术(或不同的模型);但这不再是一个编程问题,而是一个理论/方法问题,应该在适当的SE站点而不是在这里解决(请参阅machine-learning tag info中的介绍和说明)。
https://stackoverflow.com/questions/71544797
复制相似问题