Written on
·
292
0
이제 머신러닝에 푹 빠져있는 직장인입니다. 좀 어처구니 없는 질문일것 같지만 질문드립니다.!
3장을 공부하는데 강사님께선 피마 인디언 당뇨병 예측을 LogisticRegression을 통해서 학습을 진행했는데 비슷한 모델이라고 생각되는 LinearRegression을 통해서 똑같이 예측을 진행해 봤습니다.
우선, Regression이 어떻게 학습을 진행하는지는 정확히 모르지만 결과 추이를 선(?)으로 가장 오류가 적은 w와 b를 찾는다고 알고 있습니다.
LogisticRegression으로 예측이 되었으니 LinearRegression도 동일하게 할 수 있다고 생각을 했습니다.
lr = LinearRegression()
lr.fit(X_train, y_train)
pred = lr.predict(X_test)
pred = pred.reshape(-1, 1)
custom_pred =Binarizer(threshold=0.5).fit_transform(pred).astype('int')
pred_proba = lr.pred_proba(X_test)
get_eval_clf(y_test, custom_pred, pred_proba)
이런 코드로 테스트를 해봤는데 2가지의 오류가 있었습니다. 하나는 LinearRegression은 pred_proba 함수가 없었고
이걸 무시하고 pred라도 수치를 보려고 했는데
1, 0이 아니라 무슨 확률같은 값이 나왔습니다. 그래서 threshold를 0.5로 두어서 Binarizer를 통해 1, 0으로 만들어서 함수에 넣어봤더니 Input contains NaN, infinity or a value too large for dtype('float64'). 이런 에러나 나와서 astype을 통해서 int로 변경해도 같은 에러가 나오네요
예측 ndarray는 int type인거 같은데 type(custom_pred.item(0)) 이렇게 확인해 봤습니다.
엉뚱한 질문 같지만 답변 기다리겠습니다 !ㅠㅠ
그리고 강의 너무 잘 보고있습니다. 감사드립니다.
Answer 2
0
0
안녕하십니까,
뛰어난 직관력을 가지고 계시는 군요. 맞습니다. 회귀는 Classification에도 적용 가능합니다.
일반적으로 Classification은 이산값을 예측합니다만, 내부적으로는 특정 클래스가 될 확률값을 연속값으로 추출한 뒤 이것을 threshold에 기반하여 이산값으로 만듭니다. 다만 선형회귀와 같은 선형함수는 이러한 확률값을 잘 근사하기가 어려워서 classification에 적용하지 않습니다만 Logistic Regression은 Sigmoid함수가 확률값을 잘 근사하기 때문에 Classification에 사용됩니다.
get_clf_eval( )함수는 roc auc 를 구하기 위해서 테스트 데이터 각각의 predict 된 확률값을 필요로 합니다. 결국은 이 확률값은 Regression의 예측 값이므로 pred_proba를 구할 필요없이 regression 예측 값을 그대로 입력하면 됩니다.
아래는 말씀해주신 사항대로 제가 Linear Regression으로 만든 코드입니다. 생각보다 성능이 좋아서 저도 깜짝 놀랐습니다.( 단 0, 1 사이의 값이 될 수 있는 Classification에서만 사용하셔야 합니다. )
감사합니다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score
from sklearn.metrics import f1_score, confusion_matrix, precision_recall_curve, roc_curve
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import Binarizer
from sklearn.linear_model import LinearRegression, Ridge, Lasso
diabetes_data = pd.read_csv('diabetes.csv')
X = diabetes_data.iloc[:, :-1]
y = diabetes_data.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 156, stratify=y)
reg = LinearRegression()
reg.fit(X_train , y_train)
pred = reg.predict(X_test)
pred_n = pred.reshape(-1, 1)
custom_pred =Binarizer(threshold=0.5).fit_transform(pred_n).astype('int')
get_clf_eval(y_test, custom_pred, pred)