Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Week2] - seungwoo #37

Merged
merged 4 commits into from
Dec 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 0 additions & 43 deletions README.md

This file was deleted.

31 changes: 31 additions & 0 deletions week2-seungwoo/concept.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# 1.SVM은 N차원을 공간을 (N-1)차원으로 나눌 수 있는 초평면을 찾는 분류 기법
SVM은 2개의 클래스를 분류할 수 있는 최적의 경계를 찾고자 합니다.
마진은 클래스들 사이의 간격, 각 클래스의 말단에 위치한 데이터들 사이의 거리를 의미합니다. SVM은 분류를 할 때 이 마진을 최대화시키고자 합니다. 즉 마진을 최대화할 수 있는 경계를 찾는 것이죠.

​support vector(서포트 벡터)는 마진에서 가장 가까이 위치해 있는 각 클래스의 데이터 입니다. 위 그림에서는 점선 위에 있는 두개의 데이터가 support vector입니다. 이를 서포트 벡터라고 하는 이유는 이 데이터들의 위치에 따라서 경계(초평면)의 위치가 달라지기 때문에 초평면 함수를 지지한다는 의미에서 명명되었습니다.

하드마진은 두 클래스를 분류할 수 있는 최대마진의 초평면을 찾는 방법입니다. 단, 모든 훈련데이터는 마진의 바깥족에 위치하게 선형으로 구분해야 합니다. 다시 말해서 하나의 오차도 허용하면 안된다는 것을 의미

하지만 모든 데이터를 선형으로 오차없이 나눌 수 있는 결정경계를 찾는 것은 사실상 어렵습니다. 그래서 이를 해결하고자 나온 개념이 소프트마진입니다.

소프트마진은 하드마진이 가진 한계를 개선하고자 나온 개념으로써 완벽하게 분류하는 초평면을 찾는 것이 아니라 어느 정도의 오분류를 허용하는 방식입니다. 소프트마진에서는 오분류를 허용하고 이를 고려하기 위해 slack variable을 사용합니다. Slack variable은 해당 결정경계로부터 잘못 분류된 데이터의 거리를 측정하기 위해 사용합니다.

# 2-1. 결정 트리(Decision Tree)
정의: 데이터를 기준에 따라 분리하는 트리 구조의 모델입니다.
장점: 직관적이고 해석이 쉬우며, 다양한 데이터 형태를 처리할 수 있습니다.
단점: 과적합(overfitting)되기 쉬움.
# 2-2 랜덤 포레스트(Random Forest)
랜덤 포레스트(Random Forest)
정의: 여러 개의 결정 트리를 결합한 앙상블 학습 방법입니다.
장점:
단일 결정 트리에 비해 과적합을 방지합니다.
분산과 편향을 줄이며 일반화 성능을 높입니다.
작동 원리:
데이터 샘플링: 훈련 데이터의 랜덤 서브셋 생성(부트스트랩 샘플링).
랜덤성 도입: 각 트리가 서로 다른 특성 집합을 사용.
다수결(Majority Voting): 모든 트리의 예측 결과를 결합해 최종 예측.
# 교차 검증 및 그리드 탐색
교차 검증(Cross Validation): 데이터를 여러 번 나눠 모델의 일반화 성능을 평가.
그리드 탐색(Grid Search): 여러 하이퍼파라미터 조합을 시도해 최적값을 찾음.
# 3. GridSearchCV
사용자가 직접 모델의 하이퍼 파라미터의 값을 리스트로 입력하면 값에 대한 경우의 수마다 예측 성능을 측정 평가하여 비교하면서 최적의 하이퍼 파라미터 값을 찾는 과정을 진행
48 changes: 48 additions & 0 deletions week2-seungwoo/week2_task1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt


#1.데이터 준비
iris = load_iris()
X = iris["data"][:, 3 :] #꽃잎 너비
y = (iris["target"] == 2).astype(int)

print(f"특성 이름: {iris['feature_names'][:4]}")
print(f"타깃 이름: {iris['target_names'][:3]}")
print(f"데이터 크기: {X.shape}")

#2.데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2, random_state = 42)
print(f"훈련 세트 크기 : {X_train.shape}")
print(f"테스트 세트 크기 : {X_test.shape}")

