로지스틱회귀(logistic regression)
- Parameter C를 조정해 과대적합 혹은 과소적합 문제를 해결
- C(cost function) 값이 크면( 높은 코스트) -> 훈련을 더 복잡하게 -> 약한 규제
- C 값이 작으면 (낮은 코스트) -> 훈련을 덜 복잡하게 -> 강한 규제
- 종속변수가 범주형인 경우에 적용하는 회귀분석 모형
- 새로운 설명변수의 값이 주어질 때 반응변수가 각 범주에 속할 확률이 얼마인지 추정하여 추정확률을 기준치에 따라 분류하는 목적으로 사용될 수도 있음. 이때, 모형의 적합을 통해 추정된 확률을 사후 확률이라고 부름
log(p/1-p) = ax - b ( p : 성공확률, 1-p : 실패확률)
- iris 데이터 이용
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import datasets
# 1 데이터 불러오기
iris_dataset = datasets.load_iris()
# 2 데이터 분할 - 이항 분류
X = iris_dataset.data[50:,:]
y = iris_dataset.target[50:]
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 58)
# 3 모델링
logreg = LogisticRegression().fit(X_train, y_train)
logreg
# 4 결과 비교 C = 1.0
print("훈련 세트 점수 : {:.3f}".format(logreg.score(X_train,y_train)))
print("테스트 세트 점수 : {:.3f}".format(logreg.score(X_test,y_test)))
# 결과 : 훈련 세트 점수 : 0.986 테스트 세트 점수 : 0.933
# 5 parameter tuning
logreg001 = LogisticRegression(C=0.01).fit(X_train, y_train)
logreg100 = LogisticRegression(C=100).fit(X_train, y_train)
# 비용 적으면 훈련 약하게 -> 찍어 눌러서 0에 가깝게 만들어라 -> 강한 규제
# 비용 높으면 훈련 강하게 -> 0에 가깝게 만들지 말고 알아서 해라 ->약한 규제
# 5.1 C = 0.1 결과 비교 -> 낮은 코스트 -> 훈련 덜 복잡 -> 강한 규제 -> 과소적합
print("훈련 세트 점수 : {:.3f}".format(logreg001.score(X_train, y_train)))
print("테스트 세트 점수 : {:.3f}".format(logreg001.score(X_test, y_test)))
# 결과 : 훈련 세트 점수 : 0.529 테스트 세트 점수 : 0.500
# 5.2 C = 100 결과 비교 -> 높은 코스트 -> 훈련 더 복잡 -> 약한 규제 -> 과대적합
print("훈련 세트 점수 : {:.3f}".format(logreg100.score(X_train, y_train)))
print("테스트 세트 점수 : {:.3f}".format(logreg100.score(X_test, y_test)))
# 결과 : 훈련 세트 점수 : 0.986 테스트 세트 점수 : 0.933
# 6. 그래프
plt.plot(logreg.coef_.T, "o", label = "C = 1")
plt.plot(logreg001.coef_.T, "^", label = "C = 0.01")
plt.plot(logreg100.coef_.T, "v", label = "C = 100")
plt.xticks(range(iris_dataset.data.shape[1]), iris_dataset.feature_names, rotation=90)
plt.hlines(0,0,iris_dataset.data.shape[1])
plt.xlabel("feature")
plt.ylabel("coefficient")
plt.ylim(-10,10)
plt.legend()
- 그래프 결과가 0에 가까울 수록 규제가 강함 -> C값이 작을 수록 훈련 덜 복잡해서 강한 규제 (C = 0.01)
- 강한 규제는 피쳐(특징) 수를 줄이는 것
- 이후 예측값과 원래 값을 확인하기 위해
result = [logreg.predict(X_test), y_test]
# 7 적합 결과(예측 결과) 보기
logreg_result = pd.DataFrame(result).T
logreg_result.columns = ["prediction", "observation"]
logreg_result['assessment'] = logreg_result['prediction'] == logreg_result['observation']
logreg_result.head()
- 예측한 결과가 boolean 값으로 assessment 칼럼에 추가 된 것을 확인 할 수 있습니다.
'머신러닝 in Python' 카테고리의 다른 글
[Python] Cross-validation(교차검증) (1) | 2019.08.30 |
---|---|
[Python] 분류분석 - SVM(Support Vector Machine) (1) | 2019.08.29 |
[Python] LinearRegression(수치예측) - Lasso (0) | 2019.08.28 |
[Python] LinearRegression(수치예측) - Ridge (0) | 2019.08.28 |
[Python] LinearRegression(수치예측) (0) | 2019.08.28 |