2015-06-08 2 views
0

Я пытаюсь создать набор синтетических наборов данных, используя make_classification в scikit-learn, с различными размерами выборки, распространенностью (т. Е. Пропорциями положительного класса) и точностью. Изменение размера выборки и распространенности довольно просто, но мне сложно создавать любые наборы данных с точностью менее 50% с использованием логистической регрессии. Играя с количеством информационных столбцов, количеством кластеров в классе и параметром flip_y (который случайным образом переворачивает класс данной пропорции наблюдений), похоже, снижает точность, но не настолько, насколько мне хотелось бы. Есть ли способ изменить параметры make_classification таким образом, чтобы уменьшить это дальше (например, до 20%)?Создание сложных наборов данных с использованием scikit-learn

Спасибо!

+0

Возможно, важно знать, как вы на самом деле вычисляете точность здесь. – cel

+0

Здесь точность является бинарной классификационной точностью, то есть (TP + TN)/N –

ответ

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]) 
+0

Спасибо, это полезно! Мне действительно нужно придерживаться двоичных задач классификации, но я попробую с меньшими выборками. Раньше я играл с 1000 - 20000 образцами. –

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% считается очень низкой.

+0

@Sean B. это то, что вы имели в виду? – omerbp

+0

Да, спасибо! PCA - хорошая идея, и да, около 50%, кажется, примерно так же низко, как я могу получить (я смог достичь 42% в одном случае с 100 образцами). –

Смежные вопросы