본문 바로가기

멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차/ML

4/8 금

728x90

금요일! 🐱‍🏍

 

오늘은 Regression을 끝낸다~~

 

4/11 월요일은 머신러닝 필답 평가, 4/17 일요일은 수행평가 4가지 제출이 있다.

 

결측치 처리는 삭제하거나,

imputation(보간, 대체) - 평균화 기법(독립변수를 대표값으로 대체), 머신러닝 기법(종속변수가 대상. KNN)

 

KNN(K-Nearest Neighbors, K-최근접 이웃) : 

hyperparameter는 k(=1일 때 어느 정도의 성능 보장)와 거리측정 방식(주로 유클라디안 사용)

반드시 정규화를 진행해야 함. 모든 데이터에 대해 거리를 계산해야 하므로 시간이 오래 걸릴 수 있음

 

1. Logistic Regression + KNN - BMI data

import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier # 분류기
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import warnings
warnings.filterwarnings('ignore')

# Raw Data Loading
df = pd.read_csv('./data/bmi.csv', skiprows=3)

# Data Split
train_x_data, test_x_data, train_t_data, test_t_data = \
train_test_split(df[['height', 'weight']], df['label'], test_size=0.3, random_state=1, stratify=df['label'])

# 정규화
scaler = MinMaxScaler()
scaler.fit(train_x_data)
norm_train_x_data = scaler.transform(train_x_data)
norm_test_x_data = scaler.transform(test_x_data)

# Logistic Regression
model = LogisticRegression()
model.fit(norm_train_x_data, train_t_data)

acc = model.score(norm_test_x_data, test_t_data)
print('Logistic Regression의 Accuracy : {}'.format(acc)) # 0.9851666666666666

# KNN으로 구현
knn_classifier = KNeighborsClassifier(n_neighbors=3) # 동심원을 그려서 주변의 값 3개를 가져와라
knn_classifier.fit(norm_train_x_data, train_t_data)
acc = knn_classifier.score(norm_test_x_data, test_t_data)
print('KNN의 Accuracy : {}'.format(acc)) # 0.9985

 

2. Linear Regression + KNN by Tensorflow 2.x - Ozone data

- 1. 독립변수(solar.R, wind, temp)의 결측치는 중위값으로 대체

- 2. 독립변수의 이상치를 평균으로 대체

- 3. 종속변수의 이상치를 평균으로 대체

- 4. 정규화 진행

- 5. 종속변수에 대한 결측치는 KNN을 이용해 imputation(보간)

import numpy as np
import pandas as pd
from scipy import stats
from sklearn.neighbors import KNeighborsRegressor # 연속적인 숫자값을 예측
from sklearn.preprocessing import MinMaxScaler
import warnings
warnings.filterwarnings('ignore')

# Raw Data Loading
df = pd.read_csv('./data/ozone.csv')

x_data = df[['Solar.R', 'Wind', 'Temp']] # 2차원 DataFrame
t_data = df['Ozone']

# 1. 독립변수에 대한 결측치를 찾아서 중위값으로 보간(대체)
for col in x_data.columns:
    col_median = np.nanmedian(x_data[col])
    x_data[col].loc[x_data[col].isnull()] = col_median
    
# 2. 독립변수의 이상치를 찾아 이상치를 제외한 나머지 값들의 평균으로 이상치를 대체
zscore_threshold = 2.0

for col in x_data.columns:
    outlier = x_data[col][np.abs(stats.zscore(x_data[col])) > zscore_threshold]
    col_mean = np.mean(x_data.loc[~x_data[col].isin(outlier),col])
    x_data.loc[x_data[col].isin(outlier), col] = col_mean
    
# 3. 종속변수의 이상치를 찾아 이상치를 제외한 나머지 값들의 평균으로 이상치를 대체
outlier = t_data[np.abs(stats.zscore(t_data)) > zscore_threshold]
col_mean = np.mean(~t_data.isin(outlier))
t_data[t_data.isin(outlier)] = col_mean

# 4. 정규화 진행
scaler_x = MinMaxScaler()
scaler_t = MinMaxScaler()

scaler_x.fit(x_data.values) # scaler는 2차원 ndarray로 사용해야 함
scaler_t.fit(t_data.values.reshape(-1,1))

norm_x_data = scaler_x.transform(x_data.values)
norm_t_data = scaler_t.transform(t_data.values.reshape(-1,1)).ravel()

# 5. 종속변수에 대한 결측치는 KNN을 이용해 impotation(보간)
# 종속변수가 결측치가 아닌 독립&종속변수들을 추출(KNN 학습을 위해)
norm_train_x_data = norm_x_data[~np.isnan(norm_t_data)]
norm_train_t_data = norm_t_data[~np.isnan(norm_t_data)]

# Model 생성
knn_regressor = KNeighborsRegressor(n_neighbors=2)
knn_regressor.fit(norm_train_x_data, norm_train_t_data)

# 종속변수가 결측치인 독립변수들을 입력으로 넣어서 값을 예측
knn_predict = knn_regressor.predict(norm_x_data[np.isnan(norm_t_data)])
norm_t_data[np.isnan(norm_t_data)] = knn_predict
# 최종 데이터는 norm_x_data, norm_t_data
# Sklearn과 Tensorflow 2.x로 구현해보자

from sklearn.linear_model import LinearRegression
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD

test_data = np.array([[330, 15, 80]]) # 태양광, 바람, 온도

