【问题标题】:Generating Difficult Classification Data Sets using scikit-learn使用 scikit-learn 生成难分类数据集
【发布时间】:2015-08-23 03:29:10
【问题描述】:

我正在尝试使用 scikit-learn 中的 make_classification 生成一系列合成数据集,这些数据集具有不同的样本大小、普遍性(即正类的比例)和准确性。改变样本量和流行率相当简单,但我很难使用逻辑回归生成任何精度低于 50% 的数据集。使用信息列的数量、每个类的簇数和 flip_y 参数(它随机翻转给定观察比例的类)似乎会降低准确性,但没有我想要的那么多。有没有办法改变 make_classification 的参数以进一步减少(例如,降低到 20%)?

谢谢!

【问题讨论】:

  • 了解您在此处实际计算准确度的方式可能很重要。
  • 这里的准确率是二分类准确率,即(TP + TN) / N

标签: scikit-learn


【解决方案1】:

一般来说,n_samples 的数量相当少、flip_y 随机翻转标签的概率很高以及n_classes 的数量很大,组合起来应该可以到达您想要的位置。

您可以尝试以下方法:

from sklearn.cross_validation import cross_val_score
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()

# 2-class problem
X, y = make_classification(n_samples=100, n_informative=2, flip_y=0.8, random_state=42)

cross_val_score(estimator=lr, X=X, y=y, scoring='accuracy', cv=10)

# Output
array([ 0.54545455,  0.27272727,  0.45454545,  0.2       ,  0.4       ,
        0.5       ,  0.7       ,  0.55555556,  0.55555556,  0.44444444])

# 8-class problem
X, y = make_classification(n_samples=100, n_classes=8, n_informative=4, n_clusters_per_class=1, flip_y=0.5, random_state=42)

cross_val_score(estimator=lr, X=X, y=y, scoring='accuracy', cv=5)

# Output
array([ 0.16666667,  0.19047619,  0.15      ,  0.16666667,  0.29411765])

【讨论】:

  • 谢谢,这很有帮助!我实际上需要坚持二进制分类问题,但我会尝试使用较小的样本。我以前玩过 1000 - 20000 个样本。
【解决方案2】:

如果你只使用二进制分类,你应该小心选择flip_y。例如,如果您选择flip_y 为高,这意味着您几乎翻转了每个标签,从而使问题变得更容易! (保持一致性)

因此,在二元分类中,flip_y 确实是min(flip_y,1-flip_y),将其设置为 0.5 会使分类变得非常困难。

你可以做的另一件事:创建数据后,进行降维,使用PCA

from sklearn.cross_validation import cross_val_score
from sklearn.datasets import make_classification
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression

clf = LogisticRegression()

X, y = make_classification(n_samples=10000, n_informative=18,n_features=20, flip_y=0.15, random_state=217)
print cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=4)
#prints [ 0.80287885  0.7904      0.796       0.78751501]

pca = PCA(n_components=10)
X = pca.fit_transform(X)

print cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=4)
#prints [ 0.76409436  0.7684      0.7628      0.75830332]

您可以减少 n_components 以获得更差的结果,同时保留原始数量的特征:

pca = PCA(n_components=1)
X = pca.fit_transform(X)

X = np.concatenate((X, np.random.rand(X.shape[0],19)),axis=1) #concatenating random features
cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=10)
print cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=4)
#prints [ 0.5572  0.566   0.5552  0.5664]

获得低于 50% 的准确率是“困难的”——即使你采用随机向量,准确率的期望值仍然是 0.5:

X = np.random.rand(10000,20)
print np.average(cross_val_score(estimator=clf, X=X, y=y, scoring='accuracy', cv=100))
#prints 0.501489999

所以 55% 的准确率被认为是非常低的。

【讨论】:

  • @Sean B. 这是你的意思吗?
  • 好的,谢谢! PCA 是一个好主意,是的,大约 50% 似乎是我能得到的最低值(我在一个有 100 个样本的情况下能够达到 42%)。
  • 即使我迟到了,这里有一个good link 使用 make_classification 生成不同难度级别的数据。
猜你喜欢
  • 2015-05-22
  • 2016-07-13
  • 2021-05-10
  • 2013-03-06
  • 2012-11-24
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多