In [1]:
%matplotlib inline
import mglearn
In [2]:
mglearn.plots.plot_scaling()
- min-max scaler
- x도 0~1, y도 0~1로 나눠진다
- standard scaler
- 표준값으로 나눠준다
- robust scaler
- x 중간값/사분위 -> (x-중간값) / (3사분위 - 1사분위) = robust scaler
- 특정한 입력값이 x보다 큰것과 작은 사분위 값을 통해 계산한다.
- 어찌보면 standard sclaer와 비슷하지만 조금 다르다.
- Normalizer
- datapoint ? 데이터의 특징이라고 보면 된다.
In [3]:
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
x_train, x_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=1)
print(x_train.shape)
print(x_test.shape)
In [4]:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(x_train)
Out[4]:
In [5]:
x_train_scaled = scaler.transform(x_train) # transform이란 데이터 변형과 관련된 말이다.
# fit_transform() 이란 함수를 사용하기도 한다.
print("변환 된 후 크기 : ", x_train_scaled.shape)
print("스케일 조정 전 특성별 최소값 : ", x_train.min(axis =0))
print("스케일 조정 전 특성별 최대값 : ", x_train.max(axis =0))
print("스케일 조정 후 특성별 최소값 : ", x_train_scaled.min(axis =0))
print("스케일 조정 후 특성별 최대값 : ", x_train_scaled.max(axis =0))
In [6]:
x_test_scaled = scaler.transform(x_test) # fit_transform()
print("스케일 조정 후 특성별 최소값 : ", x_test_scaled.min(axis =0))
print("스케일 조정 후 특성별 최대값 : ", x_test_scaled.max(axis =0))
- train : 0, -1, test : -0.xxx , -1.xxxx
-
이러한 현상이 나오는 이유는 변환되는 공식이 잘못되었기 때문이다.!!
-
(x - xmin) / (xmax-xmin) = 기본공식
- 그러나 test 형태의 최솟값을 구한게 아니라 여기서 x는 test인데 max 와 min은 훈련 데이터(train)의 weight값을 가지고 계산하다보니 잘못 된 값이 나온 것이다.
-
따라서 test는 test에 맞게 최솟값을 적용시켜야 하고, train은 train에 맞게 적용시켜야 한다.
-
교재 181p
QunatinTransformer¶
- scale 조정하는 모듈
In [7]:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import QuantileTransformer, StandardScaler, PowerTransformer
In [8]:
x, y = make_blobs(n_samples=50, centers=2, random_state=4, cluster_std=1)
print(x.shape)
In [9]:
plt.scatter(x[:,0],x[:,1],c=y, s=30, edgecolors='black')
plt.xlim(0,16)
plt.ylim(0,10)
plt.xlabel('x0')
plt.ylabel('x1')
plt.title("Original Data")
plt.show()
In [10]:
scaler = QuantileTransformer() # default 1000개
x_trans = scaler.fit_transform(x)
plt.scatter(x_trans[:,0],x_trans[:,1],c=y, s=30, edgecolors='black')
plt.xlim(0,5) # 수치(범위) 고대로 쓰면 완전 몰린다. 조정하기
plt.ylim(0,5)
plt.xlabel('x0')
plt.ylabel('x1')
plt.title("QuantileTransformer") # scaler 조정된 데이터
# plt.title(type(scaler).__name__) # 이렇게 쓸 수도 있다
plt.show()
- 이를 통해 위 데이터와 달리 해당 데이터들은 0~1사이의 값에 분포하게 된다
data가 1000개라면?¶
In [11]:
x, y = make_blobs(n_samples=1000, centers=2, random_state=4, cluster_std=1)
print(x.shape)
plt.scatter(x[:,0],x[:,1],c=y, s=30, edgecolors='black')
plt.xlim(0,16)
plt.ylim(0,10)
plt.xlabel('x0')
plt.ylabel('x1')
plt.title("Original Data")
plt.show()
In [12]:
scaler = QuantileTransformer() # default 1000개
x_trans = scaler.fit_transform(x)
plt.scatter(x_trans[:,0],x_trans[:,1],c=y, s=30, edgecolors='black')
plt.xlim(0,5) # 수치(범위) 고대로 쓰면 완전 몰린다. 조정하기
plt.ylim(0,5)
plt.xlabel('x0')
plt.ylabel('x1')
plt.title("QuantileTransformer") # scaler 조정된 데이터
# plt.title(type(scaler).__name__) # 이렇게 쓸 수도 있다
plt.show()
정규분포¶
- 균등분포 된 값을 정규분포화하는 작업
In [13]:
scaler = QuantileTransformer(output_distribution='normal') # default 1000개
x_trans = scaler.fit_transform(x)
print(x.shape)
plt.scatter(x[:,0],x[:,1],c=y, s=30, edgecolors='black')
plt.xlim(-5,5)
plt.ylim(-5,5)
plt.xlabel('x0')
plt.ylabel('x1')
plt.title(type(scaler).__name__)
plt.show()
In [14]:
###### from sklearn.datasets import make_blobs
# 인위적인 데이터셋 생성
x, _ = make_blobs(n_samples=50, centers=2, random_state=4, cluster_std=2)
x_train, x_test= train_test_split(x, random_state=1, test_size=0.1)
fig, axes = plt.subplots(1,3,figsize=(13,4))
axes[0].scatter(x_train[:,0], x_train[:,1], c=mglearn.cm2.colors[0], label="training set", s=60)
axes[0].scatter(x_test[:,0], x_test[:,1], c=mglearn.cm2.colors[1], label="test set", s=60)
axes[0].legend(loc="upper left")
axes[0].set_title("Original data")
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train_scaled = scaler.fit_transform(x_train)
x_test_scaled = scaler.fit_transform(x_test)
axes[1].scatter(x_train_scaled[:,0], x_train_scaled[:,1],
c=mglearn.cm2.colors[0], label="training set", s=60)
axes[1].scatter(x_test_scaled[:,0], x_test_scaled[:,1],marker = "^",
c=mglearn.cm2.colors[1], label="training set", s=60)
axes[1].set_title("Scaled data")
# 테스트 세트에 별도의 scaler 사용 (X)
test_scaler = MinMaxScaler()
test_scaler.fit(x_test)
x_test_scaled_badly = test_scaler.transform(x_test)
axes[2].scatter(x_train_scaled[:,0], x_train_scaled[:,1],
c=mglearn.cm2.colors[0], label="training set", s=60)
axes[2].scatter(x_test_scaled_badly[:,0], x_test_scaled_badly[:,1],
marker = '^',c=mglearn.cm2.colors[1], label="training set", s=60)
axes[2].set_title("wrong scaled data")
Out[14]:
cancer data로 해보기¶
In [15]:
print(cancer)
In [16]:
x_train, x_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
In [17]:
from sklearn.svm import SVC
svm =SVC(C=100)
svm.fit(x_train, y_train)
print("테스트 세트 정확도 : {:2f}".format(svm.score(x_test, y_test)))
In [18]:
# MINMAXSCALER -> 0,1 스케일로 조정
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train_scaled= scaler.transform(x_train)
x_test_scaled=scaler.transform(x_test)
svm.fit(x_train_scaled,y_train)
print("scaled 테스트 세트 정확도 : {:2f}".format(svm.score(x_test_scaled, y_test)))
In [19]:
# 평균 0, 분산 1을 갖도록 스케일 조정 -> (x- 평균) / 표준편차
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(x_train)
x_train_scaled= scaler.transform(x_train)
x_test_scaled=scaler.transform(x_test)
svm.fit(x_train_scaled,y_train)
print("SVM(StandardScaler) 테스트 세트 정확도 : {:5f}".format(svm.score(x_test_scaled, y_test)))
여기서 잠깐 주성분 분석(PCA)란?¶
- 회전을 통해 불필요한 데이터를 삭제하는 차원 축소 방법이다.
- 비지도 학습을 배우는 지금 사용할 예정이다.
In [20]:
import mglearn
import numpy as np
mglearn.plots.plot_pca_illustration()
plt.show()
In [21]:
# import revel
x_train, x_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=1)
fig, axes =plt.subplots(15, 2,figsize=(10,20)) # inch 기억하기!
malignant = cancer.data[cancer.target==0]
benign = cancer.data[cancer.target==1]
ax = axes.ravel() # reval은 데이터를 평평하게 만들어주는 역할을 한다
for i in range(30):
_, bins = np.histogram(cancer.data[:,i], bins=50) # numpy에서 histogram에 필요한 값을 생성한다
ax[i].hist(malignant[:,i], bins=bins, color = mglearn.cm3(0), alpha=0.5)
ax[i].hist(benign[:,i], bins=bins, color = mglearn.cm2(2), alpha=0.5)
ax[i].set_title(cancer.feature_names[i])
ax[i].set_yticks(())
ax[0].set_xlabel("Feature size")
ax[0].set_ylabel("Frequency")
ax[0].legend(['Malignacy','Benign'], loc="best")
fig.tight_layout()
In [22]:
print(cancer.data.shape)
In [23]:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(cancer.data)
x_scaled= scaler.transform(cancer.data)
In [24]:
from sklearn.decomposition import PCA
# 데이터의 처음 두개 주성분만 유지하고 나머지는 버린다,
pca = PCA(n_components=2)
pca.fit(x_scaled)
# 처음 두개의 주성분을 사용해 데이터를 변환한다.
x_pca = pca.transform(x_scaled)
print("원본 데이터 형태 : ", str(x_scaled.shape))
print("축소된 데이터 형태 : ", str(x_pca.shape))
# 차원 축소된다고 data이 달라지는 것이 아니다. 다만 속성이 2개만 남기고 지워진 것이다!
In [25]:
plt.figure(figsize=(8,8))
mglearn.discrete_scatter(x_pca[:,0],x_pca[:,1], cancer.target)
# plt.legend(["악성","양성"],loc="best")
plt.gca().set_aspect("equal")
plt.xlabel("first pca")
plt.ylabel("second pca")
plt.legend(['Malignacy','Benign'], loc="best")
Out[25]:
In [26]:
# 주성분 형태를 보고 싶다면?
print("PCA 주성분 형태 : ", pca.components_.shape)
In [27]:
pca.components_
Out[27]:
고유 얼굴 특성 추출¶
In [28]:
from sklearn.datasets import fetch_lfw_people
people= fetch_lfw_people(min_faces_per_person=20, resize=0.7, color = False)
image_shape = people.images[0].shape
In [29]:
print(image_shape)
fig, axes = plt.subplots(3, 5, figsize=(15,8),subplot_kw={"xticks" : (), 'yticks':()})
for target, image, ax in zip(people.target, people.images, axes.ravel()):
ax.imshow(image)
ax.set_title(people.target_names[target])
In [30]:
print("people.images.shape", people.images.shape)
print("클래스 개수", len(people.target_names))
In [31]:
people.target[0:10], people.target_names[people.target[0:10]]
Out[31]:
In [32]:
counts = np.bincount(people.target)
for i, (count, name) in enumerate(zip(counts, people.target_names)):
print("{0:25}{1:3}".format(name, count), end=' ')
if (i+1) % 3 ==0:
print()
In [33]:
mask = np.zeros(people.target.shape, dtype=np.bool)
for target in np.unique(people.target):
mask[np.where(people.target == target)[0][:50]] =1# 50개 까지만 가져옴
x_people = people.data[mask]
y_people = people.target[mask]
# 최대값으로 나눠서 scailing 적용하기
x_people= x_people/255.
# MinMaxScaler로 scailing 적용하기
scaler = MinMaxScaler()
scaler.fit(x_people)
x_people_scaled = scaler.transform(x_people)
- 스케일링을 0~1의 범위값을 255로 나누거나 스케일 적용하는 것은 동일하다
- MinMaxScaler도 상관없다.
- 복습
- MinMaxScaler란?
- 최대/최소값이 각각 1, 0이 되도록 스케일링하는 것이다
- MinMaxScaler란?
종류 | 설명 |
---|---|
StandardScaler | 기본 스케일. 평균과 표준편차 사용 |
MinMaxScaler | 최대/최소값이 각각 1, 0이 되도록 스케일링 |
MaxAbsScaler | 최대절대값과 0이 각각 1, 0이 되도록 스케일링 |
RobustScaler | 중앙값(median)과 IQR(interquartile range) 사용. 아웃라이어의 영향을 최소화 |
In [34]:
print(x_people)
print(x_people_scaled)
In [35]:
# 어제 했던 knn으로 데이터 훈련해보기!
from sklearn.neighbors import KNeighborsClassifier
x_train, x_test, y_train, y_test = train_test_split(
x_people, y_people, stratify = y_people, random_state=0)
knn = KNeighborsClassifier(n_neighbors = 1)
knn.fit(x_train, y_train)
print("1-최근접 이웃의 테스트 점수 : {:3f}".format(knn.score(x_test, y_test)))
- 보면 정답률이 낮다. 그러면 무엇을 해야하는가?
- 알고리즘을 바꾼다.
- parameter을 바꾼다.
- 차원축소 등을 통해 데이터를 바꾼다.
In [36]:
# 1. 차원축소를 해보자!
print("x_train.shape", x_train.shape)
pca = PCA(n_components = 100, whiten=True, random_state=0)
# whiten이란? 입력값을 비상관관계로 만드는 것
pca.fit(x_train)
x_train_pca = pca.transform(x_train)
x_test_pca = pca.transform(x_test)
print("x_train.pca.shape", x_train_pca.shape) # 차수가 100개로 줄어든 것을 확인할 수 있다.
- 차수가 5655 -> 100개로 줄어든 것을 확인할 수 있다.
In [37]:
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(x_train_pca, y_train)
print("1-최근접 이웃의 테스트 점수 : {:3f}".format(knn.score(x_test_pca, y_test)))
처음에는 0.232558이었으나 pca를 적용하였더니 0.312016로 올라갔다.
In [38]:
print("pca.components_.shape", pca.components_.shape)
- pca 적용 전후를 그림으로 출력해보자!
In [39]:
fig , axes = plt.subplots(3,5,figsize=(15,12) , subplot_kw={'xticks':(),'yticks':()})
for i, (component, ax) in enumerate(zip(pca.components_, axes.ravel())):
ax.imshow(component.reshape(image_shape),cmap='viridis')
ax.set_title('PCA {}'.format((i+1)))
In [40]:
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
image_shape = people.images[0].shape
plt.figure(figsize=(20, 3))
ax = plt.gca()
imagebox = OffsetImage(people.images[0], zoom=2, cmap="gray")
ab = AnnotationBbox(imagebox, (0.05, 0.4), pad=0.0, xycoords='data')
ax.add_artist(ab)
for i in range(4):
imagebox = OffsetImage(pca.components_[i].reshape(image_shape), zoom=2,
cmap="viridis")
ab = AnnotationBbox(imagebox, (0.285 + 0.2 * i, 0.4),
pad=0.0,xycoords='data')
ax.add_artist(ab)
if i == 0:
plt.text(0.155, .3, 'x_{} *'.format(i), fontdict={'fontsize': 30})
else:
plt.text(0.145 + .2 * i, .3, '+ x_{} *'.format(i), fontdict={'fontsize': 30})
plt.text(.95, .3, '+ ...', fontdict={'fontsize': 30})
plt.rc('text')
plt.text(.12, .3, '=', fontdict={'fontsize': 50})
plt.axis("off")
Out[40]:
In [46]:
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
iris = load_iris()
iris로 pca적용해보기¶
In [47]:
x= iris.data
y = iris.target
target_names = iris.target_names
print(x.shape)
print(y.shape)
print(target_names)
In [50]:
pca = PCA(n_components =2)
x_pca = pca.fit(x).transform(x)
print("First tow componetns : %s" % str(pca.explained_variance_ratio_))
In [54]:
plt.figure()
colors = ['navy','orange','green']
lw = 2
for color, i , target_name in zip(colors, [0,1,2], target_names):
plt.scatter(x_pca[y==i, 0], x_pca[y==i,1], alpha=.8, lw=lw, # lw는 line width라고 선의 두께를 말한다.
label = target_names[i])
plt.legend(loc='best')
plt.title("pca of iris dataset")
plt.show()
In [ ]:
In [ ]:
In [ ]:
In [55]:
import pandas as pd
bank_data = pd.read_csv("C:/Users/ka030/Documents/GitHub/ai/bank-additional/bank-additional/bank-additional.csv", delimiter=';')
bank_data.head()
Out[55]:
'개발 > sk infosec cloud ai 전문가 양성과정' 카테고리의 다른 글
[MNF 비지도학습] SK infosec 클라우드 AI전문가 양성과정 실습파일 (0) | 2020.09.11 |
---|---|
[PYTHON 머신러닝]SK infosec 클라우드 AI 전문가 양성과정 수업필기본 (0) | 2020.09.11 |
[CNN&비지도학습]SK infosec 클라우드 AI 전문가 양성과정 수업필기본 (0) | 2020.09.08 |
[pandas를 활용한 데이터분석]SK infosec 클라우드 AI 전문가 양성과정 실습과제 (0) | 2020.09.08 |
[pandas를 활용한 데이터분석]SK infosec 클라우드 AI 전문가 양성과정 수업필기본 (0) | 2020.09.08 |