标签: classification

如何测试我的分类器是否过度拟合?

我在此处提供了 .tsv 文件中的一组数据。我编写了几个分类器来决定给定的网站是短暂的还是常青的。

现在,我想让他们变得更好。通过与人们交谈,我知道我的分类器“过度拟合”了数据;我正在寻找一种可靠的方法来证明这一点,以便下次编写分类器时,我将能够运行测试并查看是否过度拟合或拟合不足。

这样做的最佳方法是什么?我愿意接受所有建议!

我花了几周的时间在谷歌上搜索这个主题,但没有发现任何规范或可信的方法可以有效地做到这一点,因此任何回应将不胜感激。我将对这个问题悬赏

编辑:

假设我的分类器输出一个 .tsv 包含:

the website UID<tab>the likelihood it is to be ephemeral or evergreen, 0 being ephemeral, 1 being evergreen<tab>whether the page is ephemeral or evergreen
Run Code Online (Sandbox Code Playgroud)

python artificial-intelligence classification machine-learning scikit-learn

1
推荐指数
1
解决办法
6652
查看次数

使用大量数据偏向某一类别来预测类别

我有一个关于如何处理一些有趣数据的问题。

\n\n

我目前有一些数据(计数是真实的,但情况是假的),我们可以预测人们今天会在网上购买的 T 恤数量。我们对每个人的特征属性都了解很多,而且这些属性每天都在变化。我们还知道每个人前几天购买了多少件 T 恤。

\n\n

我想要的是有一个算法,能够产生一个连续变量,即该人今天要购买的 T 恤数量的排名或 \xe2\x80\x9cscore\xe2\x80\x9d 。我的最终目标是,如果我可以将这个分数附加到每个人身上,我可以根据分数对他们进行排序并在特定的 UI 中使用它们。目前,我\xe2\x80\x99一直在使用 sci-kit 的随机森林回归,其中我的目标类别是昨天\xe2\x80\x99s 每个人购买 T 恤的计数。效果非常好,只是我的数据有点困难,因为有很多人购买了 0 件 T 恤。这是一个问题,因为我的随机森林给了我很多预测的 0 类,但我无法有效地对它们进行排序。我明白为什么会发生这种情况,但我\xe2\x80\x99m 不确定解决它的最佳方法。

\n\n

我想要的是一个非零分数(即使它\xe2\x80\x99是一个接近0的非常小的数字),它告诉我更多关于特征和预测类别的信息。我觉得我的一些特征一定能够告诉我一些东西,并给我一个比 0 更好的预测。

\n\n

我认为固有的问题是使用随机森林回归器作为算法。每棵树都获得投票;然而,有太多的零,以至于有很多森林,所有的树都投票给 0。我想尝试另一种算法,但我不\xe2\x80\x99 不知道哪一个最有效。目前 I\xe2\x80\x99m 对整个数据集进行训练并使用 scikit 提供的袋外估计。

\n\n