# Sklearn 구현
model = LinearRegression()
model.fit(norm_x_data, norm_t_data)
result = model.predict(scaler_x.transform(test_data))
print('sklearn 예측값 : {}'.format(scaler_t.inverse_transform(result.reshape(-1,1)))) # 36.93077619

# Tensorflow 2.x 구현
keras_model = Sequential()

keras_model.add(Flatten(input_shape=(3,))) # input layer. 독립변수 3개 튜플로 입력
keras_model.add(Dense(units=1, activation='linear')) # output layer. class와 logistic의 개수는 1

keras_model.compile(optimizer=SGD(learning_rate=1e-2),
                    loss='mse')

keras_model.fit(norm_x_data, norm_t_data, epochs=5000, verbose=0)

result = keras_model.predict(scaler_x.transform(test_data))
print('Tensorflow 예측값 : {}'.format(scaler_t.inverse_transform(result.reshape(-1,1)))) # 36.760612

 

3. Logistic Regression(Binary Classification) by Sklearn / Tensorflow 2.x - Titanic

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

# 이상치는 실제 데이터이기 때문에 처리하지 않고 결측치만 처리할 예정

# Raw Data Loading
df = pd.read_csv('./data/titanic/train.csv')

df = df.drop(['PassengerId', 'Name', 'Ticket', 'Fare', 'Cabin'], axis=1, inplace=False)

df['Family'] = df['SibSp'] + df['Parch']
df = df.drop(['SibSp', 'Parch'], axis=1, inplace=False)

# 결측치 처리
df['Embarked'] = df['Embarked'].fillna('Q')
df['Age'] = df['Age'].fillna(df['Age'].mean())

# 문자로 되어 있는 값을 숫자로 변경
gender_string = {'male': 0, 'female': 1}
df['Sex'] = df['Sex'].map(gender_string)

embarked_string = {'S': 0, 'C': 1, 'Q': 2}
df['Embarked'] = df['Embarked'].map(embarked_string)

def age_category(age): # 
    if ((age >= 0) & (age < 25)):
        return 0
    elif ((age >= 25) & (age < 50)):
        return 1
    else:
        return 2
    
df['Age'] = df['Age'].map(age_category)

df.head()

# Data Split
train_x_data, test_x_data, train_t_data, test_t_data = \
train_test_split(df.drop('Survived', axis=1, inplace=False), df['Survived'], test_size=0.3, random_state=1, stratify=df['Survived'])

# 정규화
scaler = MinMaxScaler()
scaler.fit(train_x_data)

norm_train_x_data = scaler.transform(train_x_data)
norm_test_x_data = scaler.transform(test_x_data)

# Sklearn 구현
model = LogisticRegression()
model.fit(norm_train_x_data, train_t_data)
sklearn_result = model.score(norm_test_x_data, test_t_data)
print('Sklearn 정확도 : {}'.format(sklearn_result)) # 0.7873134328358209

# Tensorflow 2.x 구현
keras_model = Sequential()

keras_model.add(Flatten(input_shape=(5,))) # input layer
keras_model.add(Dense(units=1, activation='sigmoid')) # output layer

keras_model.compile(optimizer=SGD(learning_rate=1e-2),
                    loss='binary_crossentropy',
                    metrics=['accuracy'])

keras_model.fit(norm_train_x_data, train_t_data, epochs=1000, verbose=0)

keras_result = keras_model.evaluate(norm_test_x_data, test_t_data)
print('Tensorflow 정확도 : {}'.format(keras_result)) # 0.7910447716712952

 

1. 3/15 화 2. 3/16 수 3. 3/17 목 4. 3/18 금 5. 3/21 월
ML
환경 설정

(아나콘다, 주피터 노트북),
Pandas,

Numpy,
ndarray
ML
Numpy,

행렬곱연산,
전치행렬,
iterator,
axis,
Pandas,
Series,
DataFrame
ML
Pandas,

DataFrame,
함수들
ML
Pandas,

데이터 분석,
데이터 전처리
ML
Pandas,

데이터 전처리,
수행평가
6. 3/22 화 7. 3/23 수 8. 3/24 목 9. 3/25 금 10. 3/28 월
ML
데이터 시각화,

Matplotlib,
기술통계
ML
기술통계
ML
기술통계,

머신러닝
ML
미분,

Regression
ML
머신러닝 기법들,
Regression
11. 3/29 화 12. 3/30 수 13. 3/31 목 14. 4/1 금 15. 4/4 월
ML
Regression 구현

(Python, Scikit-Learn)
ML
Outlier,

Z-score,
MinMaxScaler,
다변수
 ML
Tensorflow,

Classification
ML
Binary Classification,
Logistic Regression
ML
평가지표(Metrics)
16. 4/5 화 17. 4/6 수 18. 4/7 목 19. 4/8 금 20. 4/11 월
ML
평가 시 주의사항

(Over-fitting,
Regularization,
Over-Sampling)
ML
Multinomial Classification,

SGD Classifier,
Softmax,
batch
ML
Multinomial Classification

Tensorflow 2.0
Keras
ML
KNN


Deep Learning

* 다음주에는 딥러닝 공부가 시작되니, 머신러닝 개념을 주말 동안 정리하자!

728x90

'멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차 > ML' 카테고리의 다른 글

4/7 목  (0) 2022.04.07
4/6 수  (0) 2022.04.06
4/5 화  (0) 2022.04.05
4/4 월  (0) 2022.04.05
4/1 금  (0) 2022.04.01