1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# -*- coding: utf-8 -*-
"""Day 03_02_Scaler.ipynb
Automatically generated by Colaboratory.
Original file is located at
#기 술 통 계
### 중심 경향치, 중앙에 얼마나 모여 있느냐, 를 설명하는 변수들, 중앙값, 최빈수 ,평균,
중앙값: 평균은 아웃라이어의 영향을 많이 받으니까 , 이를 보완하기 위한 피쳐,
Median
중심 경향치 : 정규 분포, 선형변환 , 표준 정규 분포 , 
정규 분포 : 종모양 , 모집단,  표본,  정규분포에도 여러 형태가 있다, 
왼쪽 편향, 오른쪽 편향 , 등 여러 형태기 떄문에 다양한 정규분포간의 비교를 위해서
표준화 한다.
ex) 키 - 몸무게 , 단위가 다르기 때문에 rescaling 과정이 필요하다.
정규분포 - > 선형변환 -> 원래의 데이터를 더하기 , 곱하기등의 스케일링 하는 과정.
-> 정규분포 + 선형변환 => 표준 정규분포 : 데이터 그래프의 분포가 달라지지 않는다.
=> zScore : 각각의 데이터에서 평균을 뺴고 표준편차로 나눠주는것. => 선형 변환
표준 편차 -> 모든 변수들이 평균으로 부터 평균적으로 떨어진 정도.
x - x의 평균 = > 평균으로 부터의 거리 / 표준편차 
유의 수준 : 랜덤하게 뽑는 수가 어느 정도 의미가 있는가.
표준화 : 서로 단위가 상이한 변수들 간의 연산이 가능하도록 단위를 맞춰주는것.
"""
 
from numpy import *
import scipy
 
# 0 ~ 20 전까지 랜덤인수 발생.
data = np.random.randint(20, size = (65))
 
# 표준화 : (값 요소 - 각 열의 평균) / 표준편차
#     z = ( x - mean() ) / std()
 
 
# print(data)
 
# 열 단위의 평균 ( 행 방향으로 )
# print(mean(data, axis = 0 ))
 
# 행 단위의 평균
# print(mean(data, axis = 1 ))
 
 
## 분자 부분. 분모의 경우에는 전체 std가 아닌 그 열에 대한 표준편차로 나눠야 한다...!
 
std_data = ( data - mean(data, axis = 0 )) /  std(data, axis = 0)
 
"""## 표준화 ( numpy )"""
 
## 전체 평균
mean(data)
 
## 정규화된 열의 경우 평균은 0 , 표준편차는 1이 나와야 한다.
mean(std_data, axis = 0 )
 
std(std_data , axis = 0 )
 
"""## 표준화 ( Scipy )"""
 
import scipy.stats as ss
 
res = ss.zscore(data)
 
from sklearn.preprocessing import StandardScaler, RobustScaler
 
StandardScaler().fit_transform(data)
std_data
 
"""## 이상치가 없다는 가정 하에서 진행이 되는 변환
## 정규화를 한다 => 이상치를 무조건 배제해야 한다.
이상치가 있다고 무조건 그 레코드를 지워버리면 그 레코드에 포함되어있는 중요한 정보가 같이 날아 갈 수가 있으므로 이상치 제거에는 신중해야 한다.
즉 특정 경우에는 이상치를 지울 수 없는 경우가 있다.
### 이상치 , 특이값이 포합되어있는 데이터의 표준화
### 평균, 표준편차는 이상치의 영향을 크게 받는다 ( 민감하다 )
### 중앙값은 IQR = ( Q3 - Q1 )  => Q1 : 25%  , Q3 : 75% 지점,  Q2 :  중앙값, 중위수
### 표준편차 대신에 IQR을 사용하기도 한다 = > ( 평균 대신에? ) 
### => (  x - median()  )  /  IQR 
=>>>  Robust(둔감한) scaler
"""
 
## 랜덤 인수가 똑같이 나온다
## 랜덤 인수를 제어하고자 할때 사용.
np.random.seed(73)
 
# 평균 10 표준편차 3
mu, sigma = 103  
= mu + sigma * np.random.randn(100)
 
import matplotlib.pyplot as plt
 
## pycharm에서는 plt.show를 해야 나온다.
plt.hist(x)
mean(x)
std(x)
 
