我在此处提供了 .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
我有一个关于如何处理一些有趣数据的问题。
\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
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) 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) 我是 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) 我正在尝试使用 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) 我正在研究执行校准分类器的效果,我读到校准的目的是使分类器的预测更“可靠”。考虑到这一点,我认为校准后的分类器会有更高的分数 (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)
所以我一直在使用 Tensorflow 的神经网络教程。我完成了本质上只是 MNIST 的“基本分类”,并且一直致力于制作我自己的自定义变体,作为一个小小的思想实验。除了将数据集放入可用的形式之外,一切都是不言自明的,因为本教程使用了预制的数据集,并且看起来有些拐弯抹角。我只想知道如何将彩色照片放入可用的数据中。我假设这只是一个一维数组。作为一个附带问题,如果 2d 照片不是 CNN,那么如果将 2d 照片存储在 1d 数组中,那么神经网络是否会失去任何有效性。
artificial-intelligence classification image-recognition neural-network mnist
我正在尝试重现类似于此的灵敏度特异性图:其中 X 轴是阈值
但是我还没有找到怎么做,一些像 ROC 曲线这样的 skalern 指标会返回真阳性和假阳性,但我还没有找到任何选项来制作这个图。
我试图将概率与实际标签进行比较以保持计数,我得到的情节是这样的:
因此,X 标签必须标准化,以便曲线实际上可以上下移动。
我正在使用 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) classification ×10
python ×8
scikit-learn ×5
keras ×3
tensorflow ×2
mnist ×1
nlp ×1
nltk ×1
prediction ×1
roc ×1
statistics ×1