我很感激在思考这个过程中提供了一些帮助.我有一个分类器,可以成功地将图像分类成狗或猫,准确性很高.我有一个很好的数据集来训练分类器.到目前为止没问题.
我有大约20,000只狗和20,000只猫图像.
然而,当我试图展示其他图像,如汽车或建筑物或没有狗或猫的老虎时,我希望分类器的输出为"Niether".现在很明显,分类器试图将所有东西分类为狗或猫,这是不正确的.
问题1:
我怎样才能做到这一点?我是否需要拥有一组不包含狗或猫的图像,并在这些附加图像上训练分类器以将其他所有内容识别为"两者"?
在近似的高水平,我需要多少图片的非狗/猫类才能获得良好的准确度?自从非狗/猫图像领域如此庞大以来,大约会有50,000张图像吗?还是我需要更多图片?
问题2:
我可以使用Imagenet训练的VGG16 Keras模型作为初始层,而不是使用我自己的图像数据训练我自己的分类器,并将DOG/CAT/Neither分类器添加到顶部作为完全连接层?
非常感谢你的帮助.
image classification machine-learning multilabel-classification keras
我在三类分类问题上使用OneVsRest分类器(三个随机森林).每个类的出现都是我的虚拟整数(1表示发生,0表示否则).我想知道是否有一种简单的替代方法来创建混淆矩阵?正如我遇到的所有方法一样,以y_pred,y_train = array,shape = [n_samples]的形式获取参数.理想情况下,我想要y_pred,y_train = array,shape = [n_samples,n_classes]
一些样本,类似于问题的结构:
y_train = np.array([(1,0,0), (1,0,0), (0,0,1), (1,0,0), (0,1,0)])
y_pred = np.array([(1,0,0), (0,1,0), (0,0,1), (0,1,0), (1,0,0)])
print(metrics.confusion_matrix(y_train, y_pred)
Run Code Online (Sandbox Code Playgroud)
退货:不支持多标签指标
因此,我在我创建的多标签数据集(约20000个样本)上训练了一个深度神经网络。我将softmax切换为S形并尝试最小化(使用Adam优化器):
tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y_, logits=y_pred)
Run Code Online (Sandbox Code Playgroud)
最后,我得到了这个预测之王(相当“恒定”):
Prediction for Im1 : [ 0.59275776 0.08751075 0.37567005 0.1636796 0.42361438 0.08701646 0.38991812 0.54468459 0.34593087 0.82790571]
Prediction for Im2 : [ 0.52609032 0.07885984 0.45780018 0.04995904 0.32828355 0.07349177 0.35400775 0.36479294 0.30002621 0.84438241]
Prediction for Im3 : [ 0.58714485 0.03258472 0.3349618 0.03199361 0.54665488 0.02271551 0.43719986 0.54638696 0.20344526 0.88144571]
Run Code Online (Sandbox Code Playgroud)
起初,我以为自己只是想为每个班级找到一个阈值。
但是我注意到,例如,在我的20000个样本中,第一类出现的次数约为10800,因此比率为0.54,并且该值始终是我的预测的值。因此,我认为我需要找到一种解决突尼斯“不平衡的数据集”问题的方法。
我考虑过将数据集(Underampling)减少为每个类别都具有相同的出现次数,但只有26个样本对应于我的一个类别...这会使我失去很多样本...
我读到了有关过度采样或对更多类(虽然很少见但并未真正理解其工作原理)进行惩罚的文章。
有人可以分享一些有关这些方法的解释吗?
实际上,在Tensorflow上,是否有有助于实现此目的的函数?
还有其他建议吗?
谢谢 :)
PS:用于不平衡的多类别多标签分类的神经网络这篇文章提出了同样的问题,但没有答案!
在我的多标签分类问题中,除了类预测之外,我还需要检索这些预测的置信度分数。
我使用 OneVsRestClassifer 和 LogisticRegression 模型作为基分类器。在试验我的训练和测试集时,我注意到,当不使用概率校准时,大多数置信度分数都在 0.95 - 0.95 的范围内,奇怪的是,大约 10% 的分数非常接近于零(然后没有标签)由分类器预测)。
我读过 LogisticRegression 应该已经经过良好校准,所以有人可以解释为什么可以观察到这种行为吗?我期待概率的分布更加平滑。这是否意味着对于 OneVsRestClassifier,其逻辑回归组件的良好校准不再适用?
我决定使用 sklearn 中提供的 CalibrateClassifierCV 类,但我注意到根据以下观察,一些概率显着下降。为什么近百%的置信度会下降到50%左右?有谁知道任何其他方法可以帮助我衡量这些概率?
无校准:
[0.99988209306050746], [0.99999511284844622], [0.99999995078223347], [0.99999989965720448], [0.99999986079273884], [0.99979651575446726], [0.99937347155943868]
Run Code Online (Sandbox Code Playgroud)
等渗校准:
[0.49181127862298107], [0.62761741532720483], [0.71285392633212574], [0.74505221607398842], [0.67966429109225246], [0.47133458243199672], [0.48596255165026925]
Run Code Online (Sandbox Code Playgroud)
乙状结肠校准:
[0.61111111111111116], [0.86111111111111116], [0.86111111111111116], [0.86111111111111116], [0.86111111111111116], [0.61111111111111116], [0.47222222222222227]
Run Code Online (Sandbox Code Playgroud)
我现在使用的代码:
#Fit the classifier
clf = LogisticRegression(C=1., solver='lbfgs')
clf = CalibratedClassifierCV(clf, method='sigmoid')
clf = OneVsRestClassifier(clf)
mlb = MultiLabelBinarizer()
mlb = mlb.fit(train_labels)
train_labels = mlb.transform(train_labels)
clf.fit(train_profiles, train_labels)
#Predict probabilities:
probas = clf.predict_proba([x_test])
Run Code Online (Sandbox Code Playgroud) python machine-learning scikit-learn multilabel-classification
我想知道如何使用 sklearn 运行多类、多标签、序数分类。我想预测目标群体的排名,范围从某一位置最普遍的群体 (1) 到最不普遍的群体 (7)。我似乎无法正确处理。你能帮我一下吗?
# Random Forest Classification
# Import
import numpy as np
import pandas as pd
from sklearn.model_selection import GridSearchCV, cross_val_score, train_test_split
from sklearn.metrics import make_scorer, accuracy_score, confusion_matrix, f1_score
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
# Import dataset
dataset = pd.read_excel('alle_probs_edit.v2.xlsx')
X = dataset.iloc[:,4:-1].values
Y = dataset.iloc[:,-1].values
# Split in Train and Test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 42 )
# Scaling the features (alle Variablen auf …Run Code Online (Sandbox Code Playgroud) python ordinal scikit-learn multilabel-classification multiclass-classification
我正在开展一个分类项目,一个结果可能属于多个类别。例如,结果可能属于 A、B 和/或 C 类;例如,A、B、A&B、A&C、B&C 等。但是,我想预测一个类别的概率。例如,P(A)=结果包含 A 类的概率;例如,Pr(A)+Pr(A&B)+Pr(A&C)+Pr(A&B&C)。
我更喜欢使用 LightGBM。我的问题是:
multilabel-classification multiclass-classification lightgbm
当我使用此代码绘制混淆矩阵时
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
cm = confusion_matrix(y_test, rmc_pred, labels=rmc.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm,
display_labels=rmc.classes_)
disp.plot()
Run Code Online (Sandbox Code Playgroud)
我得到一个紫色、黄色、蓝色和绿色的矩阵,每行都有垂直和水平的线切割。我想要一个蓝色的混淆矩阵,看起来像 sklearn 的文档中一样。你们中的任何人都可以帮助我如何做到这一点吗?提前谢谢了!
如果我将 sklearns 函数plot_confusion_matrix 与 cmap 参数一起使用,我会收到一条错误消息,指出:固定定位器位置的数量 (9),通常来自对 set_ticks 的调用,与刻度标签的数量 (10) 不匹配。
python matplotlib confusion-matrix scikit-learn multilabel-classification
这可能是一个愚蠢的问题,但我只是想知道 scikit.ml 中实现的 ML-KNN 和 scikit-learn 的 KNeighborsClassifier 之间的区别是什么。根据sklearn 的文档, KNeighborsClassifier 支持多标签分类。然而,ML-KNN 是适用于多标签分类的 KNN,它基于 sklearn 的架构基于它的docs。
在搜索样本多标签问题时,MLkNN 主要出现,但我不明白使用它是否比 sklearn 的基本实现有任何优势,如果它已经支持它。只是sklearn方面的后期适配还是在实现上有更多差异?
任何输入表示赞赏。谢谢!
python machine-learning scikit-learn multilabel-classification scikit-multilearn
我正在对实际数据和分类器的预测数据进行多标签分类。实际数据由三个类(c1、c2 和 c3)组成,同样,预测数据也由三个类(c1、c2 和 c3)组成。数据如下
Actual_data Predicted_data
c1 c2 c3 c1 c2 c3
1 1 0 1 1 1
1 1 0 1 0 1
1 0 1 0 1 1
0 1 1 1 0 0
1 0 0 1 1 0
1 1 1 1 0 1
Run Code Online (Sandbox Code Playgroud)
在多标签分类中,一份文档可能属于多个类别。在上面的数据中,1代表文档属于特定类别,0代表文档不属于特定类别。
Actual_data 的第一行表示文档属于类 c1 和 c2,不属于类 c3。类似地,predicted_data 的第一行表示文档属于类 c1、c2 和 c3。
最初,我使用 R 编程来查找实际数据和预测数据之间的混淆矩阵。我将这些数据框保存在 y_actual 和 y_predict 中。
y_actual<-as.matrix(Actual_data)
y_predict<-as.matrix(Predicted_data)
xtab<-table(y_actual,y_predict)
Run Code Online (Sandbox Code Playgroud)
输出xtab是
y_predict
y_actual 0 1
0 1 5
1 5 …Run Code Online (Sandbox Code Playgroud) 我正在使用我自己的图像进行多类分类任务。
filenames = [] # a list of filenames
labels = [] # a list of labels corresponding to the filenames
full_ds = tf.data.Dataset.from_tensor_slices((filenames, labels))
Run Code Online (Sandbox Code Playgroud)
这个完整的数据集将被打乱并分为训练数据集、有效数据集和测试数据集
full_ds_size = len(filenames)
full_ds = full_ds.shuffle(buffer_size=full_ds_size*2, seed=128) # seed is used for reproducibility
train_ds_size = int(0.64 * full_ds_size)
valid_ds_size = int(0.16 * full_ds_size)
train_ds = full_ds.take(train_ds_size)
remaining = full_ds.skip(train_ds_size)
valid_ds = remaining.take(valid_ds_size)
test_ds = remaining.skip(valid_ds_size)
Run Code Online (Sandbox Code Playgroud)
现在我正在努力理解每个类在train_ds、valid_ds和test_ds中是如何分布的。一个丑陋的解决方案是迭代数据集中的所有元素并计算每个类的出现次数。有没有更好的办法解决呢?
我的丑陋的解决方案:
def get_class_distribution(dataset):
class_distribution = {}
for element in dataset.as_numpy_iterator():
label = element[1]
if label in class_distribution.keys():
class_distribution[label] …Run Code Online (Sandbox Code Playgroud) python ×6
scikit-learn ×5
tensorflow ×2
dataset ×1
image ×1
keras ×1
lightgbm ×1
matplotlib ×1
numpy ×1
ordinal ×1
pandas ×1
r ×1
weka ×1