diff --git a/README.md b/README.md deleted file mode 100644 index 78acda0..0000000 --- a/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# GDGoC AI 스터디 - -## **:loudspeaker: GDGoC AI 스터디 GitHub 협업 방식 공지사항** - -_안녕하세요, GDGoC AI 스터디 멤버 여러분! 이번 스터디에서는 GitHub를 사용해 주차별로 개념 정리와 과제 코드를 공유하고 리뷰할 예정입니다. 아래의 협업 방식을 참고하여 진행해 주세요._ -
-
- -**[주차별 브랜치 설정 및 개인 브랜치 생성]**
-**주차별 브랜치 생성:** 관리자가 week1, week2, week3 등 주차별 브랜치를 미리 생성해 둘 예정입니다.
-**개인 브랜치 생성:** 멤버들은 해당 주차 브랜치(예: week1)에서 자신의 이름을 포함한 브랜치를 생성해 주세요. 브랜치 이름 형식은 'week1-이름'으로 통일합니다. (예:week1-hayoung)
- -**[개념 정리 및 과제 코드 작성]**
-**개념 정리:** 각 주차에 대한 개념 정리를 자신의 브랜치에 Markdown 파일(.md)로 작성해 주세요.
-**과제 코드 작성:** 주어진 과제를 해결하는 코드 파일을 .py 또는 .ipynb 형식으로 작성하여 자신의 브랜치에 업로드해 주세요.
- -**[커밋 및 푸시]**
-**커밋 메시지 작성:** 개념 정리나 과제를 완료할 때마다 명확한 커밋 메시지와 함께 커밋해 주세요. (예: Add week1 concept notes 또는 Complete week1 assignment)
-**브랜치 푸시:** 작업을 완료한 후 자신의 브랜치에 커밋을 푸시합니다.
- -**[Pull Request(PR) 생성]**
-**PR 생성:** 본인의 브랜치에서 해당 주차 브랜치(예: week1)로 Pull Request를 생성합니다.
-**PR 제목과 설명:** PR 제목은 '[Week1] - 이름'으로 통일하고, 설명에는 정리한 개념과 과제 내용을 간략히 적어 주세요.
- -**[코드 리뷰 및 피드백 반영]**
-**리뷰 확인:** 관리자가 PR을 리뷰하고 피드백을 남기면, 이를 확인하고 필요한 경우 수정해 주세요.
-**수정 후 커밋 및 푸시: ** 피드백 반영 후 다시 커밋하고 푸시하면, PR에 자동으로 반영됩니다.
- -**[PR 머지]**
-**최종 머지:** 관리자가 최종 리뷰 후 PR을 해당 주차별 브랜치(week1, week2 등)에 머지합니다.
-**브랜치 삭제:** PR 머지가 완료되면, 자신의 브랜치를 삭제하여 레포지토리를 깔끔하게 유지해 주세요.
-
- -_위와 같은 방식으로 GitHub 협업을 진행하니, 각 주차별로 개념과 과제를 체계적으로 관리하고 성장해 나갈 수 있기를 기대합니다!_ :tada: -
-
- -## **:loudspeaker: GDGoC AI 스터디 규칙** -- 매주 1회(수요일 - 추후 협의) 30분 이내로 디스코드로 모여 그 날 발표자(2명)이 발표를 합니다. -- 발표 중에 발표를 하고 있지 않은 다른 인원들은 발표에 대한 **피드백** 또는 발표 내용에 대한 **질문**을 정리합니다. -- 매주 사다리타기로 발표 순서를 결정합니다. -- **비대면**으로 진행하나, 대면을 원하시는 경우 대면도 가능합니다. -- 소통은 디스코드에서, 자료 정리 및 스터디 관리는 노션/깃허브에서 진행합니다. diff --git a/week2-huiju/task1.py b/week2-huiju/task1.py new file mode 100644 index 0000000..870ca4c --- /dev/null +++ b/week2-huiju/task1.py @@ -0,0 +1,68 @@ + +from sklearn.datasets import load_iris +from sklearn.linear_model import LogisticRegression +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score +import numpy as np +import matplotlib.pyplot as plt + +# 1. 데이터 준비 +iris = load_iris() +X = iris["data"][:, 3:] +y = (iris["target"] == 2).astype(int) # 타깃 이진화: Virginica 품종을 1로, 나머지는 0으로 변환 + +# 데이터 정보 출력 +print("특성 이름:", iris.feature_names) +print("타깃 이름:", iris.target_names) +print("데이터 크기:", y.reshape(-1, 1).shape) + +# 2. 데이터 분할 +# 데이터 분할: 훈련 세트(80%)와 테스트 세트(20%) +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) + +# 훈련 세트와 테스트 세트 크기 출력 +print("훈련 세트 크기:", y_train.reshape(-1, 1).shape) +print("테스트 세트 크기:", y_test.reshape(-1, 1).shape) + +# 3. 모델 학습 / 예측 및 평가 +# 로지스틱 회귀 모델 정의 및 학습 +log_reg = LogisticRegression() +log_reg.fit(X_train, y_train) + +res=log_reg.predict(X_test) # 예측 수행 +accuracy=accuracy_score(y_test, res) # 모델의 정확도 계산 + +print("모델 정확도(Accuracy) ", accuracy) # 결과 출력 + +# 4. 결정 경계 시각화 +X_new = np.linspace(0, 3, 1000).reshape(-1, 1) +y_proba = log_reg.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.title("Logistic Regression - Decision Boundary") +plt.legend() # 범례를 추가 +plt.grid() +plt.show() +print(f"결정 경계: {decision_boundary}") + +# 4. 결정 경계 시각화 +x_min, x_max = 0, 3 +xx = np.linspace(x_min, x_max, 1000).reshape(-1, 1) +probabilities = model.predict_proba(np.hstack((np.zeros((1000, 1)), xx)))[:, 1] + +plt.figure(figsize=(10, 6)) +plt.plot(xx, probabilities, label='Iris Virginica 확률', color='blue') +plt.axhline(0.5, color='red', linestyle='--', label='결정 경계') +plt.title('Iris Virginica 확률 곡선 및 결정 경계') +plt.xlabel('꽃잎 너비 (cm)') +plt.ylabel('확률') +plt.legend() +plt.grid() +plt.show() + +# 분석 : +# 모델의 성능은 정확도 1.0으로 매우 우수하며, 결정 경계 시각화를 통해 꽃잎 너비에 따라 Iris Virginica 품종과 나머지 품종을 잘 구분하고 있는 것을 확인할 수 있습니다. \ No newline at end of file diff --git a/week2-huiju/task2.py b/week2-huiju/task2.py new file mode 100644 index 0000000..ded53c6 --- /dev/null +++ b/week2-huiju/task2.py @@ -0,0 +1,57 @@ +from sklearn.datasets import load_iris +from sklearn.svm import SVC +import numpy as np +import matplotlib.pyplot as plt + +# 1. 데이터 준비 +iris = load_iris() +X = iris.data[:, 2:4] # 꽃잎 길이와 꽃잎 너비 +y = iris.target + +# Iris Setosa와 Iris Versicolor 클래스만 선택 +setosa_or_versicolor = (y == 0) | (y == 1) +X = X[setosa_or_versicolor] +y = y[setosa_or_versicolor] + +# 데이터 정보 출력 +print("특성 이름:", iris.feature_names[2:4]) +print("타깃 이름:", iris.target_names[:2]) +print("데이터 크기:", X.shape) + +# 2. 모델 학습 +svm_clf = SVC(kernel="linear", C=1) +svm_clf.fit(X, y) + +# 지원 벡터 출력 +print("지원 벡터(Support Vectors):") +print(svm_clf.support_vectors_) + +# 3. 결정 경계 시각화 +def plot_decision_boundary(svm_clf, X, y): + # 결정 경계 및 마진 계산 + x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 + y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 + xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100)) + + Z = svm_clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) + Z = Z.reshape(xx.shape) + + # 결정 경계 및 마진 시각화 + plt.contour(xx, yy, Z, colors='k', levels=[0], alpha=1, linewidths=2) # 결정 경계 + plt.contour(xx, yy, Z, colors='k', levels=[-1, 1], linestyles='dashed') # 마진 + + # 데이터 포인트 시각화 + plt.scatter(X[y == 0, 0], X[y == 0, 1], color='green', label='Setosa', marker='o') + plt.scatter(X[y == 1, 0], X[y == 1, 1], color='blue', label='Versicolor', marker='s') + + # 지원 벡터 표시 + plt.scatter(svm_clf.support_vectors_[:, 0], svm_clf.support_vectors_[:, 1], + facecolors='none', edgecolors='k', s=200, label='Support Vectors', marker='o') + plt.xlabel("Petal Length (cm)") + plt.ylabel("Petal Width (cm)") + plt.legend() + plt.grid() + +# 시각화 함수 호출 +plot_decision_boundary(svm_clf, X, y) +plt.show() diff --git a/week2-huiju/task3.py b/week2-huiju/task3.py new file mode 100644 index 0000000..47c99b7 --- /dev/null +++ b/week2-huiju/task3.py @@ -0,0 +1,64 @@ +# 필요한 라이브러리 임포트 +import numpy as np +import matplotlib.pyplot as plt +from sklearn.datasets import make_moons +from sklearn.model_selection import train_test_split, GridSearchCV +from sklearn.tree import DecisionTreeClassifier +from sklearn.ensemble import RandomForestClassifier +from sklearn.metrics import accuracy_score +from sklearn.utils import resample + +# 1. 데이터 준비 +X, y = make_moons(n_samples=10000, noise=0.4, random_state=42) +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) + +# 2. 결정 트리 하이퍼파라미터 최적화 +param_grid = { + 'max_depth': [3, 5, 6, 7, 8], # None 제거 + 'max_leaf_nodes': [10, 15, 17, 20], + 'min_samples_split': [2, 5, 10] +} + +dt = DecisionTreeClassifier(random_state=42) +grid_search = GridSearchCV(dt, param_grid, cv=5) +grid_search.fit(X_train, y_train) + +best_params = grid_search.best_params_ +best_model = grid_search.best_estimator_ + +# 최적의 하이퍼파라미터로 훈련된 모델의 테스트 정확도 확인 +test_accuracy_dt = accuracy_score(y_test, best_model.predict(X_test)) +print("Best Parameters:", best_params) +print("Single Tree Accuracy:", test_accuracy_dt) + +# 3. 랜덤 포레스트 구현 +n_subsets = 100 +subtree_accuracies = [] + +for _ in range(n_subsets): + # 랜덤하게 샘플링한 서브셋 생성 + X_sub, y_sub = resample(X_train, y_train, n_samples=len(X_train), random_state=_) + rf_tree = DecisionTreeClassifier(max_depth=best_params['max_depth'], + max_leaf_nodes=best_params['max_leaf_nodes'], + min_samples_split=best_params['min_samples_split']) + rf_tree.fit(X_sub, y_sub) + subtree_accuracies.append(accuracy_score(y_test, rf_tree.predict(X_test))) + +# 4. 다수결 앙상블 +ensemble_predictions = np.zeros((len(X_test), n_subsets)) + +for i in range(n_subsets): + X_sub, y_sub = resample(X_train, y_train, n_samples=len(X_train), random_state=i) + rf_tree = DecisionTreeClassifier(max_depth=best_params['max_depth'], + max_leaf_nodes=best_params['max_leaf_nodes'], + min_samples_split=best_params['min_samples_split']) + rf_tree.fit(X_sub, y_sub) + ensemble_predictions[:, i] = rf_tree.predict(X_test) + +# 다수결 방식으로 최종 예측 생성 +final_predictions = np.round(np.mean(ensemble_predictions, axis=1)) +ensemble_accuracy = accuracy_score(y_test, final_predictions) + +# 결과 출력 +print("Average Single Tree Accuracy:", np.mean(subtree_accuracies)) +print("Ensemble Accuracy:", ensemble_accuracy)