我正在尝试使用scikit-learn中的make_classification生成一系列合成数据集,具有不同的样本大小,流行度(即正类的比例)和准确度。改变样本量和流行率是相当简单的,但我很难使用逻辑回归生成任何精度低于50%的数据集。使用信息列的数量,每个类的簇数和flip_y参数(随机翻转给定比例的观察的类)似乎降低了准确性,但没有我想要的那么多。有没有办法改变make_classification的参数,以便进一步减少这种情况(例如,降低到20%)?
谢谢!
答案 0 :(得分:1)
通常情况下,n_samples
数量相当少,随机翻转标签flip_y
和大量n_classes
的概率很高的组合可以让您到达目的地。< / p>
您可以尝试以下操作:
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])
答案 1 :(得分:1)
如果您只使用二进制分类,则应仔细选择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%的准确度被认为非常低。