[PYTHON - 머신러닝_KNN알고리즘]★value_counts()★고윳값 판단★결측치★스케일링
1. 고윳값 판단
data['class'].unique() # 목표 변수의 고윳값 출력 ==> 0과 1로 이루어진 이진변수가 아닌 3개이상으로 이루어진 범주형 변수
==> array([0,1,2])
data['class'].nunique() # 고윳값의 갯수 ==> 와인을 3개의 등급으로 나눈다.
==> 3
data['class'].value_counts() # 각 고윳값에 해당하는 개수 출력
fig = plt.figure(figsize = (15,8))
ax = sns.countplot(data['class'])
ax = sns.barplot(x = data['class'].value_counts().index , y=data['class'].value_counts())
==> barplot, countplot 둘다 동일한 결과값 얻을 수 있다.
2. 결측치 제거
data.dropna(subset = ['alcohol'])
==> 지정된 변수의 결측치 행만 제거하기 ==> alcohol의 열의 결측치 존재하는 행 제거
data.drop(['alcohol' , 'nonflavanoid_phenols'] , axis = 1) #변수를 제거하기
==> 아예 열 제거
data.fillna(data.mean()) #평균적으로 결측치 채우기
==> 결측치에 대해 해당 열의 평균으로 대체
1. 일반적으로 dropna()를 사용하여 결측치 행 채우기
2. 통상적으로 결측치가 데이터의 50%이상이면 drop()을 고려해볼 만하고, 70~80%이 상이면 drop()을 적용하는 것이 좋다. ==> 결측치가 너무 많으면 삭제하는 것이 좋다.
3. 결측치의 경우 평균을 채워넣는다 하더라도 노이즈 발생 가능성 ==> 중위값 사용도 가능
data.fillna(data.median() , inplace=True) #평균적으로 결측치 채우기
3. 스케일링
==> 스케일링은 데이터의 스케일(scale)을 맞추는 작업
KNN 알고리즘의 경우 거리기반 알고리즘
==> alcohol 열의 최솟값 : 11.03, 최대값 : 14.75
==> magnesium(최솟값 : 70 , 최대값 : 162)에서의 1은 완전 다른 영향을 미친다.
==> 왜곡된 예측 가능
from sklearn.preprocessing import StandardScaler, MinMaxScaler , RobustScaler
#한 라이브러리에서 여러 모듈 임포트
==> 사이킷런 라이브러리의 preprocessing 모듈 사용
4. 표준화 스케일링
==> 평균이 0이 되고, 표준편차가 1이 되도록 데이터를 고르게 분포시키는데 사용
==> 데이터에 아웃라이어가 존재할 때 아웃라이어의 영향을 받는다. 평균 0, 분산 1이 되게끔 분포시키기 때문에, 데이터의 기존 분포 형태가 사라지고 정규분포를 따르는 결과물을 가져온다.
st_scaler = StandardScaler() #스케일러 지정
st_scaler.fit(data) # 학습, 스케일링에 필요한 정보(평균 , 표준편차)가 학습된다.
st_scaled = st_scaler.transform(data) #학습에서 얻은 정보 계산
st_scaled
pd.DataFrame(st_scaled , columns = data.columns)
https://knowallworld.tistory.com/254
==> fit() 함수로 학습을 시켜주는 과정에서 각 컬럼의 평균과 표준편차가 st_scaler에 기억되고, transform()을 적용하면 그 값들을 이용하여 위의 수식으로 연산
round(st_scaled.describe(), 2)
5. 로버스트 스케일링
==> 데이터에 아웃라이어가 존재하고, 그 영향력을 그대로 유지하고 싶을 때 사용
rb_scaler = RobustScaler() #로버스트 스케일링에 사용할 객체를 생성
rb_scaled = rb_scaler.fit_transform(data) #로버스트 스케일링 ==> fit과 transform이 합쳐졌다.
rb_scaled = pd.DataFrame(rb_scaled , columns = data.columns)
round(rb_scaled.describe(), 2)
==> 평균과 표준편차 대신 사분위값을 이용하여 계산한다.
==> 데이터에 아웃라이어가 존재할 때, 아웃라이어의 영향을 받지 않는다. 변환된 데이터의 범위는 표준화 스케일링이나 최소-최대 스케일링보다 넓게 나타난다.
6. Min-Max 스케일링
==> 데이터 분포의 특성을 최대한 그대로 유지하고 싶을 때 사용
mm_scaler = MinMaxScaler() #최소-최대 스케일링 객체 생성
mm_scaled = mm_scaler.fit_transform(data) # 최소-최대 스케일링
mm_scaled = pd.DataFrame(mm_scaled , columns= data.columns)
round(mm_scaled.describe() , 2)
==> 최소-최대 스케일링의 특징은 모든 컬럼에서 최댓값이 1 , 최솟값이 0인 형태로 변환된다는 것이다.
==> 각 값에서 최솟값을 빼주고, 최대값의 차이만큼 나눠준다.
==> 표준화 스케일링과 마찬가지로 아웃라이어의 영향을 받게 된다. 위의 두 스케일러와 비교했을 때 데이터의 기존 분포를 가장 있는 그대로 담아내며, 스케일만 변화시킨다. 데이터의 범위는 0~ 1이다.
7. 정규화 스케일링
==> 행 기준의 스케일링이 필요할 때 사용, 거의 사용X
8. 스케일링 적용
round(mm_scaled.describe() , 2)
#%%
from sklearn.model_selection import train_test_split
X_train , X_test, y_train , y_test = train_test_split(data.drop('class' , axis= 1) , data['class'] , test_size=0.2, random_state=100) #학습셋과 시험셋 분리
==> 데이터 셋 분할
==> test_size (시험 셋) ==> 20% , random_state = 100 ==> 랜덤 샘플링
==> 랜덤 샘플링이란 데이터를 특정 비율로 나눌 때 마구잡이로 뒤섞어서 나누는 것
https://knowallworld.tistory.com/371
1> 하이퍼 파라미터 튜닝하기
knn = KNeighborsClassifier() #KNN 모델 생성
knn.fit(X_train_scaled , y_train) #학습
pred = knn.predict(X_test_scaled) #예측
pred
from sklearn.metrics import accuracy_score
accuracy_score(y_test , pred)
==> y_test와 예측값인 pred가 얼마나 일치하는지 알아보기 위하여 accuracy_score 사용
score = []
for i in range(1, 21):
knn = KNeighborsClassifier(n_neighbors= i) # knn 모델 생성
knn.fit(X_train_scaled , y_train)
pred = knn.predict(X_test_scaled)
score.append(accuracy_score(y_test, pred))
score
==> 최적의 가중 매개변수 선택하기
9. K-최근접 이웃
==> KNN 알고리즘은 새로운 데이터를 예측할 때 , 거리를 기반으로 하여 인접한 데이터와 같은 종류로 분류
출처 : 데싸노트의 실전에서 통하는 머신러닝
(Golden Rabbit , 저자 : 권시현)
※혼자 공부용