Open eungjukim opened 5 years ago
로지스틱 회귀분석 코드입니다.
#logistic regression
satisfaction = pd.read_csv("satisfaction.csv")
satisfaction = satisfaction.drop(["review_score"],1)
satisfaction = satisfaction.dropna()
satisfaction
# logistic regression
cols = satisfaction.columns[1:17] # cols : 독립변수
logit = sm.Logit(satisfaction['satisfaction'], satisfaction[cols]) # satisfaction : 종속변수
# fit the model
result = logit.fit()
print(result.summary()) # 분석결과 출력
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import train_test_split
#데이터 분할
X_train, X_test, y_train, y_test = train_test_split(satisfaction[cols],
satisfaction['satisfaction'], test_size=0.3, random_state=0)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
print('Accuracy of logistic regression classifier on test set: {:.2f}'.
format(logreg.score(X_test, y_test)))
#혼동행렬 생성
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print(confusion_matrix)
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve
logit_roc_auc = roc_auc_score(y_test, logreg.predict(X_test))
fpr, tpr, thresholds = roc_curve(y_test, logreg.predict_proba(X_test)[:,1])
plt.figure()
plt.plot(fpr, tpr, label='Logistic Regression (area = %0.2f)' % logit_roc_auc)
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic')
plt.legend(loc="lower right")
plt.savefig('Log_ROC')
plt.show()
로지스틱 회귀분석 결과 화면입니다.
C:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning. FutureWarning) Accuracy of logistic regression classifier on test set: 0.87 [[13971 2843] [ 1561 16041]] precision recall f1-score support
0 0.90 0.83 0.86 16814
1 0.85 0.91 0.88 17602
micro avg 0.87 0.87 0.87 34416 macro avg 0.87 0.87 0.87 34416 weighted avg 0.87 0.87 0.87 34416
로지스틱 회귀분석 모델의 성능(f1 score)이 0.86 정도로 이전의 다중회귀분석 모델의 성능보다 훨씬 좋아졌습니다.
이전의 모델에서 실수가 있었습니다. 모델의 독립변수 중 product_height_cm 항목의 p-value가 0.5 이상으로 유의미하지 않았습니다. 그래서 이를 제외하고 다시 모델을 생성했습니다. 아래는 코드입니다.
#logistic regression
satisfaction = pd.read_csv("satisfaction.csv")
satisfaction = satisfaction.drop(["review_score"],1)
satisfaction = satisfaction.drop(["product_height_cm"],1)
satisfaction = satisfaction.dropna()
satisfaction
# logistic regression
cols = satisfaction.columns[1:16] # train_cols는 설명 변수
logit = sm.Logit(satisfaction['satisfaction'], satisfaction[cols]) # Survived는 목적 변수
# fit the model
result = logit.fit()
print(result.summary()) # 분석결과 출력
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(satisfaction[cols], satisfaction['satisfaction'],
test_size=0.3, random_state=0)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
print('Accuracy of logistic regression classifier on test set: {:.2f}'.
format(logreg.score(X_test, y_test)))
from sklearn.metrics import confusion_matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print(confusion_matrix)
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve
logit_roc_auc = roc_auc_score(y_test, logreg.predict(X_test))
fpr, tpr, thresholds = roc_curve(y_test, logreg.predict_proba(X_test)[:,1])
plt.figure()
plt.plot(fpr, tpr, label='Logistic Regression (area = %0.2f)' % logit_roc_auc)
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic')
plt.legend(loc="lower right")
plt.savefig('Log_ROC')
plt.show()
로지스틱 회귀분석 결과 화면입니다. Accuracy of logistic regression classifier on test set: 0.87 precision recall f1-score support
0 0.91 0.83 0.87 16814
1 0.85 0.92 0.88 17602
micro avg 0.87 0.87 0.87 34416 macro avg 0.88 0.87 0.87 34416 weighted avg 0.88 0.87 0.87 34416
유의미하지 않았던 변수를 제거하니 모델의 설명력도 약간 증가하였네요. 혹시라도 제가 실수한 부분이 존재할 수도 있으니, @yooninna @pyj5485 @qkswkrje @euro95 조원 분들은 발견하시면 알려주세요!
k-fold 교차검증 코드 및 결과 화면입니다.
#k-fold 교차검증
from sklearn.model_selection import cross_val_score
scores = cross_val_score(logreg, satisfaction, satisfaction['satisfaction'], cv=10)
print("교차 검증 점수: {}".format(scores))
print("교차 검증 평균 점수: {:.2f}".format(scores.mean()))
회귀분석 결과 결정계수의 값이 0.32로 유의미한 결과가 나왔으나, 여전히 부족한 수치라고 생각했습니다. 그래서 더 좋은 분석을 할 수는 없을까 생각하다가, 회귀분석이 아니라 로지스틱 회귀분석을 시도해보면 어떨까 하는 생각이 들었습니다. 로지스틱 회귀분석은 회귀분석과는 다르게 종속변수의 값이 0 또는 1이어야 합니다. 그래서 고객의 평점을 4점을 기준으로 그 이상이면 만족(1), 그 미만이면 불만족(0)으로 변환하여 로지스틱 회귀분석을 진행하고자 합니다.