24.02.02 TIL

예진·2024년 2월 2일
0

TIL

목록 보기
31/68

간만에 만족스럽게 열심히 했다.
강의를 잘 하시는 건지 휴식 버프인지 모르겠지만,
수월하게 이해하면서 M/L 기초 강의, 과제 3번 끝냈다.
과거의 나에게 압도적 감사.. 통계부터 머신러닝까지 ADsP가 하드 캐리 중...
앞으로도 과거의 나에게 고마워 하려면 지금 열심히 하는 게 맞다.


선형회귀 심화

선형회귀의 가정

  • 선형성 : 종속 변수(Y)와 독립 변수(X) 간에 선형 관계가 존재해야 함
  • 등분산성 : 오차가 특정 패턴을 보여서는 안 되며, 독립 변수의 값에 상관없이 일정해야 함
  • 정규성 : 오차 항은 정규 분포를 따라야 함
  • 독립성 : X변수는 서로 독립적이어야 함
  • 다중공선성의 문제 주의

선형 회귀 정리

  • 장점
    • 직관적이며 이해하기 쉽다. X-Y관계를 정량화 할 수 있음.
    • 모델이 빠르게 학습(가중치 계산이 빠르다)
  • 단점
    • X-Y간의 선형성 가정이 필요.
    • 평가지표가 평균(mean)포함 하기에 이상치에 민감.
    • 범주형 변수를 인코딩시 정보 손실이 일어남.
  • Python 패키지
    • sklearn.linear_model.LinearRegression

로지스틱 회귀 이론

범주형 Y에서 선형함수의 한계

회귀는 숫자를 예측하므로 범위에 대한 개념이 없음.

= 범주형 변수는 선형회귀가 맞지 않다.

1 이상이면 1에 수렴, 0 미만이면 0에 수렴하도록 Y 값 수정

로짓의 개념의 등장

오즈비(Odds ratio) : 승산비, 실패확률 대비 성공 확률

오즈비(odds ratio)=P1P오즈비(odds\ ratio) = \frac{P}{1-P} P: 확률 값

Log : 해당 값을 낮춰주는 역할, 천천히 증가하도록 제동

Logit (Log + odds ratio)

  • 로짓의 그래프가 더 선형적인 그림을 나타내어 선형회귀의 기본식을 활용할 수 있게 됨

  • 로지스틱”회귀”라고 불리는 이유가 이것

    Logit=log(P1P)Logit = \log(\frac{P}{1-P}). P=11+eLogitP = \frac{1}{1+e^{-Logit}} $$

Logit의 장점 : 어떤 값을 가져오더라도 반드시 특정 사건이 일어날 확률(Y값이 특정 값일 확률)이 0과 1안으로 들어오게 하는 특징

= 분류하기에 용이

오즈비(승산비)에 log를 붙여 logit으로 만든 후, 해당 값을 Y축으로 놓고 우변에 기존의 회귀식을 붙임 → “로지스틱 회귀”

  • 로지스틱 함수는 가중치 값을 안다면 X값이 주어졌을 때 해당 사건이 일어날 수 있는 P의 확률을 계산할 수 있게 된다.

정확도와 F1 - Score

  • 표기법
    • 실제와 예측이 같으면 True / 다르면 False
    • 예측을 양성으로 했으면 Positive / 음성으로 했으면 Negative
  1. 정밀도(Precision): 모델이 양성 1로 예측한 결과 중 실제 양성의 비율(모델의 관점)

    정밀도(precision)=TPTP+FP정밀도(precision) = \frac{TP}{TP+FP}

  2. 재현율(Recall): 실제 값이 양성인 데이터 중 모델이 양성으로 예측한 비율(데이터의 관점)

    재현율(Recall)=TPTP+FN재현율(Recall) = \frac{TP}{TP+FN}

  3. f1-Score: 정밀도와 재현율의 조화 평균

     f1score=2정밀도재현율정밀도+재현율f1-score = 2*\frac{정밀도*재현율}{정밀도+재현율}

  4. 정확도(Accuracy)

    정확도(Accuracy)=TP+TNTP+TN+FP+FN정확도(Accuracy) = \frac{TP+TN}{TP+TN+FP+FN}

