반응형
make_classification

make_classification

make_classification은 사이킷런의 패키지로 가상의 분류모형 데이터를 생성해주는 함수이다.

매개변수에 대해 알아보자. 참고 : https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html

매개변수

make_classification

  • n_samples : 표본 데이터의 수 (default=100)

  • n_features : 독립 변수의 수(전체 피처의 수) (default=20)

  • n_informative : 독립 변수 중 종속 변수와 상관 관계가 있는 성분의 수 (default=2)

  • n_redundant : 독립 변수 중 다른 독립 변수의 선형 조합으로 나타나는 성분의 수 (default=2)

  • n_repeated : 독립 변수 중 단순 중복된 성분의 수 (default=0)

  • n_classes : 종속 변수의 클래스 수 default=2)

  • n_clusters_per_class : 클래스 당 클러스터의 수 (default=2)

  • weights : 각 클래스에 할당된 표본 수 (default=None)

  • flip_y : 클래스가 임의로 교환되는 샘플의 일부, 라벨에 노이즈를 생성하여 분류를 어렵게 만든다(default=0.01)

실습

In [12]:
# 패키지 load
from sklearn.datasets import make_classification
from matplotlib import rc
import pylab as plt
%matplotlib inline
rc('font', family='NanumGothic')
In [72]:
plt.title("1개의 독립변수를 가진 가상 데이터")
X, y = make_classification(n_features=1, 
                           n_informative=1,
                           n_redundant=0, 
                           n_clusters_per_class=1, 
                           random_state=42)
plt.scatter(X, y, marker='v', c=y,
            s=200, edgecolor="k",)

plt.xlabel("X")
plt.ylabel("y")
plt.show()
print('X형태 =' ,X.shape)
print('y형태 =' ,y.shape)
X형태 = (100, 1)
y형태 = (100,)
In [82]:
plt.title("2개의 독립변수를 가진 가상 데이터")
X, y = make_classification(n_features=2, 
                           n_informative=1,
                           n_redundant=0, 
                           n_clusters_per_class=1, 
                           random_state=42)
plt.scatter(X[:, 0], X[:, 1], marker='v', c=y,
            s=200, edgecolor="k",)

plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
print('X형태 =' ,X.shape)
print('y형태 =' ,y.shape)
X형태 = (100, 2)
y형태 = (100,)
In [83]:
plt.title("2개의 독립변수를 가진 가상 데이터")
X, y = make_classification(n_features=2, 
                           n_informative=2,
                           n_redundant=0, 
                           n_clusters_per_class=1, 
                           random_state=42)
plt.scatter(X[:, 0], X[:, 1], marker='v', c=y,
            s=200, edgecolor="k",)

plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
print('X형태 =' ,X.shape)
print('y형태 =' ,y.shape)
X형태 = (100, 2)
y형태 = (100,)
In [94]:
plt.title("2개의 독립변수를 가진 비대칭 데이터")
#weifhts를 이용하면 비대칭 데이터를 만들 수 있다.
X, y = make_classification(n_features=2, 
                           n_informative=2,
                           n_redundant=0, 
                           weights=[0.9, 0.1],
                           n_clusters_per_class=1, 
                           random_state=42)
plt.scatter(X[:, 0], X[:, 1], marker='v', c=y,
            s=200, edgecolor="k",)

plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
print('X형태 =' ,X.shape)
print('y형태 =' ,y.shape)
X형태 = (100, 2)
y형태 = (100,)
In [98]:
plt.title("노이즈를 추가한 데이터")
#flip_y 매개변수를 이용한 노이즈 추가
X, y = make_classification(n_features=2, 
                           n_informative=2,
                           n_redundant=0, 
                           flip_y=0.1,
                           n_clusters_per_class=1, 
                           random_state=42)
plt.scatter(X[:, 0], X[:, 1], marker='v', c=y,
            s=200, edgecolor="k",)

plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
print('X형태 =' ,X.shape)
print('y형태 =' ,y.shape)
X형태 = (100, 2)
y형태 = (100,)
In [112]:
plt.title("클래스당 두개의 클러스터를 가진 데이터")
#flip_y 매개변수를 이용한 노이즈 추가
X, y = make_classification(n_features=2, 
                           n_informative=2,
                           n_redundant=0, 
                           n_clusters_per_class=2, 
                           random_state=42)
plt.scatter(X[:, 0], X[:, 1], marker='v', c=y,
            s=200, edgecolor="k",)

plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
print('X형태 =' ,X.shape)
print('y형태 =' ,y.shape)
X형태 = (100, 2)
y형태 = (100,)
In [121]:
plt.title("다중 클래스")
#flip_y 매개변수를 이용한 노이즈 추가
X, y = make_classification(n_features=2, 
                           n_informative=2,
                           n_redundant=0, 
                           n_clusters_per_class=1, 
                           random_state=42,
                           n_classes=3
                          )
plt.scatter(X[:, 0], X[:, 1], marker='v', c=y,
            s=200, edgecolor="k",)

plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
print('X형태 =' ,X.shape)
print('y형태 =' ,y.shape)
X형태 = (100, 2)
y형태 = (100,)

자주뜨는 오류

  • make_classification함수 이용시

n_classes * n_clusters_per_class must be smaller or equal 2 ** n_informative 이러한 오류를 보게될것이다.

이오류는 반응변수 곱하기 클래스당 군집수가 2^ 독립변수중 종속변수와 상관관계가 있는 성분의 수보다 작거나 같지않으면 발생하는 오류다.

여기서는 3 * 2 > 2^2로 오류가 발생한다.

In [123]:
plt.title("다중 클래스")
#flip_y 매개변수를 이용한 노이즈 추가
X, y = make_classification(n_features=2, 
                           n_informative=2,
                           n_redundant=0, 
                           n_clusters_per_class=2, 
                           random_state=42,
                           n_classes=3
                          )
plt.scatter(X[:, 0], X[:, 1], marker='v', c=y,
            s=200, edgecolor="k",)

plt.xlabel("$X_1$")
plt.ylabel("$X_2$")
plt.show()
print('X형태 =' ,X.shape)
print('y형태 =' ,y.shape)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-123-3df2ee10eaa0> in <module>
      6                            n_clusters_per_class=2,
      7                            random_state=42,
----> 8                            n_classes=3
      9                           )
     10 plt.scatter(X[:, 0], X[:, 1], marker='v', c=y,

~\Anaconda3\lib\site-packages\sklearn\datasets\samples_generator.py in make_classification(n_samples, n_features, n_informative, n_redundant, n_repeated, n_classes, n_clusters_per_class, weights, flip_y, class_sep, hypercube, shift, scale, shuffle, random_state)
    163     # Use log2 to avoid overflow errors
    164     if n_informative < np.log2(n_classes * n_clusters_per_class):
--> 165         raise ValueError("n_classes * n_clusters_per_class must"
    166                          " be smaller or equal 2 ** n_informative")
    167     if weights and len(weights) not in [n_classes, n_classes - 1]:

ValueError: n_classes * n_clusters_per_class must be smaller or equal 2 ** n_informative
In [125]:
from IPython.core.display import display, HTML

display(HTML("<style> .container{width:90% !important;}</style>"))
반응형

'competition' 카테고리의 다른 글

Compare optimizer of efficientNet  (2) 2019.11.06
Frequency Encoding이란?  (0) 2019.10.17
kaggle Top8% (681th of 8802) 🥉  (0) 2019.10.17
kaggle Top6% (95th of 1836)🥉  (0) 2019.10.17
[kaggle] Adversarial validation part1  (0) 2019.06.11

+ Recent posts