Python/빅데이터 분석과 머신러닝

#10 머신러닝

sundori 2024. 7. 30. 21:03

목차

     

    상관분석

    두 개의 연속형 변수 사이 상관관계가 존재하는지를 파악하고, 상관관계의 정도를 확인하는 것이 상관분석(Correlation Analysis)이다.

    상관분석에서는 관련성을 파악하는 지표로 상관계수(Correlation coeficient)라는 통계학 관점의 선형적 상관도를 확인하여 관련성을 파악한다.

     

    상관분석 단계

    1. 산점도(Scatter)로 두 변수 파악
    2.상관계수 확인

    3.의사결정

     

    관계 상관계수
    음의 상관 -> -1.0 ~ -0.7이면, 강한 음의 상관관계
    -> -0.7 ~ -0.3이면, 뚜렷한 음의 상관관계
    -> -0.3 ~ -0.1이면, 약한 음의 상관관계
    무상관 -> -0.1 ~ + 0.1이면, 없다고 할 수 있는 상관관계
    양의 상관 -> +0.1 ~ +0.3이면, 약한 양의 상관관계
    -> +0.3 ~ +0.7이면, 뚜렷한 양의 상관관계
    -> +0.7 ~ +1.0이면, 강한 양의 상관관계
    분석 시 주의 사항
    1. 연속형(숫자로 표현 가능한)데이터에 대해서만 상관관계 분석이 가능.
    2. -1부터 1까지의 값으로 상관관계의 크기를 나타낸다.
    3. 증가하는 방향성에 대한 것이지 인과관계를 의미하지는 않는다.
    4. 상관계수는 인과관계를 의미하는 것이 아니라 단지 연관성을 의미한다.
    5.연속형 변수 X와 Y의 상관 정도만 표기한다.(Y=X)

    두 연속형 변수 산점도 그리기

    상관계수 확인

    히트맵으로 상관도 시각화

    히트맵 그리기

    회귀분석

    앞서 했던 상관분석은 두 연속형 변수 X(과학), Y(수학)의 상관 정도만 알 수 있었고 인과관계는 알 수 없었다. 

    회귀분석에서는 두 연속형 변수 X와 Y를 독립변수와 종족변수라고 하는 인과관계로 설명하는데 "과학 점수가 좋으면 수학 점수가 좋을가?"와 같이 간단하지만 미래를 예측할 수 있는 머신러닝의 초기 모델이 되는 것이다.

    X Y
    독립변수, 설명변수, 원인변수 종족변수, 반응변수, 결과 변수, 머신러닝(클래스, 라벨)
    다른 변수에 영향을 주게되는 원인 다른 변수에 의해서 영향을 받는 결과
    Dependent Variable, Response Independent Variable, Predictor, Factor

     

    회귀분석은 머신러닝의 기본인데 그러한 이유는 회귀분석 학습 방법이 머신러닝 학습 방법 중 '지도 학습' 문제에 사용할 수있는 알고리즘이기 때문이다. 예측 문제란 기존 데이터를 기반으로 생성된 모델(회귀식 또는 회귀 모델 등)을 이용하여 새로운 데이터가 들어왔을 때 어떤 값이 될지 예상하는 문제를 말한다. 예를들어 공부 시간을 늘리면 성적이 잘 나올 것이다.처럼 이를 회귀 분석으로 보면 어떤 요인의 수치에 따라서 특정 요인의 수치가 영향을 받고 있다고 말할 수 있다.

     

    수학적으로 보면 입력 변수에 따라 특정 변수의 값이 영향을 받는다라고 하며 변수에서 입력하는 변수를 X, 변수 X에 의해서 값이 종속적으로 정해지는 변수를 Y라고하면 기본 회귀식:Y=X와 같다.

     

    회귀식은 종속변수가 연속형, 범주형에 따라서 선형회귀분석과 로지스틱 회귀분석으로 구분된다.

    선형회귀분석(Linear Regression Analysis)

    선형회귀분석은 쌍으로 관찰된 연속형 변수들 사이의 관계에 있어서 한 변수를 원인으로 보고 다른 변수들을 결과로 보는 분석이다.

    즉, 독립 변수와 종속 변수 사이의 선형식을 구하고 그 식을 이용하여 변수 값들이 주어졌을 때 종속변수의 변수 값을 예측하는 방법이다.

     

    단순선형회귀분석(Simple Linear Regression Analysis)

    단순선형회귀분석은 주어진 데이터를 대표하는 하나의 직선을 찾는 것이 목표인데, 이 직선을 회귀선이라고 부루며, 이 선을 함수로 표현한 것을 회귀식이라고 한다.

    x 변수와 y변수 간의 관계를 y = ax + b와 같은 하나의 선형 관계식으로 표현하고 이때 y = ax + b인 회귀식에서 독립변수 x가 하나인 것이기에 단순선형회귀분석이라고 부룬다.

     

    그러면 수집한 데이터를 대표하는 하나의 직선을 찾아야하는데 '대표한다'는 기준이 무엇이냐에 따라 회귀선도 달라진다.

    선형회귀분석은 최소제곱섭 또는 최고자승법으로 회귀선을 찾는다.

    최소제곱법을 이용한 예측 모델

    최소제곱법을 사용할려면 '잔차'를 알아야하는데 잔차란 실젯값 y와 예측값 y간 차이를 말한다.

    위 사진을 보면 초록색 점은 실젯값이고 파란색 점과 선은 예측값이며 빨간색 선은 잔차를 나타낸다.

    선형회귀 모형 - 1.상관분석

    선형회귀 모형 - 2.변수정의(종속=독립)

    import seaborn as sns
    import matplotlib.pyplot as plt
    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import r2_score, mean_squared_error
    import numpy as np
    
    # 데이터 불러오기
    file_path = '11장데이터/exam_sample_cor.csv'
    data = pd.read_csv(file_path)
    
    # 상관 분석
    correlation_matrix = data[['science', 'english', 'math']].corr()
    
    # 상관 관계 시각화: 산점도 행렬(pairplot) 사용
    sns.pairplot(data[['science', 'english', 'math']])
    plt.suptitle('Pairplot of Science, English, and Math Scores', y=1.02)
    plt.show()
    
    # 독립 변수와 종속 변수 정의
    X = data[['english', 'math']]
    y = data['science']
    
    # 선형 회귀 모델 생성 및 적합
    model = LinearRegression()
    model.fit(X, y)
    
    # 회귀 계수와 절편 추출
    coefficients = model.coef_
    intercept = model.intercept_
    
    # 회귀 방정식 출력
    coefficients, intercept
    
    # 예측값 계산
    y_pred = model.predict(X)
    
    # 모델 평가: R² 값과 RMSE 계산
    r2 = r2_score(y, y_pred)
    rmse = np.sqrt(mean_squared_error(y, y_pred))
    
    r2, rmse

    모델 요약 및 해석

    R-squared (R제곱)

    • : 0.965
    • 설명: R-squared는 모델의 설명력을 나타내는 지표로, 모델이 종속 변수의 변동성을 얼마나 잘 설명하는지를 보여준다. R-squared 값이 0.965라는 것은 회귀 모델이 수학 점수의 변동성 중 96.5%를 설명한다는 의미이다. R-squared 값은 0에서 1 사이의 값을 가지며, 0은 모델의 설명력이 전혀 없는 상태, 1은 모델이 데이터를 완벽하게 설명하는 상태를 의미한다.

    Adjusted R-squared (조정된 R제곱)

    • : 0.960
    • 설명: Adjusted R-squared는 R-squared의 단점을 보완한 지표로, 모델에 사용된 변수의 개수를 고려하여 설명력을 조정한 값이다. 변수의 수가 많아질수록 R-squared 값이 높아질 수 있으므로, Adjusted R-squared는 이를 보정하여 모델의 실제 설명력을 나타낸다. 여기서 Adjusted R-squared 값이 0.960이므로, 조정된 설명력도 여전히 매우 높다.

    F-statistic (F-통계량) 및 Prob (F-statistic) (p-값)

    • F-통계량 값: 218.5
    • Prob (F-통계량): 4.32e-07
    • 설명: F-통계량은 회귀 모델의 전체 유의성을 검정하는 통계량이다. 이 값이 크면 클수록 모델이 유의하다는 것을 의미한다. 여기서 F-통계량이 218.5로 매우 크고, p-값이 0.000000432로 매우 작아 모델이 통계적으로 유의미하다는 것을 나타낸다. 이는 독립 변수가 종속 변수에 유의한 영향을 미친다는 의미다.

    회귀 계수 및 해석

    Intercept (절편)

    • : -0.7527
    • 표준 오차: 5.682
    • p-값: 0.898
    • 설명: 절편은 과학 점수가 0일 때 수학 점수의 예상값을 의미한다. 여기서는 절편의 p-값이 0.898로 유의하지 않으므로, 절편이 통계적으로 유의미하지 않음을 나타낸다.

    science (과학 점수)

    • 계수 값: 1.0342
    • 표준 오차: 0.070
    • p-값: 0.000
    • 설명: 과학 점수의 회귀 계수는 1.0342로, 이는 과학 점수가 1점 증가할 때 수학 점수가 평균적으로 1.0342점 증가함을 의미한다. p-값이 0.000으로 매우 작아 통계적으로 유의미하다.

    모델 진단 지표

    Durbin-Watson

    • : 2.261
    • 설명: Durbin-Watson 통계량은 잔차의 자기상관을 검정하는 지표로, 2에 가까운 값일수록 잔차의 자기상관이 없음을 의미한다. 여기서 값이 2.261로 2에 가까우므로, 잔차의 자기상관이 거의 없음을 나타낸다.

    Prob (Omnibus), Skew, Kurtosis, Jarque-Bera (JB)

    • : Omnibus: 1.170, JB: 0.811, Skew: -0.402, Kurtosis: 1.859
    • 설명: 이 지표들은 잔차의 정규성을 검정하는 데 사용된다. Omnibus와 JB의 p-값이 높고, Skew와 Kurtosis 값이 정규분포에 가까운 값을 보이므로, 잔차가 정규분포를 따를 가능성이 높다.

    결론

    이 회귀 분석 모델은 과학 점수가 수학 점수에 미치는 영향을 잘 설명하는 모델로, 매우 높은 설명력을 가지고 있다. 과학 점수는 수학 점수에 유의미한 영향을 미치며, 모델의 진단 지표들도 양호한 상태를 보여준다.

    로지스틱 회귀분석과 가중치

    선형회귀에서 수학과 과학 성적 간의 관계를 직선의 방적식으로 표현한다는 가설하에, 주어진 데이터로부터 가중치 a(weight)과 편향 b(bias)를 찾아 데이터를 가장 잘 표현하는 직선을 찾았다. 그러면 학생들의 시험 성적에 따른 합격 평가 데이터가 있다고 보고 성적 점수에서 구분 컬럼은 통과 여부 범주형이다. (합격 : 1, 불합격 : 0) 성적 x, 결과 y....

    시험 데이터로부터 특정 점수를 받았을 때 합격 여부를 판정하는 모델이다.

    종속 변수가 연속 값이 아니라 비연속 값이면 선형회귀분석은 사용하지 못한다. 이럴 경우에 사용하는 것이 로지스틱 회귀분석이다.

    import pandas as pd
    import seaborn as sns
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 데이터 생성
    pt = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
    score = [51, 64, 60, 50, 68, 80, 90, 92, 99, 83]
    
    # 데이터프레임 생성
    df = pd.DataFrame({"PassTest": pt, "Score": score})
    
    # 상관계수 계산
    corr = df.corr()
    print("Correlation Matrix:")
    print(corr)
    
    # 상관변수 시각화
    sns.lmplot(x='Score', y='PassTest', data=df, logistic=True)
    plt.title('Logistic Regression Plot')
    plt.show()

    이러한 점들을 표현하는 그래프는 알파벳의 S자 형태로 표현된다. x와 y의 관계를 표현하기 위해서는 직선을 표현하는 함수가 아니라 S자 형태로 표현할 수 있는 곡선 함수가 필요하다.

     

    그러면 어떤걸 사용해야하냐? 0과 1 사이의 값을 가지면서, S자 형태로 그려지는 조건을 충족하는 함수인 시그모이드 함수를 사용한다.

    """y = ax + b에서 a는 1, b는 0으로 가정"""
    %matplotlib inline
    import pandas as pd
    import seaborn as sns
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 데이터 생성
    pt = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
    score = [51, 64, 60, 50, 68, 80, 90, 92, 99, 83]
    
    # 데이터프레임 생성
    df = pd.DataFrame({"PassTest": pt, "Score": score})
    
    # 시그모이드 함수 정의
    def sigmoid(x):
        return 1 / (1 + np.exp(-x))
    
    # x와 y 생성
    x = np.arange(-10.0, 10.0, 0.1)
    y = sigmoid(x)
    
    # 시그모이드 함수 그리기
    plt.plot(x, y, 'g', label='Sigmoid Function')
    
    # 기준선 그리기
    plt.axvline(0, color='red', linestyle=':')
    
    # 그래프 꾸미기
    plt.title('Sigmoid Function with Baseline')
    plt.xlabel('x')
    plt.ylabel('sigmoid(x)')
    plt.legend()
    plt.show()

    x가 0일 때 0.5의 값을 가지며 x가 증가하면 1에 수렴한다. W는 1, b는 0임을 가정한 그래프이다. 

    가중치 a의 변화 확인

    그래프는 a의 값이 0.5일 때 빨간색 선, 1일 때 초록색 선, 2일 때 파란색 선이 나오는 그래프를 보자.

    a의 값에 따라 그래프의 경사도가 변하는 것을 볼 수 있는데, 선형회귀에서 가중치 a는 직선의 기울기를 의미했지만, 그림에서는 그래프의 경사도를 결정한다. a의 값이 커지면 경사가 커지고, a의 값이 작아지면 경사가 작아진다.

     

    편향 b의 변화 확인

    시그모이드 함수는 입력값이 커지면 1에 수렴하고, 입력값이 작아지면 0으로 수렴한다.

    0부터 1까지의 값을 가지는데 출력값이 0.5 이상이면 1(True), 0.5이하면 (False)로 만들면 이진 분류 문제로 사용이 가능하다.

    이것을 확률로 보면 50%가 넘으면 해당 범주에 속한다고 판단하고 50%가 안된다면 속하지 않는다라고 판달할 수 있다.

    %matplotlib inline
    import pandas as pd
    import seaborn as sns
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 데이터 생성
    pt = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
    score = [51, 64, 60, 50, 68, 80, 90, 92, 99, 83]
    
    # 데이터프레임 생성
    df = pd.DataFrame({"PassTest": pt, "Score": score})
    
    # 시그모이드 함수 정의
    def sigmoid(x):
        return 1 / (1 + np.exp(-x))
    
    # x와 y 생성
    x = np.arange(-5.0, 5.0, 0.1)
    y1 = sigmoid(x + 0.5)
    y2 = sigmoid(x + 1)
    y3 = sigmoid(x + 1.5)
    
    plt.plot(x, y1, 'r', linestyle='--') # x + 0.5
    plt.plot(x, y2, 'g') # x + 1
    plt.plot(x, y3, 'b', linestyle='--') #x + 1.5
    plt.plot([0, 0], [1.0, 0.0], ":")
    plt.title("Sigmoid Function")
    plt.show()

    머신러닝으로..

    1. 머신러닝 모델 최적화

    1.1 비용 함수 / 손실 함수 / 목적 함수 / 오차 함수

    머신러닝에서 모델을 학습시키기 위해 사용하는 함수들은 모델의 예측 값과 실제 값 사이의 차이를 계산한다. 이러한 함수들은 다음과 같다.

    • 비용 함수 (Cost Function): 모델의 전체 성능을 측정하는 함수로, 모델이 얼마나 잘 예측하는지를 평가하기 위해 사용된다. 비용 함수는 전체 데이터셋에 대한 손실 함수의 평균값 또는 합계를 나타내며, 최적화 과정에서 최소화하는 것이 목표다. 예시로 평균제곱오차(Mean Squared Error, MSE)가 있다.
    • 수식:

    • 손실 함수 (Loss Function): 단일 데이터 포인트에서의 예측 오차를 측정하는 함수다. 각 데이터 포인트에 대해 모델의 예측 값과 실제 값 사이의 차이를 계산한다. 예시로 제곱 오차(Squared Error)가 있다.
    • 수식:

    • 목적 함수 (Objective Function): 모델 학습의 목표를 정의하는 함수로, 비용 함수와 유사한 개념으로 사용된다. 그러나 목적 함수는 비용 함수뿐만 아니라 정규화 항목과 같은 다른 요소를 포함할 수도 있다. 예시로 정규화된 비용 함수(Regularized Cost Function)가 있다.
    • 수식:

    • 오차 함수 (Error Function): 예측 값과 실제 값 사이의 차이를 나타내는 함수로, 손실 함수와 유사한 개념이다. 예시로 절대 오차(Absolute Error)가 있다.
    • 수식:

    1.2 최적화

    모델의 예측 성능을 높이기 위해 비용 함수를 최소화하는 과정을 최적화라고 한다. 최적화 과정에서는 비용 함수를 최소화하는 모델 파라미터를 찾는다.

    1.3 경사 하강법

    경사 하강법(Gradient Descent)은 비용 함수를 최소화하기 위해 사용되는 최적화 알고리즘이다. 이 알고리즘은 비용 함수의 기울기를 따라 내려가면서 최적의 파라미터를 찾는다.

    • 경사 하강법 과정:
      1. 초기 파라미터 설정: 임의의 값으로 시작
      2. 비용 함수의 기울기 계산: 현재 파라미터에서의 기울기 계산
      3. 파라미터 업데이트: 기울기를 사용해 파라미터를 업데이트
      4. 반복: 2와 3을 반복하여 비용 함수가 최소화될 때까지 진행

    2. 머신러닝 모델 일반화

    2.1 과대적합 (Overfitting)

    과대적합은 모델이 학습 데이터에 너무 잘 맞춰져서 새로운 데이터에 대한 예측 성능이 떨어지는 현상이다. 이를 방지하기 위해 여러 방법이 사용된다.

    • 교차 검증 (Cross-validation): 데이터를 여러 개의 부분으로 나누어 여러 번 모델을 학습하고 검증하는 방법이다.
    • 정규화 (Regularization): 모델 복잡도를 줄이기 위해 L1, L2 정규화를 적용한다.
    • 드롭아웃 (Dropout): 신경망에서 일부 노드를 랜덤하게 꺼서 학습하는 방법이다.

    2.2 과소적합 (Underfitting)

    과소적합은 모델이 학습 데이터를 충분히 학습하지 못해 예측 성능이 떨어지는 현상이다. 이를 해결하기 위해 다음과 같은 방법을 사용한다.

    • 모델 복잡도 증가: 더 복잡한 모델을 사용하거나 더 많은 특징을 추가한다.
    • 더 많은 학습 데이터 사용: 모델이 충분히 학습할 수 있도록 더 많은 데이터를 사용한다.
    • 적절한 학습 알고리즘 선택: 데이터에 적합한 알고리즘을 선택하여 학습한다.

    결론

    머신러닝 모델의 최적화와 일반화는 모델 성능을 높이기 위해 필수적인 과정이다. 최적화를 통해 모델의 예측 성능을 향상시키고, 일반화를 통해 새로운 데이터에 대한 예측 성능을 확보할 수 있다. 과대적합과 과소적합을 적절히 조절하여 최적의 모델을 개발하는 것이 중요하다. 이를 위해 비용 함수와 경사 하강법 등의 최적화 기법을 이해하고, 교차 검증과 정규화 등의 일반화 기법을 잘 활용해야 한다.

    'Python > 빅데이터 분석과 머신러닝' 카테고리의 다른 글

    #11 머신러닝  (0) 2024.08.01
    #9 스몰데이터 통계  (0) 2024.07.25
    #8 데이터 분석  (1) 2024.07.23
    #7 데이터 시각화  (2) 2024.07.18
    #4 데이터 보기(판다스)  (0) 2024.07.17