☑️ 노션
노션을 이용해서 과제발표를 준비하기로 마음을 먹었습니다.
하지만 노션을 사용해 본적이 없어
노션에 대해 알아보며 작성했고 어떤 부분을 알게 되었는지 말하려 합니다.
머신 / 딥 러닝 | Notion
타이타닉 생존자 예측(필수)
teamsparta.notion.site
타이타닉 데이터 셋의 특징 분석 까지 끝났다.
노션을 활용해서 알게 된 내용
- 노션을 메모장 등 본인이 확인하기 편하게 꾸밀 수 있다.
- 이미지, 토글, 파일 첨부 등 많은 노션의 기본 옵션이 존재한다.
- 커버, 이모지 등을 활용해서 꾸밀 수 있다.
- 레고형식으로 작성해서 가족성을 높일 수 있다.(일렬로 작성하거나 상하좌우로 토글들을 배치하며 작성 가능)
☑️ GITHUB
GITHUB의 공동 작업 환경에서 과제를 진행 하며 알게되고 궁금한 점을 정리하겟습니다.
1. github 공동 작업자 환경에서 잘못된 파일을업로드 한 경우
git rm --cached "레포 파일 삭제"
git rm 삭제할 파일 "파일 자체 삭제"
2. github의 파일을 가져올 때 자동으로 줄바꿈이 되지만 오류가 나기도 한다.
이를 방지하기 위한 명령어
git config --global core.autocrlf true"윈도우 줄바꿈 자동변환"
git config --global core.autocrlf false"자동변환 비활성화"
3. git 공동 작업 환경에서 파일을 자신의 로컬 환경에 가져오는 명령어
git branch -a 브랜치 이름 학인
git checkout branch-name 특정 브랜치로 이동
git pull origin branch-name 최신파일 가져오기
이떄 pull로 가져온 업데이트한 파일은 기존 로컬 환경에 있는 파일에 덮어씌어져 자동 업데이트가 된다.
☑️ 머신러닝 코드 분석
📚 분류모델-SVM
- 분류와 회귀분석
- 결정경계를 를 찾아 분류
- 목표는 마진을 최대화하면서 결정 초평면을 찾아 데이터 포인트를 정확하게 분류
마진: 두 클래스 간의 가장 가까운 데이터 포인트 사이의 거리
📚 데이터 로드 및 전처리
import numpy as np
import pandas as pd
# sklearn.datasets의 load_breast_canser데이터 import
from sklearn.datasets import load_breast_canser
from sklearn.model_selection import train_test_split
#평균을 0, 분산을 1로
from sklearn.preprocessiong import StandardScaler
# X에는 특징(feature) 데이터, y에는 타겟(target) 레이블이 저장됩니다.
data = load_breast_canser()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandradScaler()
# 학습 데이터를 기준으로 스케일을 맞추고(fit_transform), 학습 데이터에 변환 적용
X_train = scaler.fit_transform(X_train)
# 테스트 데이터는 이미 학습 데이터로 스케일이 맞춰졌으므로 transform만 적용
X_test = scaler.transform(X_test)
📚모델 학습
#SVC는 SVM알고리즘을 구현한 클래스
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
#학습
#데이터가 선형으로 분리가능한 경우 사용
# kelnel='linear'선형 커널을 사용해서 학습
model = SVC(kelnel='linear')
model.fit(X_train, y_train)
#예측
y_pred = model.predict(X_test)
#평가
#\n은 **줄바꿈(new line)**을 의미합니다. 즉, 출력할 때 다음 줄로 넘어가게 합니다.
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report: \n{classification_report(y_test, y_pred)}')
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")
📚 분류모델-KNN
- 분류와 회귀 분석
- 가장 가까운 이웃을 찾아 분류
- 새로운 데이터 포인트의 클래스 예측
📚 데이터 로드 및 전처리
import numpy as np
import pandas as pd
from sklearn.datas import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing impor StandardScaler
data = load_breast_cancer()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
📚모델 학습
# sklearn.neighbors의 KNeighborsClassifier를 import
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
#모델 생성 및 학습
# n_neighbors=5는 K값, 즉 한 데이터의 분류를 결정할 때 참고할 이웃 데이터의 개수
model = KNeighborsClassifier(n_neighors=5)
model.fit(X_train, y_train)
#예측
y_pred = model.predict(X_test)
#평가
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")
k인자에 얼마를 설정할지 결정하는 방법
1. k값은 홀수로 설정(클래스 간의 동점(tie)을 방지)
2. k값이 너무 작으면 과적합, 너무 크면 과소적합
3. 교차 검증 (Cross-Validation) 사용
4. 엘보우 방법 (Elbow Method)
여러 k값에 대해 정확도를 평가하고, 정확도가 급격하게 변화하는 구간을 찾아 k를 선택하는 방법
5. 데이터 크기에 따른 고려(데이터가 클수록 큰 k값, 작을수록 작은 k값)
=> 다양한 k값을 시도하면서, 교차 검증을 통해 각 k값에 대한 모델 성능을 평가하고, 그 중 가장 높은 성능을 보이는 k값을 선택
📚 분류모델-나이브베이즈
📚나이브베이즈
- 주어진 데이터 포인트가 특정 클래스에 속할 확률을 계산하여 분류
- 3가지 베이즈 정리를 기반으로 통계적 분류
- 가우시안 나이브베이즈: 특징들이 연속적이고 정규 분포를 따른다고 가정합니다. from sklearn.naive_bayes import GaussianNB
- 베르누이 나이브베이즈: 특징들이 이진수(0 또는 1)로 표현되는 경우 사용합니다. from sklearn.naive_bayes import BernoulliNB
- 멀티노미얼 나이브베이즈: 특징들이 다항 분포를 따르는 경우 사용합니다. from sklearn.naive_bayes import MultinomialNB
📚 데이터 로드 및 전처리
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
data = load_breast_cancer()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
📚모델 학습
#GaussianNB 연속형 피처들이 많은 경우에 사용 된다.
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, classification_report, confusion_metrix
model = GaussinaNB()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Metrix:\n{confusion_metrix(y_test, y_pre)}")
📚 분류모델 - 의사결정 나무
📚의사결정 나무
데이터 특징을 기준으로 의사결정 규칙을 만들고 분류나 회귀에 사용한다.
트리구조를 가지며 내부 노드는 데이터의 특징의 테스트, 가지(brach)는 결과, 리프노드(leaf)는 클래스 레이블을 나타낸다.
📚 데이터 로드 및 전처리
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 데이터 로드
data = load_breast_cancer()
X = data.data
y = data.target
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 데이터 스케일링
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
📚모델학습
# DecisionTreeClassifier의사결정 나무 분류 모델 import
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_metrix
#모델 생성 시 random_state를 설정한다.
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classifier Report:\n{classifier_report(y_test, y_pred)}")
print(f"Confusion Metrix:\n{confusion_metrix(y_test, y_pred)}")
모델생성에서 random_state를 설정하는가?
1. 결과의 재현성
random_state를 설정하면 무작위성에 대해 고정된 시드(seed)를 지정하는 것으로 모델을 동일한 조건에서 다시 실행할 때 항상 같은 결과를 얻게 된다.
2. 무작위성이 적용되는 상황
정보이득이나 지니계수를 가진 특성들이 여러개 있을 수 있다. 이때 어떤 특성으로 분할할지 무작위로 선택
최적화: 의사결정나무는 앙상블 기법, 특히 **랜덤 포레스트(Random Forest)**나 **엑스트라 트리(Extra Trees)**에서 무작위로 여러 나무를 구성할 때 사용됩니다. 이러한 무작위성을 제어하기 위해 random_state를 설정하는 것
3. 모델 비교
동일한 데이터셋에서 서로 다른 알고리즘 또는 설정을 비교할 때, 같은 무작위성 조건에서 실행하는 것이 중요합니다. 이를 통해 공정한 비교가 가능합니다.
📚 비지도 학습 - K-means clustering
📚K-means clustering
- 데이터를 k개의 군집(클러스터)으로 나누는 비지도 학습(레이블이 필요없으며, 유사성을 기반으로 군집 형성)
- 유사한 특성을 가진 데이터를 하나의 클러스터로 묶고, 서로 다른 특성을 가진 데이터를 다른 클러스터로 구분
- 클러스터 내의 데이터가 최대한 유사하고, 클러스터 간의 데이터는 서로 다르게 만드는 것이 목표
- 유클리드 거리를 사용해 유사성 측정
- 중심점: 데이터의 평균 위치
📚데이터 로드 및 전처리
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
# sklearn라이브러리의 cluster모듈에서 KMeans클래스 임포트
from sklearn.cluster import kMeans
# 데이터를 시각화 하기 위한 라이브러리 matplotlib의 pyplot 모듈을 plt로 임포트한다.
import matplotlib.pyplot as plt
# 시각화를 위한 고급 API제공, matplotlob과 호환(산점도, 히트맵 등의 시각화)
import seaborn as sns
data = pd.read_csv("Mall_Customer.csv")
# data에서 필요한 열만 선택하여 새로운 데이터프레임 생성
# Age: 고객의 나이
# Annual Income (k$): 고객의 연간 소득(천 달러 단위)
#Spending Score (1-100): 고객의 소비 점수 (1에서 100 사이)
data = data[['Age', 'Annual Income (k$)', Spending Score (1-100)']]
scaler = StandardScaler()
data_scaler.fit_transform(data)
📚모델 학습 및 군집화
#각 k값에 대해 K-Means 클러스터링 모델이 계산한 응집도를 저장하기 위한 리스트
inertia = []
#1개부터 10개의 군집으로 실행해 각 군집에 대해 inertia 값을 구할 예정
k = range(1, 11)
for k in K:
#KMeans 클래스의 인스턴스를 생성
# n_clusters=k는 군집 수를 현재 k값으로 설정
# random_state=42는 결과의 재현성을 위해 무작위 초기값을 고정
kmeans = KMeans(n_clusters=k, random_state=42)
#모델 학습(k개의 군집으로 나누며, inertia 값이 계산)
#data_scaled는 입력 데이터를 전처리하여 스케일링한 데이터셋
kmeans.fit(data_scaled)
# kmeans.inertia_은 현재 k값에서 K-Means 모델의 inertia값을 반환, 이 값을 리스트 inertia에 추가
inertia.append(kmeans.inertia_)
# 엘보우 그래프를 그릴 때 사용할 도화지(그래프의 크기를 너비 10, 높이 8로 지정)
plt.figure(figsize=(10, 8))
#x축에는 k값, y축에는 inertia값을 설정해 선 그래프를 그린다.
# bx-는 파란색(x축) 선을 의미하여 각 k에 대한 데이터를 시각화한다.
plt.plot(k, inertia, 'bx-')
#x축 레이블을 k, y축 레이블을 inertia로 설정
plt.xlable('k')
plt.ylabel('Inertia')
#그래프의 제목을 'Elbow Method For Optimal k'로 설정
plt.title('Elbow Method For Optimal k')
#그래프 화면 출력
plt.show()
# 앞서 엘보우 그래프를 통해 최적의 k 값이 5로 선택되었다고 가정하고, 군집 수가 5인 K-Means 모델을 다시 생성
kmeans = KMeans(n_cluster=5, random_state=42)
# k=5인 K-Means 모델을 data_scaled 데이터에 대해 학습(데이터가 5개의 군집으로 나누어진다.)
kmeans.fit(data_scaled)
# 각 데이터 포인트에 할당된 군집 번호를 data 데이터프레임에 새로운 열 'Cluster'로 추가
# kmeans.labels_는 학습된 K-Means 모델에서 각 데이터 포인트가 속하는 군집 번호를 반환
data['Cluster'] = kmeans.labels_
📚 비지도 학습 - 계층적 군집화
📚계층적 군집화
- 데이터포인트를 계층 구조로 그룹화
- 점진적 병합, 분할 군집 형성
- 병합 군집화: 각 데이터포인트를 개별 군집으로 시작하여, 가장 가까운 군집을 반복적으로 병합
- 분할 군집화: 모든 데이터포인트를 하나의 군집으로 시작하여, 반복적으로 가장 멀리 떨어진 군집을 분할
📚 데이터 로드 및 전처리
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
#병합 계층적 군집화를 구현하는 클래스
from sklearn.cluster import AgglomerativeClustering
#계층적군집화를 수행하고 그 결과를 덴드로그램으로 시각화 기능 제공
import scipy.cluster.hierarchy as sch
df = pd.read_csv('Mall_Customers.csv')
X = df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)"]]
scaled = StandardScaler()
X_scaled = scaler.fit_transfrom(X)
📚덴드로그램 생성
plt.figure(figsize=(10, 7))
dendrogram = sch.dendrogram(sch.linkage(X_scaled, method='ward'))
plt.title('Dendrogram')
plt.xlabel('Customers')
plt.ylabel('Euclidean distances')
plt.show()
📚계층적 군집화 모델 구현
# AgglomerativeClistering클래스의 인스턴스 생성
# n_clusters=5 데이터를 5개의 군집으로 나누겟다는 뜻
# metric='euclidean' 유클리드 거리를 사용하여 데이터 간의 거리를 계산
# linkage='ward' 워드 연결 방법을 사용한다.(군집 간의 분산을 최소화하는 방식으로 군집을 결합)
hc = AgglomerativeClistering(n_clusters=5, metric='euclidean', linkage='ward')
#X_scaled 데이터에 맞추어 학습하고, 각 데이터포인트에 대한 군집 번호를 예측
# fit_predict는 데이터를 학습
# X_scaled는 스케일링(표준화)된 데이터로, 계층적 군집화 모델의 입력 데이터
# y_hc에는 각 데이터가 할당된 군집 번호(라벨)이 저장
y_hc = hc.fit_predict(X_scaled)
plt.figure(figsize=(10, 7))
# 군집 1에 속하는 데이터 포인트들을 빨간색으로 산점도 그래프로 시각화
# X_scaled[y_hc == 0, 0]: y_hc == 0은 군집 1(라벨 0)에 속하는 데이터 포인트를 선택하는 조건입니다. X_scaled의 첫 번째 축(열 0, 즉 Age)을 선택하여 x축에 표시
# X_scaled[y_hc == 0, 1]: X_scaled의 두 번째 축(열 1, 즉 Annual Income)을 선택하여 y축에 표시
# s=100: 각 데이터 포인트의 크기를 100으로 설정합니다.
# c ='red': 빨간색으로 데이터를 표시합니다.
# label='Cluster 1': 군집 1의 라벨을 'Cluster 1'로 지정하여 범례에 표시할 때 사용됩니다.
plt.scatter(X_scaled[y_hc == 0, 0], X_scaled[y_hc == 0, 1], s=100, c='red', label='Cluster 1')
plt.scatter(X_scaled[y_hc == 1, 0], X_scaled[y_hc == 1, 1], s=100, c='blue', label='Cluster 2')
plt.scatter(X_scaled[y_hc == 2, 0], X_scaled[y_hc == 2, 1], s=100, c='green', label='Cluster 3')
plt.scatter(X_scaled[y_hc == 3, 0], X_scaled[y_hc == 3, 1], s=100, c='cyan', label='Cluster 4')
plt.scatter(X_scaled[y_hc == 4, 0], X_scaled[y_hc == 4, 1], s=100, c='magenta', label='Cluster 5')
plt.title('Clusters of customers')
plt.xlabel('Age')
plt.ylabel('Annual Income (k$)')
# 각 군집의 레이블을 그래프의 범례로 표시( 'Cluster 1', 'Cluster 2', 'Cluster 3', 'Cluster 4', 'Cluster 5'가 각각 해당 군집의 색상과 함께 표시)
plt.legend()
plt.show()
📚모델 평가
# silhouette_score는 군집화 모델의 성능을 평가하기 위해 사용
# 실루엣 점수는 -1에서 1 사이의 값을 가지며, 1에 가까울수록 군집화가 잘 된 것
from sklearn.metrics import silhouette_score
# 실루엣 점수 계산
# X_scaled 표준화된 입력 데이터
# y_hc: 군집화 결과로 각 데이터 포인트에 할당된 군집 레이블
silhouette_avg = silhouette_score(X_scaled, y_hc)
# 계산된 실루엣 점수를 출력
# f-string을 사용하여 Silhouette Score: {silhouette_avg} 형식으로 실루엣 점수를 화면에 출력
print(f'Silhouette Score: {silhouette_avg}')
'TIL' 카테고리의 다른 글
내일배움캠프 20일차 TIL + Netfilx리뷰 전처리 (1) | 2024.10.24 |
---|---|
내일배움캠프 19일차 TIL + 타이타닉 데이터 셋 생존자 예측 모델 (0) | 2024.10.23 |
내일배움캠프 17일 차 TIL + 머신러닝 코드 (4) | 2024.10.21 |
내일배움캠프 15일차 TIL + 딥러닝 (신경망, 어텐션, 자연어 처리) (3) | 2024.10.18 |
내일배움캠프 14일차 TIL + 딥러닝 (1) | 2024.10.17 |