Skip to content

인공지능 컴퓨터 비전 Tensorflow 2화 – 다중선형회기 multiple linear regression

computer vision AI

기존의 인공지능 컴퓨터 비전 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 의 구분되는 선을 볼 수 있다. 다음 포스트에서 자세한 내용은 계속된다.

error: Content is protected !!