Python(Colab) 로지스틱 회귀(Logistic Regression)

2023. 6. 14. 17:29파이썬/머신러닝 및 딥러닝

✔ 로지스틱 회귀

- 둘 중 하나를 결정하는 문제 (이진 분류)를 풀기 위한 대표적인 알고리즘
- 3개 이상 클래스에 대한 판별을 하는 경우 OvR 를 사용

데이터로 실습

 

1. 기초 설정

 

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
 
hr_df = pd.read_csv('/content/drive/MyDrive/KDT-1/머신러닝과 딥러닝/hr (1).csv')
 

 

 

✔ 설명

* employee_id: 직원 고유번호
* department : 부서
* region : 지사
* education : 학위
* gender : 성별
* recruitment_channel : 채용 방법
* no_of_trainings : 트레이닝 받은 횟수
* age : 나이
* previous_year_rating : 이전연도 고과 점수
* length_of_service : 근속연수
* awards_won : 수상이력
* avg_training_score: 평균 고과 점수
* is_promoted : 승진여부

목표: 승진여부와 연관있는 데이터 컬럼은 무엇일까?

 

2.데이터 후보 찾기

후보1) 전년도 고과점수

sns.barplot(x='previous_year_rating',y='is_promoted', data=hr_df)
 

 

후보2) 평균 트레이닝 점수

sns.lineplot(x='avg_training_score',y='is_promoted', data=hr_df)
 

 

후보3) 입사 방식

sns.barplot(x='recruitment_channel',y='is_promoted', data=hr_df)
 
# referred에 오차율이 커서 개수로 확인해 보기
hr_df['recruitment_channel'].value_counts()

 

 

후보4) 성별 

sns.barplot(x='gender',y='is_promoted', data=hr_df)
 

 

후보5) 부서별

plt.figure(figsize=(14, 10))
plt.xticks(rotation=45)
sns.barplot(x='region',y='is_promoted', data=hr_df)
 

 

후보6) 학위별

hr_df['education'].value_counts()
sns.barplot(x='education',y='is_promoted',data=hr_df)

 

 

3.결측치 확인 및 처리

hr_df=hr_df.dropna()
 
hr_df.info()
 
 

 

🔴4. object 객체 원 핫 인코딩전에 분류 개수 보기

 

for i in ['department','region','education','gender','recruitment_channel']:
    print(i, hr_df[i].nunique())
 

 

5. 원 핫 인코딩 

 

hr_df = pd.get_dummies(hr_df,columns=['department','region','education','gender','recruitment_channel'])
 
 

 

6. 학습데이터 검증데이터 나누기

 

from sklearn.model_selection import train_test_split
 
X_train, X_test, y_train, y_test = train_test_split(hr_df.drop('is_promoted',axis=1),hr_df['is_promoted'],test_size=0.2,random_state=10)

 

 

7. 로지스틱 회귀 학습 시키기

 

from sklearn.linear_model import LogisticRegression
 
from sklearn.metrics import accuracy_score,confusion_matrix
 
lr = LogisticRegression()
 
lr.fit(X_train,y_train)
 
pred = lr.predict(X_test)

 

 

결과 검증

 

 

1. accuracy_score

 

accuracy_score(y_test,pred)
 

2.confusion_matrix(혼돈행렬)

* 정밀도와 재현율(민감도)를 활용 하는 평가용 지수

@ 정밀도: Precision
* 공식: TP / (TP+FP)

* 무조건 양성으로 판단해서 계산하는 방법
* 실제 1인 것중에 얼마만큼 제대로 맞췄는가 ?

@ 재현율(recall)
* 공식: TP / TP+FN

* 정확하게 감지한 양성샘플의 비율
* 1이라 예측한 것 중에서 얼마만큼 제대로 맞췄는가? 를 수치화
* 민감도 혹은 TPR(True Positive Rate)

@f1 score
* 정밀도와 재현율의 조화평균을 나타내는 지표

 

confusion_matrix(y_test,pred)
 

 

sns.heatmap(confusion_matrix(y_test,pred),annot=True,cmap='Blues')
 
 

 

 

정밀도, 재현율, f1스코어 사용해보기

 

from sklearn.metrics import precision_score, recall_score,f1_score
 
# 정밀도  ( 1 / 1 + 0 )
precision_score(y_test,pred)

 

# 재현율 ( 1 / 1 + FN)

recall_score(y_test,pred)

 

# F1 스코어 

f1_score(y_test,pred)
 

 

✔ .coef_ 메소드
- 학습이 되고 난 후  y= ax+b  즉 기울기인 a 값을 알려주는 메소드

✔ intercept_ 메소드
- 학습이 되고 난 후 y=ax+b 즉 b 절편을 알려주는 메소드  

 

독립변수 2개 종속변수 1개

예시2)  

✔ predict 와 predict_proba 의 차이점

- predict는 각각 모델의 최종적인 예측값을 출력 
예시)
회귀) 0.9873.... 
분류: [0,1,2,1...] 

- predict_proba는 분류 모델이 각각 클래스에 대한 확률을 일일이 출력해준다.
예시)
predict = [0,1,1,1...]

                                          0 확률 1 확률
predict_proba= array([[0.901231,0.09151]
                                    [0.2000151,0,791215])

 

기초설정

TempX = hr_df[['age','length_of_service']] # 독립변수 2개
Tempy = hr_df['is_promoted'] # 종속변수 1개 

학습시키기

temp_lr.fit(TempX,Tempy)

검증 데이터 생성 및 검증

 

temp_df = pd.DataFrame({'age':[20,27,30],'length_of_service':[1,3,6]})
 
pred = temp_lr.predict(temp_df)
pred
0,0,0 = 즉 승진하지 못할 것으로 예측

 


 

✔교차검증 사용하기

✔ 교차 검증

사용 이유: train_test_split로 발생하는 데이터의 섞임에 다라 성능이 달라니는 문제를 해결하기 위한 기술

- k겹(K-fold) 교차 검증을 가장 많아 시용


방식 

 

 

기초 설정

 

from sklearn.model_selection import KFold
 
kf = KFold(n_splits=5)

✔하이퍼 파라미터(n_split()) : 몇 개로 데이터를 분리 할 것인지 

 

 

 

검증 데이터 확인해보기

인덱스는 섞이지 않음

 

for train_index,test_index in kf.split(range(len(hr_df))):
    print(train_index,test_index)
    print('---------------------')
    print(len(train_index),len(test_index))
 

 

하이퍼 파라미터 설정 (n_split , random_state, shuffle)

 

#데이터 섞기 및 고정
kf = KFold(n_splits=5,random_state=10,shuffle=True)
 
for train_index,test_index in kf.split(range(len(hr_df))):
    print(train_index,test_index)
    print('---------------------')
    print(len(train_index),len(test_index))
 

 

 

교차 검증 하기

acc_list = []

for train_index,test_index in kf.split(range(len(hr_df))):  # 2가지를 return하기때문에
    X=hr_df.drop('is_promoted', axis =1)
    y=hr_df['is_promoted']

    X_train = X.iloc[train_index]
    X_test = X.iloc[test_index]
    y_train = y.iloc[train_index]
    y_test = y.iloc[test_index]

    lr = LogisticRegression()
    lr.fit(X_train,y_train)
    pred= lr.predict(X_test)
    acc_list.append(accuracy_score(y_test,pred))
 
 
acc_list
728x90