以下是数据类的计数(使用 python\xe2\x80\x99s Counter([目标类])。设置如下:{predicted_class_value: counts_of_that_value_in_the_target_class_list}\n{0: 3560426, 1: 121256, 2: 10582 , 3: 1029, 4: 412, 5: 88, 6: 66, 7: 35, 8: 21, 9: 17, 10: 17, 11: 10, 12: 2, 13: 2, 15: 2, 21 : 2, 17: 1, 18: …

statistics classification machine-learning prediction scikit-learn

1
推荐指数
1
解决办法
926
查看次数

如何更改 NLTK 中 POS 标记的 maxent 分类器的迭代次数?

ClassifierBasedPOSTagger我正在尝试使用with执行 POS 标记classifier_builder=MaxentClassifier.train。这是一段代码:

from nltk.tag.sequential import ClassifierBasedPOSTagger
from nltk.classify import MaxentClassifier
from nltk.corpus import brown

brown_tagged_sents = brown.tagged_sents(categories='news')
size = int(len(brown_tagged_sents) * 0.9)

train_sents = brown_tagged_sents[:size]
test_sents = brown_tagged_sents[size:]

me_tagger = ClassifierBasedPOSTagger(train=train_sents, classifier_builder=MaxentClassifier.train)
print(me_tagger.evaluate(test_sents))
Run Code Online (Sandbox Code Playgroud)

但运行代码一个小时后,我发现它仍在初始化ClassifierBasedPOSTagger(train=train_sents, classifier_builder=MaxentClassifier.train). 在输出中,我可以看到以下代码正在运行:

  ==> Training (100 iterations)

  Iteration    Log Likelihood    Accuracy
  ---------------------------------------
         1          -5.35659        0.007
         2          -0.85922        0.953
         3          -0.56125        0.986
Run Code Online (Sandbox Code Playgroud)

我认为在分类器准备好为任何输入标记词性之前,迭代次数将达到 100 次。我想这需要一整天的时间。为什么要花这么多时间?减少迭代次数会让这段代码变得有点实用(意味着减少时间并且仍然足够有用),如果是,那么如何减少这些迭代?

编辑

1.5 小时后,我得到以下输出:

  ==> Training (100 iterations)

  Iteration    Log Likelihood    Accuracy
  ---------------------------------------
         1          -5.35659        0.007
         2          -0.85922 …
Run Code Online (Sandbox Code Playgroud)

python nlp classification nltk

1
推荐指数
1
解决办法
1226
查看次数

min_samples_split 必须至少为 2 或在 (0, 1] 中,得到 1

min_samples_split must be at least 2 or in (0, 1], got 1我定义了一个二元分类器,如下所示:我用“gbc”方法(梯度提升分类器)调用它,并在最后一行中得到错误。featuresClasses 是一个数据框,featureLabels 是特征列表。

Binary_classifier(method, featureLabels, featuresClasses):

    membershipIds = list(set(featuresClasses['membershipId']))
    n_membershipIds = len(membershipIds)

    index_rand = np.random.permutation(n_membershipIds)
    test_size = int(0.3 * n_membershipIds)

    membershipIds_test = list(itemgetter(*index_rand[:test_size])(membershipIds))
    membershipIds_train = list(itemgetter(*index_rand[test_size+1:])(membershipIds))

    data_test = featuresClasses[featuresClasses['membershipId'].isin(membershipIds_test)]
    data_train = featuresClasses[featuresClasses['membershipId'].isin(membershipIds_train)]

    data_test = data_test[data_test['standing'].isin([0, 1])]
    data_train = data_train[data_train['standing'].isin([0, 1])]

    X_test = data_test[featureLabels].as_matrix()
    y_test = data_test['standing'].values.astype(int)

    X_train = data_train[featureLabels].as_matrix()
    y_train = data_train['standing'].values.astype(int)

    # -------------------------- Run classifier
    print 'Binary classification by', method

    if method == 'svm':
        classifier = svm.SVC(kernel='linear', …
Run Code Online (Sandbox Code Playgroud)

python classification scikit-learn

1
推荐指数
1
解决办法
6890
查看次数

准确率随着时代的增加而降低

我是 Keras 和机器学习的新手。我正在尝试使用 Sequential 模型构建一个二元分类模型。经过一些实验,我发现在多次运行中(并非总是如此),我在第二个或第三个时期本身的验证数据上获得了甚至 97% 的准确率,但这急剧下降到了 12%。这背后的原因是什么?如何微调我的模型?这是我的代码 -

model = Sequential()
model.add(Flatten(input_shape=(6,size)))
model.add(Dense(6,activation='relu'))
model.add(Dropout(0.35))
model.add(Dense(3,activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(1,activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['binary_accuracy'])
model.fit(x, y,epochs=60,batch_size=40,validation_split=0.2)
Run Code Online (Sandbox Code Playgroud)

python classification machine-learning deep-learning keras

1
推荐指数
1
解决办法
1万
查看次数

keras inceptionV3 错误“base_model.get_layer('custom')” ValueError: No such layer: custom

我正在尝试使用 inceptionV3 预训练模型(来自 keras 应用程序)提取特征。我的代码有以下块:

 base_model = InceptionV3(include_top=include_top, weights=weights, input_tensor=Input(shape=(299,299,3)))
 model = Model(input=base_model.input, output=base_model.get_layer('custom').output)
 image_size = (299, 299)
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它会出现以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-24-fa1f85b62b84> in <module>()
     20 elif model_name == "inceptionv3":
     21   base_model = InceptionV3(include_top=include_top, weights=weights, input_tensor=Input(shape=(299,299,3)))
---> 22   model = Model(input=base_model.input, output=base_model.get_layer('custom').output)
     23   image_size = (299, 299)
     24 elif model_name == "inceptionresnetv2":

~\Anaconda3\lib\site-packages\keras\engine\network.py in get_layer(self, name, index)
    362         """Retrieves the model's updates.
    363 
--> 364         Will only include updates that are either
    365         unconditional, or conditional on …
Run Code Online (Sandbox Code Playgroud)

python classification keras tensorflow

1
推荐指数
1
解决办法
3475
查看次数

校准会提高 roc 分数吗?

我正在研究执行校准分类器的效果,我读到校准的目的是使分类器的预测更“可靠”。考虑到这一点,我认为校准后的分类器会有更高的分数 (roc_auc)

当用 sklearn 在 Python 中测试这个假设时,发现正好相反

你能解释一下吗:

校准会提高 roc 分数吗?(或任何指标)

如果不是真的。执行校准的优势是什么?

clf=SVC(probability=True).fit(X_train,y_train)
calibrated=CalibratedClassifierCV(clf,cv=5,method='sigmoid').fit(X_train,y_train)
probs=clf.predict_proba(X_test)[:,1]
cal_probs=calibrated.predict_proba(X_test)[:,1]

plt.figure(figsize=(12,7))
names=['non-calibrated SVM','calibrated SVM']
for i,p in enumerate([probs,cal_probs]):
    plt.subplot(1,2,i+1)
    fpr,tpr,threshold=roc_curve(y_test,p)
    plt.plot(fpr,tpr,label=nombre[i],marker='o')
    plt.title(names[i]+ '\n' + 'ROC: '+ str(round(roc_auc_score(y_test,p),4)))
    plt.plot([0,1],[0,1],color='red',linestyle='--')
    plt.grid()
    plt.tight_layout()
    plt.xlim([0,1])
    plt.ylim([0,1])
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

python classification machine-learning roc scikit-learn

1
推荐指数
1
解决办法
882
查看次数

你如何“导入”MNIST 的图像数据?

所以我一直在使用 Tensorflow 的神经网络教程。我完成了本质上只是 MNIST 的“基本分类”,并且一直致力于制作我自己的自定义变体,作为一个小小的思想实验。除了将数据集放入可用的形式之外,一切都是不言自明的,因为本教程使用了预制的数据集,并且看起来有些拐弯抹角。我只想知道如何将彩色照片放入可用的数据中。我假设这只是一个一维数组。作为一个附带问题,如果 2d 照片不是 CNN,那么如果将 2d 照片存储在 1d 数组中,那么神经网络是否会失去任何有效性。

artificial-intelligence classification image-recognition neural-network mnist

1
推荐指数
1
解决办法
882
查看次数

灵敏度特异性图python

我正在尝试重现类似于此的灵敏度特异性图:其中 X 轴是阈值

在此处输入图片说明

但是我还没有找到怎么做,一些像 ROC 曲线这样的 skalern 指标会返回真阳性和假阳性,但我还没有找到任何选项来制作这个图。

我试图将概率与实际标签进行比较以保持计数,我得到的情节是这样的:

在此处输入图片说明

因此,X 标签必须标准化,以便曲线实际上可以上下移动。

python classification machine-learning scikit-learn

1
推荐指数
1
解决办法
4024
查看次数

使用 Keras 训练 CNN-LSTM 时卡在第一个 epoch

我正在使用 Keras 构建用于推文分类的 CNN-LSTM 模型。该模型有两个输入,任务是三类分类。我用来构建模型的代码如下:

def conv2d_lstm_with_author():

    # Get the input information - author & tweet
    author_repre_input = Input(shape=(100,), name='author_input')
    tweet_input = Input(shape=(13, 100, 1), name='tweet_input')

    # Create the convolutional layer and lstm layer
    conv2d = Conv2D(filters = 200, kernel_size = (2, 100), padding='same', activation='relu', 
                    use_bias=True, name='conv_1')(tweet_input)
    flat = Flatten(name='flatten_1')(conv2d)
    reshape_flat = Reshape((260000, 1), name='reshape_1')(flat)
    lstm = LSTM(100, return_state=False, activation='tanh', recurrent_activation='hard_sigmoid', name='lstm_1')(reshape_flat)
    concatenate_layer = concatenate([lstm, author_repre_input], axis=1, name='concat_1')
    dense_1 = Dense(10, activation='relu', name='dense_1')(concatenate_layer)
    output = Dense(3, activation='softmax', kernel_regularizer=regularizers.l2(0.01), name='output_dense')(dense_1)

    # …
Run Code Online (Sandbox Code Playgroud)

python classification keras tensorflow google-colaboratory

1
推荐指数
1
解决办法
2156
查看次数