로지스틱회귀 정리

  • 장점: 역시 직관적이며 이해하기 쉽다.
  • 단점: 복잡한 비선형 관계를 모델링 하기 어려울 수 있음
  • 로지스틱 회귀 실습(타이타닉)
    import pandas as pd
    
    titanic_df = pd.read_csv('/Users/yejin/Documents/ML 실습/train-2.csv')
    
    titanic_df.head(3)
    
    pd.pivot_table(titanic_df, index = 'Sex', columns = 'Survived', aggfunc='size')
    
    len(titanic_df)
    
    - 정확도(Accuracy) : 맞춘 갯수 / 전체 데이터
    - 생존율 확인
      - 여성은 다 살았을 것이고, 남성은 모두 죽었을 것이다.
    
    (233+468)/891*100
    import seaborn as sns
    sns.countplot(titanic_df, x = 'Sex', hue = 'Survived')
    
    titanic_df.head(3)
    
    - 숫자
        - Age, SibSp, Parch, Fare,
    - 범주형
        - Pclass, Sex, Cabin, Embarked
    - X변수 1, Y변수(Survived)
    
    #info() : 데이터에 대한 결측치, 데이터 전체 갯수 등
    titanic_df.info()
    
    x_1 = titanic_df[['Fare']]
    y_true = titanic_df[['Survived']]
    
    sns.scatterplot(titanic_df, x = 'Fare', y = 'Survived')
    
    #데이터 기술 통계 보는 법(수치형) : describe()
    titanic_df.describe()
    
    from sklearn.linear_model import LogisticRegression
    
    model_lor = LogisticRegression()
    model_lor.fit(x_1, y_true)
    
    def get_att(x):
        #x모델을 넣기
        print('클래스 종류', x.classes_)
        print('독립변수 갯수', x.n_features_in_)
        print('들어간 독립변수(x)의 이름', x.feature_names_in_)
        print('가중치', x.coef_)
        print('바이어스', x.intercept_)
    
    get_att(model_lor)
    
    from sklearn.metrics import accuracy_score, f1_score
    def get_metrics(true, pred):
        print('정확도', accuracy_score(true, pred))
        print('f1-score', f1_score(true, pred))
    
    y_pred_1 = model_lor.predict(x_1)
    y_pred_1[:10]
    len(y_pred_1)
    
    get_metrics(y_true, y_pred_1)
  • 다중 로지스틱 회귀 실습(타이타닉)
    titanic_df.info()
    
    #Y(Survived) : 사망
    #X(수치형) : Fare
    #X(범주형) : Pclass(좌석등급), Sex
    
    def get_sex(x):
        if x == 'female':
            return 0
        else:
            return 1
    titanic_df['Sex_en'] = titanic_df['Sex'].apply(get_sex)
    titanic_df.head(3)
    
    x_2 = titanic_df[['Pclass', 'Sex_en', 'Fare']]
    y_true = titanic_df[['Survived']]
    model_lor_2 = LogisticRegression()
    model_lor_2.fit(x_2, y_true)
    
    get_att(model_lor_2)
    
    y_pred_2 = model_lor_2.predict(x_2)
    y_pred_2[:10]
    
    #x변수 : Fare
    get_metrics(y_true, y_pred_1)
    #x변수 : Fare, Pclass, Sex
    get_metrics(y_true, y_pred_2)
    
    #각 데이터별 y=1인 확률 뽑아내기(생존할 확률)
    model_lor_2.predict_proba(x_2)

남은 주말엔 계획대로 M/L심화 1주차 완강하고 과제 제출할 예정.
Github 사용법 좀 알아봐야겠다.
과제도 그렇고 미리 써두면 좋을 것 같은데,,,
노션에 강의 내용이랑 코드까지 다 쓰려니 이제 어디에 뭐가 있는지 못찾겠음,,

profile
Data Analysis / 맨 땅에 헤딩

0개의 댓글