기존의 인공지능 컴퓨터 비전 Tensorflow 1화를 참고하시고 오시면 좋습니다.
다중 선형 회기 Multiple Linear Regression
기존 모델 훈련에는 Temp, Ozone만 사용하였다.
이전엔, Temp, Wind, Solar.R, Ozone 데이터를 사용한다.
대부분 큰 틀은 앞의 1화 동일하다. 독립변수의 수가 변경되어 input의 데이터가 달라진다. 변경 내용은 코드상에서 bold, italic 으로 표시 하였다.
# 온도에 따른 Ozone량 예측
# 데이터 전처리
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.preprocessing import MinMaxScaler
from scipy import stats
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.optimizers import SGD
df = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/opencv_tensorflow/dataset/ozone.csv')
display(df)
# 데이터 전처리
# 1. 결측치 삭제
# 2. 이상치 삭제
# 3. 정규화(MinMaxScaling)
training_data = df[['Temp', 'Wind', 'Solar.R', 'Ozone']]
# 결측치 삭제
training_data = training_data.dropna(how='any')
display(training_data)
# 이상치 삭제
zscore_threshold = 1.8
outliers = training_data['Ozone'][(np.abs(stats.zscore(training_data['Ozone'])) > zscore_threshold)]
print(outliers)
training_data = training_data.loc[~training_data['Ozone'].isin(outliers)]
print(training_data)
# 정규화
x_data = training_data[['Temp', 'Wind', 'Solar.R']].values
t_data = training_data['Ozone'].values.reshape(-1, 1)
scaler_x = MinMaxScaler()
scaler_t = MinMaxScaler()
scaler_x.fit(x_data)
scaler_t.fit(t_data)
x_data_norm = scaler_x.transform(x_data)
t_data_norm = scaler_t.transform(t_data)
# sklearn으로 예측
sklearn_model = linear_model.LinearRegression()
sklearn_model.fit(x_data, t_data)
# 예측시 ['Temp', Wind', 'Solar.R'] 입력 필요
sklearn_predict = sklearn_model.predict([[80.0, 15.2, 120.0]])
print(sklearn_predict)
# 30.0244
keras_model = Sequential()
keras_model.add(Flatten(input_shape=(3,)))
output_layer = Dense(units=1, activation='linear')
keras_model.add(output_layer)
keras_model.compile(optimizer=SGD(learning_rate=1e-2),
loss='mse')
keras_model.fit(x_data_norm,
t_data_norm,
epochs=2000,
verbose=0)
predict_data = np.array([[80.0, 15.2, 120.0]])
predict_data_norm = scaler_x.transform(predict_data)
result_norm = keras_model.predict(predict_data_norm)
result = scaler_t.inverse_transform(result_norm)
print(result)
# 29.091
Multiple Linear Regression
- 종속변수가 연속적인 숫자값
- 분류 모델로 바꾸려면??
- 예) Email spam 분류 (spam 인가? 아닌가?) 0, 1
- 엑스레이에 종양이 있는지 여부 0, 1
- 도난된 신용카드 인지 판별 (fraud detection) 0, 1
- 둘중 하나로 분류하는 모델은 binary classification 으로 부른다.
- 여러개의 분류중 하나로 분류하는 모델은 multinomial classification
- Logistic Regression 을 사용하여 분류를 할 수 있다.
import numpy as np
from sklearn import linear_model
import mglearn # 데이터셋을 가져오기 위해 사용하는 모듈
import matplotlib.pyplot as plt
# training data set
x, y = mglearn.datasets.make_forge()
print(x) # (26 x 2)
print(y) # (26 x 1) y의 데이터는 0,1로 구성되어 있다.
# x 데이터 2개의 컬럼으로 y 좌표의 그림을 그려보자
mglearn.discrete_scatter(x[:,0], x[:,1], y)
model = linear_model.LinearRegression()
model.fit(x[:,0].reshape(-1,1),
x[:,1].reshape(-1,1))
plt.plot(x[:,0], x[:,0] * model.coef_.ravel() + model.intercept_)
plt.show()
위의 x데이터의 2개의 컬럼으로만 linear regresion으로 선을 그려보면 0,1 의 구분되는 선을 볼 수 있다. 다음 포스트에서 자세한 내용은 계속된다.