방명록
- 의사 결정 트리, 랜덤 포레스트, 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를 찾는 것이 목표이다
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()
반응형'인공지능 > 프레임워크 or 라이브러리' 카테고리의 다른 글
Image Captcha 라이브러리 (Library) (4) 2024.02.20 대량의 데이터 다루기, 누락된 데이터 처리, 클래스 활용 (0) 2024.02.20 사이킷런 개요, 가상 데이터, 데이터 분할, ROC 커브 (2) 2024.02.14 텐서플로우 자동미분, 모델 생성 후 테스트 (2) 2024.02.13 텐서플로우 개요, 텐서 형변환, 연산, 함수 (2) 2024.02.12 다음글이 없습니다.이전글이 없습니다.댓글