model = LogisticRegression(C = 0.1, penalty= 'l1', solver = 'liblinear', max_iter=1000)

model.fit(X_train, y_train)
res = model.predict(X_test)

from sklearn.metrics import accuracy_score
accuracy = accuracy_score (y_test, res)

print(f"모델 정확도(Accuracy) : {accuracy}")



X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = model.predict_proba(X_new)
decision_boundary = X_new[y_proba[:, 1] >= 0.5][0]

plt.plot(X_new, y_proba[:, 1], "g-", label = "Iris virginica")
plt.axvline(x=decision_boundary, color = 'r', linestyle = "--", label = "Decision Boundary")
plt.xlabel("Petal width (cm)")
plt.ylabel("Probability")
plt.legend()
plt.grid()
plt.show()

print(f"결정 경계: {decision_boundary}")

#모델의 accuracy가 매우 높은 편이고, 결정경계가 적절한 위치에서 데이터셋을 잘 분류하고 있음을 알 수 있다.
49 changes: 49 additions & 0 deletions week2-seungwoo/week2_task2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from sklearn.svm import SVC
from sklearn.datasets import load_iris
import numpy as np

iris = load_iris(as_frame=True)
X = iris.data[["petal length (cm)", "petal width (cm)"]].values
y = iris.target


print(f"특성 이름: {iris['feature_names'][:2]}")
print(f"타깃 이름: {iris['target_names'][:2]}")
print(f"데이터 크기: {X[:100].shape}")

setosa_or_versicolor = (y == 0) | (y == 1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]

svm_clf = SVC(kernel="linear", C=1)
svm_clf.fit(X, y)

print("Support Vectors:", svm_clf.support_vectors_)

import matplotlib.pyplot as plt

x0s = np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 200)
x1s = np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 200)
x0, x1 = np.meshgrid(x0s, x1s)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_decision = svm_clf.decision_function(X_new).reshape(x0.shape)

# 데이터 산점도
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color="green", label="Setosa", s=50)
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color="blue", label="Versicolor", s=50)


plt.contour(x0, x1, y_decision, levels=[-1, 0, 1], colors="k", linestyles=["dashed", "solid", "dashed"], linewidths=1)

plt.scatter(svm_clf.support_vectors_[:, 0], svm_clf.support_vectors_[:, 1], s=200, facecolors='none', edgecolors="black", label="Support Vectors")


plt.title("SVM Decision Boundary with Margins", fontsize=14, pad=15)
plt.xlabel("Petal length (cm)", fontsize=12)
plt.ylabel("Petal width (cm)", fontsize=12)


plt.legend(loc="upper left", fontsize=10)
plt.grid(visible=True, alpha=0.6)
plt.tight_layout()
plt.show()
52 changes: 52 additions & 0 deletions week2-seungwoo/week2_task3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
import matplotlib.pyplot as plt
from scipy.stats import mode
from sklearn.metrics import accuracy_score

# make_moons 데이터셋 생성
x, y = make_moons(n_samples=1000, noise=0.4)

# 데이터 가시성을 위해서 시각화
plt.scatter(x[:, 0], x[:, 1], marker='o', c=y, s=100, edgecolor="k", linewidth=2)
plt.show()

# 데이터셋을 훈련 데이터와 테스트 데이터로 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

print(x_train.shape) # 입력 데이터 크기
print(y_train.shape)

# RandomizedSearchCV를 사용하여 하이퍼파라미터 탐색
param_RF = {
'n_estimators': [50, 100, 150],
'max_depth': [None, 10, 20, 30],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4],
'max_features': ['sqrt', 'log2', None],

}


from sklearn.metrics import accuracy_score
# RandomForestClassifier 모델 생성
rf = RandomForestClassifier(random_state=42)

# RandomizedSearchCV 설정
rscv = RandomizedSearchCV(estimator=rf, param_distributions=param_RF, n_iter=10, cv=5, n_jobs=-1, scoring='accuracy', random_state=42)
rscv.fit(x_train, y_train)

# 최적 모델 출력
best_model = rscv.best_estimator_

# 테스트 데이터에 대한 예측
y_pred = best_model.predict(x_test)

# 최적 파라미터와 정확도 출력
print("Best Parameters:", rscv.best_params_)
print(f'Best Model Accuracy: {accuracy_score(y_test, y_pred):.4f}')