gpt4 book ai didi

python - TF.Learn DNNClassifier 和 LinearClassifier 的精度问题

转载 作者:太空宇宙 更新时间:2023-11-04 00:45:05 24 4
gpt4 key购买 nike

我编写了一小段代码来找到适合 CDC 数据集的最佳分类器。首先,我尝试了各种 scikit-learn 分类器,然后我决定添加 TF.Learn 分类器(DNNClassifier 和 LinearClassifier),因为 API 几乎相同。

然后,当我比较结果时,所有 scikit-learn 模型都可以轻松达到 60-70% 的准确度,而使用 TF.learn DNNClassifiers 和 LinearClassifier 我不能超过 38% 并且会花费很多时间(如果我什至会挂起)拟合模型时不要设置步数)。

我可能犯了一个错误,但我没有看到...

这里是代码摘录:

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)    

for classifier in classifiers:
if classifier == "TF Deep Neural Network":
feature_columns = learn.infer_real_valued_columns_from_input(X_train)
clf = DNNClassifier(feature_columns=feature_columns,
hidden_units=[10,10,10],
n_classes=2, enable_centered_bias=None);
clf.fit(X_train, Y_train, steps=200)
elif classifier == "TF Linear Classifier":
feature_columns = learn.infer_real_valued_columns_from_input(X_train)
clf = LinearClassifier(n_classes=2, feature_columns=feature_columns)
clf.fit(X_train, Y_train, steps=200)
else:
clf = getInstance(classifiers[classifier][0], classifiers[classifier][1], classifiers[classifier][2])
clf.fit(X_train, Y_train)


# predict on test data
prediction = clf.predict(X_test)

# compute accuracy and sum it to the previous ones
accuracy = accuracy_score(Y_test, prediction)

结果摘录:

classifier Gaussian Naive Bayes accuracy 0.85
classifier K-Nearest Neighbors accuracy 0.87
classifier TF Deep Neural Network accuracy 0.4
classifier Random Forest accuracy 0.85
classifier TF Linear Classifier accuracy 0.4
classifier Decision Tree accuracy 0.87
classifier Neural Network accuracy 0.4
classifier AdaBoost accuracy 0.86
classifier Linear Support Vector Machine accuracy 0.88
classifier Radial Basic Function Support Vector Machine accuracy 0.74

完整代码在这里:https://github.com/shazz/gender_classification_challenge/blob/master/demo_with_BRFSS_and_TF.py

因此,如果您对 TF.Learn 的准确性如此低(并且需要花费大量时间来适应)的原因有任何见解,我们将不胜感激!

根据 Kumara 的回答更新

我将标签修改为 0 或 1(而不是原始 CDC 数据集中的 1 和 2),然后再次运行分类器测试。新的结果是:

classifier AdaBoost accuracy 0.87 
classifier Linear Support Vector Machine accuracy 0.86
classifier K-Nearest Neighbors accuracy 0.86
classifier Gaussian Naive Bayes accuracy 0.85
classifier Random Forest accuracy 0.85
classifier Radial Basic Function Support Vector Machine accuracy 0.83
classifier Decision Tree accuracy 0.83
classifier Neural Network accuracy 0.64
classifier TF Deep Neural Network accuracy 0.63
classifier TF Linear Classifier accuracy 0.62

所以仍然相当落后于 scikit 学习分类器。可能有道理的是,DNNClassifier 与 scikit 学习多层感知器分类器一样“糟糕”。

您是否认为考虑到数据类型和分类器,TF.Learn DNNClassifier 和 LinearClassifier 没有很好的准确率是正常的?

最佳答案

问题在于 TF.learn 分类器期望类标签作为索引(即对于 2 类问题,y 必须为 0 或 1),而 scikit learn 分类器将 y 视为任意值(例如 77 和 99 是有效的) 2 类问题中 y 的值)。

在这种情况下,查看数据时,类标签为 1 和 2。因此,TF.learn 训练偶尔会看到 2 的越界值,它会忽略该值。因此,它总是预测“1”(如果您在调用 predict() 后打印“prediction”和“Y_test”,这将变得很明显)。标签值“1”可能占数据的 40%,因此准确度为 40%。

修复方法是将标签映射到类索引(例如,标签“1”映射到索引 0,标签“2”映射到索引 1)。例如,我在加载数据后使用“Y = Y - 1”执行此操作(尽管对于任意值,更通用的解决方案会更好):

# load data and convert Y into 1d vector
X, Y = data_importer.load_data(500)
print("X", X.shape, "Y", Y.shape)

# FIX: Y/Labels are "1" and "2" for male/female. We should convert
# these to indices into a 2 class space
# (i.e. "1" is index 0, and "2" is index 1).
Y = Y - 1

# train and check the model against the test data for each classifier
iterations = 1
results = {}
for itr in range(iterations):

# Resuffle training/testing datasets by sampling randomly 80/20% of the input data
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
...

理想情况下,这两个 API 应该是兼容的,或者至少 TF.learn API 应该更清楚地记录这种区别。虽然可以说使用类索引对于任意类(例如图像类)更有效和更清晰。

关于python - TF.Learn DNNClassifier 和 LinearClassifier 的精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40086126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com