재형이의 성장통 일지
  • 의사 결정 트리, 랜덤 포레스트, SVM, 선형 회귀
    2024년 02월 15일 05시 13분 39초에 업로드 된 글입니다.
    작성자: 재형이
    반응형
     
     
    • 여기까지 딥러닝과 관련된 파이썬의 라이브러리 또는 프레임워크들을 알아보았고 내일부터는 기초 수학들을 좀 다룰 예정이다 ex) 함수, 로그, 미분...
    • 고등학교 시절 추억이 새록새록 날 것 같다ㅎㅎ
      친구들이랑 야자 도망가면서 많이 맞았었는데...ㅋ
    • 사실 지금까지 정리한 것들을 다 이해했다고 말하기 힘들다. 아니 절반도 이해 못했다. 하지만 시작이 중요한거니까...
      끝까지 가면 내가 다 이겨

     

     

     

     

     

     


     

     

     

     

     

     

     

     

    1. 의사 결정 트리 (Decision Tree)

    • 이진 트리 구조로 예/아니오로 답할 수 있는 질문을 반복하여 분류를 수행하며 판별을 한다

    • 붓꽃 데이터 세트로 실습해보자
    컬럼명 의미 데이터 타입
    Species 붓꽃의 종 : setosa, versicolor, virginica Factor
    Sepal.Width 꽃받침의 너비 Number
    Sepal.Length 꽃받침의 길이 Number
    Petal.Width 꽃잎의 너비 Number
    Petal.Length 꽃잎의 길이 Number
    from sklearn.datasets import load_iris
    
    # 데이터 세트 불러오기
    dataset = load_iris()
    # 데이터 세트에서 필요한 정보 가져오기
    data = dataset["data"]
    target = dataset["target"]
    feature_names = dataset["feature_names"]
    target_names = dataset["target_names"]
    
    print(f"총 데이터 개수: {len(data)}")
    print("[입력 특징]")
    for i in range(len(feature_names)):
        feature_name = feature_names[i]
        print(f"{i + 1}: {feature_name}")
    print("[입력 데이터 예시]")
    print(data[:5])
    print("[출력 특징]")
    for i in range(len(target_names)):
        target_name = target_names[i]
        print(f"{i + 1}: {target_name}")
    print("[출력 데이터 예시]")
    print(target[:5])

    from sklearn.model_selection import train_test_split
    
    X_train, X_test, Y_train, Y_test = train_test_split(
        data,
        target,
        test_size=0.2,
        random_state=2000
    )
    print(f"학습 데이터 개수: {len(X_train)}")
    print(f"테스트 데이터 개수: {len(X_test)}")

    # 학습 데이터의 입력 특징 출력
    df = pd.DataFrame(X_train, columns=feature_names)
    print(df)

    # 학습 데이터의 정답 레이블 카테고리(category) 출력
    series = pd.Series(Y_train, dtype="category")
    series = series.cat.rename_categories(target_names)
    print(series)

    # 데이터 프레임(data frame) 출력
    df["target_name"] = series
    df.head()

    import seaborn as sns
    
    sns.pairplot(df, hue='target_name')
    plt.show()

    setosa = df[df.target_name == "setosa"]
    setosa.head()

    others = df[df.target_name != "setosa"]
    others.head()

    sns.histplot(setosa["petal length (cm)"], label="setosa", color="red", kde=True)
    sns.histplot(others["petal length (cm)"], label="others", color="blue", kde=True)
    plt.legend()
    plt.show()

    • Petal의 Length에 따라 굉장히 유의미한 분포가 나타난다는 것을 알 수 있다
    • 결정 트리(decision tree) 라이브러리를 사용할 수 있다
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.metrics import accuracy_score
    
    print("학습 데이터 크기:", X_train.shape)
    print("정답 레이블 데이터 크기:", Y_train.shape)
    
    classifier = DecisionTreeClassifier(random_state=2000) # 의사 결정 트리 객체 초기화
    classifier.fit(X_train, Y_train) # 학습 진행
    
    pred = classifier.predict(X_test)
    accuracy = accuracy_score(Y_test, pred)
    print(f"예측 정확도: {accuracy * 100.:.4f}%")

    2. 랜덤 포레스트 (Random Forest)

    • 의사 결정 트리를 응용한 버전이라고 볼 수 있다
    • 여러 개의 의사 결정 트리를 앙상블(ensemble)하여 정확도를 높인다
    • 단순히 하나의 트리에 대한 결과만을 활용하지 않고, 여러 트리의 결과를 종합하여 분류한다
    • 단순히 하나의 결정 트리를 사용할 때보다 우수한 정확도를 보인다

    • 랜덤 포레스트(random forest) 라이브러리를 사용할 수 있다
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.metrics import accuracy_score
    
    print("학습 데이터 크기:", X_train.shape)
    print("정답 레이블 데이터 크기:", Y_train.shape)
    
    classifier = RandomForestClassifier(random_state=2000) # 의사 결정 트리 객체 초기화
    classifier.fit(X_train, Y_train) # 학습 진행
    
    pred = classifier.predict(X_test)
    accuracy = accuracy_score(Y_test, pred)
    print(f"예측 정확도: {accuracy * 100.:.4f}%")

    • 각 트리를 학습하기 위한 데이터를 추출하기 위해 부트스트랩(bootstrap)을 활용한다
    • 일반적으로 각 부트스트랩의 데이터의 개수는 원본 데이터의 개수와 같으며, 각 부트스트랩은 고유한 데이터 구성을 가진다

    3. SVM (Support Vector Machine)

    • 서포트 벡터 머신(SVM, Support Vector Machine) 모델 기능을 제공한다
    • 마진을 최대화하는 결정 경계(decision boundary)를 학습한다
      • 마진(margin)은 결정 경계와 서포트 벡터 사이의 거리를 의미한다

    • SVM 라이브러리를 사용할 수 있다
    from sklearn.model_selection import train_test_split
    from sklearn.datasets import make_moons
    
    # noise가 0일 때는 정확히 구분되는 달(moon)의 모양, noise가 클수록 아웃라이어 생성
    X, y = make_moons(n_samples=500, noise=0.05, random_state=1234)
    df = pd.DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
    print(df.head())
    
    print("데이터의 개수:", len(df))
    print(df["x"].head()) # 데이터 x
    print(df["y"].head()) # 데이터 y
    
    plt.scatter(df["x"], df["y"], s=100, c=y)
    plt.xlabel("$X_1$")
    plt.ylabel("$X_2$")
    plt.show()
    
    X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.2)
    print(X_train.shape, Y_train.shape)
    print(X_test.shape, Y_test.shape)

    • 학습 데이터에 대하여 오류(error)를 얼마나 허용할 것인지 명시할 수 있다
      → C: 규제(regularization) 파라미터(parameter)를 조정
    • 아웃라이어(outlier)가 존재할 수 있는 상황에서도 효과적으로 학습이 가능하다
    • 즉, 선형함수 뿐만 아니라 비선형함수로도 표현 가능
    • 위와 같이 초승달 모양에는 선형함수를 적용시키기 힘들기 때문에 규제 파라미터 값을 조정해서 비선형함수로 표현할 수 있다

    • 규제 파라미터 값이 0.1일 때 예측 정확도는 84%이다
    from sklearn.svm import LinearSVC
    from sklearn.svm import SVC
    
    classifier = LinearSVC(C=0.1, random_state=2000, max_iter=5000) # SVM 객체 초기화
    classifier.fit(X_train, Y_train) # 학습 진행
    
    pred = classifier.predict(X_test)
    accuracy = accuracy_score(Y_test, pred)
    print(f"예측 정확도: {accuracy * 100.:.4f}%")
    
    pred = classifier.predict(X_test)
    cm = confusion_matrix(Y_test, pred)
    
    # 혼동 행렬(confusion matrix) 시각화
    cm_matrix = pd.DataFrame(data=cm,
                             columns=['Actual Positive:1', 'Actual Negative:0'],
                             index=['Predict Positive:1', 'Predict Negative:0'])
    sns.heatmap(cm_matrix, annot=True)

    • 규제 파라미터 값이 0.5일 때 예측 정확도는 100%이다
    classifier = SVC(C=0.5, kernel="rbf", random_state=2000, max_iter=5000) # SVM 객체 초기화
    classifier.fit(X_train, Y_train) # 학습 진행
    
    pred = classifier.predict(X_test)
    accuracy = accuracy_score(Y_test, pred)
    print(f"예측 정확도: {accuracy * 100.:.4f}%")
    
    pred = classifier.predict(X_test)
    cm = confusion_matrix(Y_test, pred)
    
    # 혼동 행렬(confusion matrix) 시각화
    cm_matrix = pd.DataFrame(data=cm,
                             columns=['Actual Positive:1', 'Actual Negative:0'],
                             index=['Predict Positive:1', 'Predict Negative:0'])
    sns.heatmap(cm_matrix, annot=True)

    4. 선형 회귀 (Linear Regression)

    • 주어진 데이터를 학습하여 가장 합리적인 선형 함수를 찾아내는 것을 선형 회귀라고 한다
    • 학습 데이터가 3개 이상일 때 의미가 있다
    • 선형 함수 모델을 가정하므로, 다음과 같이 모델을 정의할 수 있다
    • 우리의 모델(𝑊와 𝑏)을 수정해 나가면서 가장 합리적인 식을 찾아낼 수 있다

    • 평균 제곱 오차(mean squared error)를 최소화하는 W와 b를 찾는 것이 목표이다

    https://jaehyeong.tistory.com/entry/%ED%8C%A8%EC%8A%A4%ED%8A%B8%EC%BA%A0%ED%8D%BC%EC%8A%A4-%ED%99%98%EA%B8%89%EC%B1%8C%EB%A6%B0%EC%A7%80-4%EC%9D%BC%EC%B0%A8-%EB%AF%B8%EC%85%98-2%EC%9B%94-4%EC%9D%BC-%ED%99%95%EB%A5%A0-%EB%B6%84%ED%8F%AC%EC%9D%98-%EC%B6%94%EC%A0%95-%EC%B5%9C%EB%8C%80-%EA%B0%80%EB%8A%A5%EB%8F%84-%ED%8E%B8%ED%96%A5-%EC%B6%94%EC%84%B8%EC%84%A0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B6%94%EC%B6%9C

     

    패스트캠퍼스 환급챌린지 4일차 미션 (2월 4일) : 확률 분포의 추정, 최대 가능도, 편향, 추세선,

    후우... 수식이 너무 많아서 어렵네요... 첨 듣는 단어도 너무 많이 나오고, 기호들은 또 왜이렇게 많은지! 하지만 처음 하는거니까 익숙하지 않은건 당연한거구 자주 보다보면 익숙해지겠죠?ㅎ 1

    jaehyeong.tistory.com

    from sklearn.datasets import make_regression
    
    X, y = make_regression(n_samples=500, noise=5, n_features=1, random_state=1234)
    df = pd.DataFrame(dict(x=X[:,0], y=y))
    print(df.head())
    
    print("데이터의 개수:", len(df))
    print(df["x"].head()) # 데이터 x
    print(df["y"].head()) # 데이터 y
    
    plt.scatter(df["x"], df["y"], s=100, c=y)
    plt.xlabel("$X$")
    plt.ylabel("$Y$")
    plt.show()
    
    X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.2)
    print(X_train.shape, Y_train.shape)
    print(X_test.shape, Y_test.shape)

    from sklearn.linear_model import LinearRegression
    
    classifier = LinearRegression() # 선형 회귀 모델 객체 초기화
    classifier.fit(X_train, Y_train) # 학습 진행
    
    print("기울기:", classifier.coef_)
    print("y 절편:", classifier.intercept_)
    
    pred = classifier.predict(X_test)
    plt.plot(X_test, Y_test, 'o')
    plt.plot(X_test, classifier.predict(X_test.reshape(-1, 1)))
    plt.show()

     

     

     

     

     

     

     

     

     


     

     

     

     

     

     

     

    반응형
    댓글