논리 회귀 분석으로 타이타닉 호의 생존자를 예측하다

입문


캐글비 대 (타이타닉 생존자 예측) 논리 회귀 분석을 통해 진행한다.
또한 목표 변수의 결과(사망 또는 생존)에 대한 영향도(회귀계수)를 확인한다.
이번 소스 파일은 여기
대상을 대상으로 프로그램을 쓰는 연습도 겸한다.소스가 더러운 것을 용서해 주세요.

환경

  • Windows 10 Pro
  • Python 3.6.8 (anaconda)
  • scikit-learn 0.21.1
  • 데이터 다운로드


    제목 페이지 데이터를 다운로드합니다.
    ※ 사용자 로그인이 필요합니다.

    데이터 확인 및 사전 처리


    학습용, 테스트용 데이터를 확인하고 결손값을 보완하고 편차값, 성별 등 분류 카드 변수(정적 데이터)를 대체하여 One-Hot-Encoding을 통해 수치화(벡터화)한다.

    변수 설명


    변수 이름
    설명
    값 설명
    비고
    PassengerID
    승객 ID
    버튼
    Survived
    생존 표지
    0 = 사망, 1 = 생존
    대상 변수
    Pclass
    티켓 클래스
    1 = 상층, 2 = 중층, 3 = 하층
    Name
    성함
    설명 변수에서 제외
    Sex
    성별
    남성
    Age
    나이.
    SibSp
    동승한 형제나 배우자의 수
    0, 1, 2, 3, 4, 5, 8
    Parch
    동승한 부모와 아이의 수
    0, 1, 2, 3, 4, 5, 6, 9
    값 9 테스트 데이터만 표시
    Ticket
    티켓 번호
    설명 변수에서 제외
    Fare
    비용
    Cabin
    객실 번호
    설명 변수에서 제외
    Embarked
    타이타닉 호를 탄 항구
    C=Cherbourg, Q=Queenstown, S=Southampton

    데이터 확인 (기본 통계량)


    학습용 데이터와 테스트용 데이터의 수치 데이터의 기본 통계량을 확인한다.
    데이터 확인을 위한 소스 파일은 여기
    学習用データの基本統計量
             Survived      Pclass         Age       SibSp       Parch        Fare
    count  891.000000  891.000000  891.000000  891.000000  891.000000  891.000000
    mean     0.383838    2.308642   29.361582    0.523008    0.381594   32.204208
    std      0.486592    0.836071   13.019697    1.102743    0.806057   49.693429
    min      0.000000    1.000000    0.420000    0.000000    0.000000    0.000000
    25%      0.000000    2.000000   22.000000    0.000000    0.000000    7.910400
    50%      0.000000    3.000000   28.000000    0.000000    0.000000   14.454200
    75%      1.000000    3.000000   35.000000    1.000000    0.000000   31.000000
    max      1.000000    3.000000   80.000000    8.000000    6.000000  512.329200 
    
    テスト用データの基本統計量
           PassengerId      Pclass         Age       SibSp       Parch        Fare
    count   418.000000  418.000000  418.000000  418.000000  418.000000  418.000000
    mean   1100.500000    2.265550   29.599282    0.447368    0.392344   35.576535
    std     120.810458    0.841838   12.703770    0.896760    0.981429   55.850103
    min     892.000000    1.000000    0.170000    0.000000    0.000000    0.000000
    25%     996.250000    1.000000   23.000000    0.000000    0.000000    7.895800
    50%    1100.500000    3.000000   27.000000    0.000000    0.000000   14.454200
    75%    1204.750000    3.000000   35.750000    1.000000    0.000000   31.471875
    max    1309.000000    3.000000   76.000000    8.000000    9.000000  512.329200 
    

    부족한 값을 메우다


    누락된 값이 있는 Age Cabin Embarked Fare를 보완합니다.
    크기를 나타내는 숫자(Age Fare)는 중간 값과 일치하고 카테고리 변수(Cabin Embarked)는 가장 빈번한 값과 일치합니다.
    df['Age'] = df['Age'].fillna(df['Age'].median())    ## 中央値
    df['Cabin'] = df['Cabin'].fillna(df['Cabin'].mode())    ## 最頻値
    df['Embarked'] = df['Embarked'].fillna(df['Embarked'].mode())    ## 最頻値
    df['Fare'] = df['Fare'].fillna(df['Fare'].median())    ## 中央値
    

    오프셋 값 대체


    Parch 값 9은 테스트용 데이터에만 표시되므로 학습용 데이터의 최대 값 6으로 대체됩니다.
    (각각 학습용 데이터와 테스트용 데이터에 대해 One-Hot-Encoding을 진행하면 학습용과 테스트용 변수의 수가 다르기 때문에 테스트용 데이터를 예측하는 데 오류가 발생함)
    df['Parch'] = np.where(df['Parch']==9, 6, df['Parch'])
    

    One-Hot-Encoding


    범주 변수(Sex·Pclass·SibSp·Parch·Embarked)에 대한 수치(벡터화)를 지정합니다.
    df_dummies = pd.get_dummies(df, columns=['Sex', 'Pclass', 'SibSp', 'Parch', 'Embarked'])
    

    표준화 데이터


    연속값의 Age Fare를 표준화(평균 0 • 방차 1)하고 새 열(Age_scale • Fare_scale)에 저장합니다.
    scaler = StandardScaler()
    df_dummies['Age_scale'] = scaler.fit_transform(df_dummies.loc[:, ['Age']])
    df_dummies['Fare_scale'] = scaler.fit_transform(df_dummies.loc[:, ['Fare']])
    

    논리 회귀 예측 모델


    학습용 데이터를 훈련용과 검증용으로 나누고 훈련용 데이터로 예측 모델을 만든다.

    예측 모델 생성하기


    정규화 매개 변수 C는 기본값 1.0이고, 가장 좋은 매개 변수 검색 방법인 solver는 기본값 liblinear입니다.
    c = 1.0 ## 正則化のパラメータ(デフォルト 1.0)
    
    ## ロジスティック回帰のモデル
    self.clf = linear_model.LogisticRegression(C=c, solver='liblinear', random_state=0)
    
    ## 予測モデルを作成
    titanic.model(X_train, y_train)
    

    예측 모델 정밀도


    예측 검증용 데이터의 정확도(Accuracy)는 0.82로 매우 정확하다.
    Accuracy =(TP + TN)/(TP + FP + FN + TN)
         = (97+ 49)/(97 + 20 + 13 + 49)
         = 0.82
    混同行列(検証用データ)
    [[97 13]
     [20 49]] 
    
    分類レポート(検証用データ)
                  precision    recall  f1-score   support
    
              死亡       0.83      0.88      0.85       110
              生存       0.79      0.71      0.75        69
    
        accuracy                           0.82       179
       macro avg       0.81      0.80      0.80       179
    weighted avg       0.81      0.82      0.81       179
    

    설명 변수의 영향도 확인(회귀 계수)


    각 설명 변수가 예측 모델 목표 변수 결과(사망 또는 생존)에 미치는 영향 정도(회귀 계수)를 확인한다.
    회귀 계수는 정영향 목표 변수 1(생존), 음영향 목표 변수 0(사망)이다.
    그 밖에 회귀 계수의 절대치가 클수록 영향이 크다.

    예측 구현


    예측 모델에서 테스트용 데이터를 예측하고 kaggle 경기에 투고한다.

    카글에 대한 투고 결과


    Kaggle의 점수는 0.76076으로 9066위(2019년 7월 26일 13:23JST 현재)에 올랐다.

    정밀도를 한층 높이기 위해


    Kaggle 경기의 석차는 미묘한 석차(나쁜 석차)로 좋은 석차를 얻기 위해서는 더욱 정밀도를 높여야 한다.
    이를 위해 다음과 같은 내용을 고려한다.
  • 전체 학습 데이터에서 훈련 예측 모델
  • 정규화 매개변수 C 조정
  • 연속값 Age·Fare 병합 처리
  • 이번에 사용되지 않은 변수를 이용(Ticket Cabin)
  • 보충하여 기록하다


    전체 학습용 데이터에서 예측 모델을 훈련할 때(기타 조건은 변하지 않음)
    Kaggle의 점수는 0.77033으로 6759위(2019년 7월 26일 13:40JST 현재)에 올랐다.

    좋은 웹페이지 즐겨찾기