- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经通过 tf.keras 使用谷歌 BERT 训练了一个文本分类器。
我的数据集包含 50,000 行数据,均匀分布在 5 个标签上。这是一个更大数据集的子集,但我选择了这些特定标签,因为它们彼此完全不同,以避免在训练过程中出现混淆。
我按如下方式创建数据拆分:
train, test = train_test_split(df, test_size=0.30, shuffle=True, stratify=df['label'], random_state=10)
train, val = train_test_split(train, test_size=0.1, shuffle=True, stratify=train['label'], random_state=10)
模型设计是:
def compile():
mirrored_strategy = tf.distribute.MirroredStrategy()
with mirrored_strategy.scope():
learn_rate = 4e-5
bert = 'bert-base-uncased'
model = TFBertModel.from_pretrained(bert, trainable=False)
input_ids_layer = Input(shape=(512,), dtype=np.int32)
input_mask_layer = Input(shape=(512,), dtype=np.int32)
bert_layer = model([input_ids_layer, input_mask_layer])[0]
X = tf.keras.layers.GlobalMaxPool1D()(bert_layer)
output = Dense(5)(X)
output = BatchNormalization(trainable=False)(output)
output = Activation('softmax')(output)
model_ = Model(inputs=[input_ids_layer, input_mask_layer], outputs=output)
optimizer = tf.keras.optimizers.Adam(4e-5)
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
metric = tf.keras.metrics.SparseCategoricalAccuracy('accuracy')
model_.compile(optimizer=optimizer, loss=loss, metrics=[metric])
return model_
结果如下:
loss: 1.2433
accuracy: 0.8024
val_loss: 1.2148
val_accuracy: 0.8300
f1_score: 0.8283
precision: 0.8300
recall: 0.8286
auc: 0.9676
当我运行测试数据并将单热编码标签转换回其原始标签时(使用了 model.load_weights()
)...
test_sample = [test_dataset[0],test_dataset[1], test_dataset[2]]
predictions = tf.argmax(model.predict(test_sample[:2]), axis =1)
preds_inv = le.inverse_transform(predictions)
true_inv = le.inverse_transform(test_sample[2])
...混淆矩阵无处不在:
confusion_matrix(true_inv, inv_preds)
array([[ 967, 202, 7, 685, 1139],
[ 474, 785, 27, 717, 997],
[ 768, 372, 46, 1024, 790],
[ 463, 426, 27, 1272, 812],
[ 387, 224, 11, 643, 1735]])
有趣的是,第三个标签几乎没有被预测到。
请注意,我在批量归一化中设置了 trainable=False,但在训练期间它被设置为 true。
输入数据由两个数组组成:文本字符串的数值向量表示(嵌入)和用于标识每个字符串的 512 个元素中哪些元素是填充值的填充标记。
在使用深度预训练模型 (bert) 训练的均匀平衡的数据集上,给出合理的准确度分数但做出糟糕预测的原因可能是什么?
最佳答案
在我的具体案例中,我通过调查导致混淆的 2 个标签的内容解决了这个问题。我用 wordcloud 做了这个。下面的示例显示了我对其中一个标签的代码:
from os import path
from PIL import Image
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
% matplotlib inline
df1 = df[df['label']==48000000]
text = " ".join(review for review in df1.text)
wordcloud = WordCloud().generate(text)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
现在,我的理解是 BERT 应该能够识别哪些词对特定标签很重要(使用 TF-IDF 之类的东西?不确定),但是,当我使用 NLTK 删除停用词时,还通过添加到列出了我认为对我的特定数据集通用的词,在本例中为“系统”、“服务”(等),在重新训练模型后,准确度显着提高:
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
def preprocess_text(sentence):
# Convert to lowercase
sentence = sentence.lower()
new_stopwords = ['service','contract','solution','county','supplier',
'district','council','borough','management',
'provider','provision'
'project','contractor']
stop_words = set(stopwords.words('english'))
stop_words.update(new_stopwords)
sentence = [w for w in sentence.split(" ") if not w in stop_words]
sentence = ' '.join(w for w in sentence)
return sentence
df['text'] = df['text'].apply(preprocess_text)
关于python - Keras BERT - 高精度、验证 acc、f1、auc -> 但预测不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62348810/
在 SQL 中计算 AUC 的最佳方法是什么? 这是我得到的(假设表 T(label, confid) 和 label=0,1): SELECT sum(cumneg * label) * 1e0 /
我正在训练用于图像分类的CNN。由于我的数据集有限,我正在使用转移学习。基本上,我使用的是Google在其再培训示例(https://www.tensorflow.org/tutorials/imag
我正在 sci-kit learn 中构建 MLPClassifier 模型。我使用 gridSearchCV 和 roc_auc 对模型进行评分。训练和考试的平均成绩在 0.76 左右,还不错。 c
我使用我的测试集作为验证集。我使用了与 How to compute Receiving Operating Characteristic (ROC) and AUC in keras? 类似的方法
我分别从 sklearn 的 RandomForestClassifier 和 roc_curve、auc 方法收到不同的 ROC-AUC 分数。 以下代码让我获得了 0.878 的 ROC-AUC(
如何获得具有 fpr 和 tpr 的 AUC 值? Fpr 和 tpr 只是从这些公式中获得的 2 个浮点数: my_fpr = fp / (fp + tn) my_tpr = tp / (tp +
我有一个分类问题,我想在 sklearn 中使用 cross_validate 获取 roc_auc 值。我的代码如下。 from sklearn import datasets iris = dat
我有一个分类问题,我想在 sklearn 中使用 cross_validate 获取 roc_auc 值。我的代码如下。 from sklearn import datasets iris = dat
在 scikit learn 中,您可以使用以下方法计算二元分类器的曲线下面积 roc_auc_score( Y, clf.predict_proba(X)[:,1] ) 我只对误报率小于 0.1 的
我正在尝试为我的 SVM 找到参数,这些参数会给我最好的 AUC。但是我在 sklearn 中找不到 AUC 的任何评分函数。有人有想法吗?这是我的代码: parameters = {"C":
这是一个代表 library(caret) library(dplyr) set.seed(88, sample.kind = "Rounding") mtcars % mutate(am = a
对于二元分类问题,我有一个略微不平衡的数据集,正负比为 0.6。 我最近从这个答案中了解到了 auc 指标:https://stats.stackexchange.com/a/132832/12822
我有一个 Spark 数据框,如下所示: predictions.show(5) +------+----+------+-----------+ | user|item|rating| predi
我正在研究一个分类问题,其评估指标为 ROC AUC。到目前为止,我已经尝试使用具有不同参数的 xgb 。这是我用来采样数据的函数。并且可以找到相关笔记本here (google colab) def
我对 python 中的 scikit-learn 中如何生成阈值感到困惑。对于以下示例,生成了四个阈值,当我将 pred 中的第三个值更改为 0.6 时,阈值数量降至 3。任何人都可以解释为什么会这
假设我有一个如下所示的数据集: word label_numeric 0 active 0 1 adventurous 0 2 aggressive 0 3 aggressi
我有一个分类问题,需要根据给定的数据预测 (0,1) 类。基本上我有一个包含超过 300 个特征(包括预测目标值)和超过 2000 行(样本)的数据集。我应用了不同的分类器,如下所示: 1. Dec
我的目标是找到预测模型来确定是否偿还贷款。我的来源是一个 CSV 文件,其中包含贷款特征以及是否已偿还。我使用 ROC 曲线和 AUC 评估模型的性能 df = pd.read_csv(your_pa
我想知道为什么我们的目标是在最大化准确率时最大化 AUC? 我认为,除了最大化准确性的主要目标之外,AUC 也会自动变大。 最佳答案 我想我们使用 AUC 是因为它解释了我们的方法能够在多大程度上独立
我正在尝试在非常不平衡的数据集上使用 LightGBM 构建分类器。不平衡的比例为 97:3,即: Class 0 0.970691 1 0.029309 我使用的参数和训练代码如下所示。
我是一名优秀的程序员,十分优秀!