로지스틱 회귀는 분류(Classification) 문제를 예측하고 평가한다. 선형회귀는 연속된 변수를 예측하지만, 로지스틱 회귀는 두 가지로 나누는 분류문제를 다룬다. 계수를 통해 각 변수의 중요성을 쉽게 파악할 수 있지만, 선형관계가 아닌 데이터에 대해서는 예측력이 떨어진다. 두 가지 범주로 나뉜 값을 예측하는 데 사용되며, 분류 문제에서 기준선(Baseline)으로 자주 활용된다.
로지스틱 회귀 실습
1. 문제 정의하기
이름, 성별, 나이, 타겟 번호 등 같은 정보가 실제로 생존에 어떻게 영향을 미치는지 확인
2. 라이브러리 및 데이터 확인
import pandas as pd
file_url = 'https://media.githubusercontent.com/media/musthave-ML10/data_source/main/titanic.csv'
data = pd.read_csv(file_url)
Pclass: 티켓 클래스
Name: 승객 이름
Sex:성별
Age:나이
SibSp: 함께 탑승한 형제 및 배우자의 수
Parch: 함께 탑승한 부모 및 자녀의 수
Ticket: 티켓번호
Embarked:승선한 항구(C=Cherbourg, Q=Queenstown, S=Southamption)
Survied:생존유무(1=생존, 0 사망)
변수 정보를 보면 889명의 엔트리가 있고, 결측치는 없다는 것을 확인가능하다.
object타입의 경우 계산이 안되므로 원핫 인코딩을 해주어야 된다. 이후에 살펴보겠다.
describe를 통해 대부분 35세 미만이며, Pclass는 3 계층이고, 대부분 혼자 탑승했다는 것을 확인할 수 있다.
변수관의 상관을 보았을 때, SibSp와 Parch는 상관관계가 다른 것에 비해 다소 높다. 따라서 향후 다중 공선성을 고려해 피처엔지니어링을 해주겠다.
3. 전처리
아까 오브젝트인 부분을 가져와보면 위와 같다. Name과 Ticket부분은 원핫인코딩으로 처리하기에는 개수가 너무 많다.
이름은 생존율에 영향을 미칠 확률이 적고, Ticket번호는 별로 상관이 없어 보이고, Pclass이기가 있기 때문에 삭제해도 무관해 보인다.
Name과 Ticket을 제거해 주고, 더미 변수로 변환해 준다.
3. 모델링 및 예측과 평가하기
from sklearn.model_selection import train_test_split
X= data.drop('Survived',axis=1)
y=data['Survived']
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2, random_state=100)
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train,y_train)
pred = model.predict(X_test)
테스트와 훈련 세트를 나누고, 모델을 훈련시켜 주고, 예측하는 함수를 만들어준다.
pd.DataFrame({'actual':y_test, 'pred':pred})
coef_는 리스트를 포함함으로 [0] 인덱스를 포함해 준다.
피처엔지니어링
상관계수가 높은 것을 피처엔지니어링하기 위해 family칼럼을 만들어준다.
그리고 모델링부터 평가까지 다시 실행해 준다.
상관계수가 높은 것을 따로 할 때보다 하나로 묶어줬을 때 모델 점수가 상승하는 것을 볼 수 있다. 이렇게 조정을 통해 모델을 더 적합하게 만들 수 있다.