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 = (6, 5)) # 표준화 : (값 요소 - 각 열의 평균) / 표준편차 # 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 = 10, 3 x = 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(0, 101, 2)) """이상치를 포함한 데이터를 일반 표준화 방식으로 했을때 표준화 했을때""" ## 1차원 데이터 = > (100, ) 를 ( 100, 1 ) 로 바꿔준다. 데이터 타입을 벡터가 아닌 매트릭스 형태로 즉, 데이터 프레임 처럼 바꿔야 한다. print(np.shape(x)) # 여기에서의 -1은 니가 알아서 계산해, 머신러닝에서의 -1 => None x = 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(-2, 2, 0.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(-3, 3, 0.2)) """# 정규화 ( Mean - Max Scaler ) 표준화 => 표준 정규분포를 따르는 종모양으로 만들어주는 과정 -> 0~1 사이를 벗어나는 경우가 있다. 정규화 ( nomalization ) => 정말 딱 0 ~ 1 사이에 값이 오도록 맞춰주는 과정. ###정규화 : ( 각 열의 요소값 - 각 열의 최소값 ) /(각 열의 최대값 - 각 열의 최소값 ) 요소가 각 열의 최대값에 가까울 수록 1 최소값에 가까울 수록 0이 나온다. """ from sklearn.preprocessing import MinMaxScaler x = np.array([[9, -9, 2], [5, 0, 1], [1, 10, 4], [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, -3, 2], [7, -1, 0], [0, 9, 5]] ) # 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 |