## 아웃 라이어 삽입.
x[95:100= 100
 
x
mean(x)
std(x)
 
"""이상치가 있는 데이터에 대해서 조사하고 적절한 정규화 방식을 채택"""
 
## 히스토그램으로는 조사가 어렵다 , bins옵션으로 구간을 몇개로 할것인지 나눌수 있다 0 부터 101까지 2칸씩(막대바의 폭 2)
plt.hist(x , bins = np.arange(01012))
 
"""이상치를 포함한 데이터를 일반 표준화 방식으로 했을때 표준화 했을때"""
 
## 1차원 데이터 = > (100, ) 를  ( 100, 1 ) 로 바꿔준다. 데이터 타입을 벡터가 아닌 매트릭스 형태로 즉, 데이터 프레임 처럼 바꿔야 한다.
 
print(np.shape(x))
 
 
# 여기에서의 -1은 니가 알아서 계산해,  머신러닝에서의 -1 => None
= x.reshape( -1 , 1 )
x.shape
 
std_x = StandardScaler().fit_transform(x)
 
## 표준 정규분포를 따르는 분포로 만들기는 했으나 이상치를 포함해서 만든 결과이다.
std_x.mean(axis = 0)
std_x.std(axis = 0)
 
plt.hist(std_x)
 
## 이상치 제거
std_o = std_x[ std_x < 4 ]
 
# -2 부터 2까지 0.3 마다 막대 하나씩
plt.hist(std_o, bins = np.arange(-220.1))
 
"""## 이상치를 포함하는 데이터를 정규화 시키는 방법."""
 
mean(x) # 14
median(x) # 10
 
## 100분위수에서 몇분위의 수를 얻을건지 지정 25 -> Q1
Q1 = percentile(x, 25#q1 : 8.43
Q3 = percentile(x, 75#q3 : 12.53
 
IQR = Q3 - Q1
 
rob_x = RobustScaler().fit_transform(x)
 
## 각 데이터에서 중위수를 뺀 후 IQR로 나누니까 중위수가 0 이 된다.
median(rob_x)  # 0.0
 
mean(rob_x)
 
std(rob_x)
 
plt.hist(rob_x)
 
rob_o = rob_x[rob_x < 5]
 
plt.hist(rob_o, bins = np.arange(-330.2))
 
"""# 정규화  ( Mean - Max Scaler )
표준화 => 표준 정규분포를 따르는 종모양으로 만들어주는 과정 -> 0~1 사이를 벗어나는 경우가 있다.
정규화 ( nomalization ) => 정말 딱 0 ~ 1 사이에 값이 오도록 맞춰주는 과정.
###정규화 : ( 각 열의 요소값 - 각 열의 최소값 )  /(각 열의 최대값 - 각 열의 최소값 )
요소가 각 열의 최대값에 가까울 수록 1 최소값에 가까울 수록 0이 나온다.
"""
 
from sklearn.preprocessing import MinMaxScaler
 
= np.array([[9-92],
              [5,  01],
              [1104],
              [4,  7,-2] ])
 
# 열단위의 최소값 최댓값 구하기.
 
x.min(axis = 0)  # -9
x.max(axis = 0)
 
## 수식 적용
(x - x.min(axis = 0)) / (x.max(axis = 0- x.min(axis = 0))
 
# 사이킷런 사용 - 객체 사용
x_minmax = MinMaxScaler().fit_transform(x)
 
# 함수 사용
from sklearn.preprocessing import minmax_scale
minmax_scale(x, axis = 0)
 
"""##이항 변수화 변화 ( 타이타닉 )
모든 데이터를 0 아니면 1 로 만드는 변환
연속형 변수 값 -> 사이킷런에 바이너라이저 객체 사용.
"""
 
from sklearn.preprocessing import Binarizer
 
np.array( [[5-32],
           [7-10],
           [0,  95]] )
 
# 0을 기준( Threshold ) 기본값 = 0
bnr = Binarizer().fit(x)
 
# 3을 기준( Threshold ) 기본값 = 3 3을 포함해서 0으로 만든다.
bnr = Binarizer(3).fit(x)
 
bnr.transform(x)
 
 
cs


'딥러닝 모델 설계 > Machine Learning' 카테고리의 다른 글

Day 4. Data Reconstruction  (0) 2019.07.06
Day 4. binomializing [ OneHotEncoding ]  (0) 2019.07.06
Day 03. Replacement  (0) 2019.07.03
Day 02. Pandas Review - 2  (0) 2019.07.02
Day 02. Pandas Review - 1  (0) 2019.07.02

+ Recent posts