1. 군집분석
1) KMC
* 데이터 탐색
* 데이터 분할 / 모형 학습 객체 생성
* 클러스터 라벨 넘버 확인
* 클러스터 넘버에 색깔 부여해서 시각화
# %%
# 시각화
df.plot(kind="scatter", x="Fresh", y="Milk", c="cluster_no",cmap = "hsv")
df.plot(kind="scatter", x="Grocery", y="Frozen", c="cluster_no",cmap = "hsv")
* 엘보 방법
# %%
# 엘보 방법
d = []
for i in range(1,10+1):
kmc_i = cluster.KMeans(n_clusters=i, random_state=1)
kmc_i.fit(X)
d.append(kmc_i.inertia_)
plt.plot(range(1,10+1), d, marker="o")
2) 실루엣 점수 (최적의 K값을 찾는 방법)
* for 문 생성
# %%
# 실루엣 점수
# 최적의 k값을 찾는 방법
from sklearn.metrics import silhouette_score
for i in range(2, 5+1):
kmc_i = cluster.KMeans(n_clusters=i, random_state=1)
kmc_i.fit(X)
pred = kmc_i.labels_
print("K = ", i)
print(silhouette_score(X, pred, metric="euclidean"))
* 클러스터 알고리즘 생성 // 데이터 확인
# %%
# 최종 모델 k = 2
kmc = cluster.KMeans(n_clusters=2, random_state=1)
kmc.fit(X)
# %%
cluster_label = kmc.labels_
df["cluster_no"] = cluster_label
df.head()
* 요약 통계
# %%
grouped = df.iloc[:,2:9].groupby("cluster_no")
print(grouped.describe())
print(grouped.mean())
2. 이론 - 선형회귀와 로지스틱 회귀, 시그모이드 함수의 식
1) 정리 1
* 참고 (선형회귀와 로지스틱 회귀의 차이)
종속 변수 0, 1이 있다 가정할 때
1 : 성공 // P
0 : 실패 // 1-P
오즈비 공식 : OR = P/1-P
2) 시그모이드 함수의 식
위 함수 꼭 기억하기!!!
* 식풀이
3. 실습 - 로지스틱 회귀 (DT)
1) DT
* 데이터 불러오기 / 전처리
# %%
# 3-3 Decision Tree
import pandas as pd
import numpy as np
# [Step 1] 데이터 준비/기본 설정
# Breast Cancer 데이터셋 가져오기(출처: UCI MI, Repository)
uci_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/\
breast-cancer-wisconsin/breast-cancer-wisconsin.data'
df = pd.read_csv(uci_path, header=None)
# 열 이름 지정
df.columns = ["id","clump","cell_size","cell_shape","adhesion","epithlial",
"bare_nuclei", "chromatin","normal_nucleoli", "mitoses", "class"]
# Ipython 디스플레이 설정 - 출력할 열의 개수 한도 늘리기
pd.set_option("display.max_column",15)
# [Step 2] 데이터 탐색
# 데이터 살펴보기
print(df.head())
# 데이터 자료형 확인
print(df.info())
# 데이터 통계 요약 정보 확인
df.describe()
# 유방암 데이터
df[df["bare_nuclei"]=="?"]
df.bare_nuclei.replace("?",np.nan,inplace=True) #?을 np.nan으로 변경
df.dropna(subset=["bare_nuclei"],axis=0,inplace=True)
df.bare_nuclei= df.bare_nuclei.astype("int")
* 데이터 분할 및 표준화
# %%
## 훈련,테스트 데이터 분할
## 독립변수
X = df.iloc[:,1:10]
## 종속변수
y=df["class"]
#독립 변수 열 이름 저장 => 의사결정나무 그릴 때 사용 예정
colname = X.columns
## 표준화
ss =preprocessing.StandardScaler()
X= ss.fit(X).transform(X)
# train data와 test data로 구분 (7:3 비율)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=10)
print("train data: ", X_train.shape)
print("test data: ", X_test.shape)
* 모형 학습
# %%
# 로지스틱 회귀 모델
from sklearn.linear_model import LogisticRegression
# 모형 객체
logit = LogisticRegression()
# 모형 학습
logit.fit(X_train,y_train)
# 모형 평가
y_hat = logit.predict(X_test)
print(y_test[:5])
print(y_hat[:5])
print("회귀계수 : ",logit.coef_)
print("절편 : ",logit.intercept_)
* 모형 평가
# %%
from sklearn import metrics
logit_cm = metrics.confusion_matrix(y_test,y_hat)
logit_cm
# %%
logit_cm_report = metrics.classification_report(y_test,y_hat)
print(logit_cm_report)
2) 전체 나무 성장
* 데이터 불러오기 / 전처리
# %%
# 전체 나무 성장
import pandas as pd
import numpy as np
# [Step 1] 데이터 준비/기본 설정
# Breast Cancer 데이터셋 가져오기(출처: UCI MI, Repository)
uci_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/\
breast-cancer-wisconsin/breast-cancer-wisconsin.data'
df = pd.read_csv(uci_path, header=None)
# 열 이름 지정
df.columns = ["id","clump","cell_size","cell_shape","adhesion","epithlial",
"bare_nuclei", "chromatin","normal_nucleoli", "mitoses", "class"]
# Ipython 디스플레이 설정 - 출력할 열의 개수 한도 늘리기
pd.set_option("display.max_column",15)
# [Step 2] 데이터 탐색
# 데이터 살펴보기
print(df.head())
# 데이터 자료형 확인
print(df.info())
# 데이터 통계 요약 정보 확인
df.describe()
* 데이터 전처리 // 데이터 분할
# %%
# 유방암 데이터
df[df["bare_nuclei"]=="?"]
df.bare_nuclei.replace("?",np.nan,inplace=True) #?을 np.nan으로 변경
df.dropna(subset=["bare_nuclei"],axis=0,inplace=True)
df.bare_nuclei= df.bare_nuclei.astype("int")
df.describe()
# %%
## 훈련,테스트 데이터 분할
## 독립변수
X = df.iloc[:,1:10]
## 종속변수
y=df["class"]
# train data와 test data로 구분 (7:3 비율)
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(X,y,
test_size=0.3,random_state=10)
print("train data: ", train_input.shape)
print("test data: ", test_input.shape)
## 표준화
ss =preprocessing.StandardScaler()
train_ss= ss.fit(train_input).transform(train_input)
test_ss = ss.fit(test_input).transform(test_input)
* 의사결정나무 알고리즘
# %%
# 의사결정나무 - 전체나무성장
from sklearn import tree
# 모형 객체
dt = tree.DecisionTreeClassifier()
# 모형 학습 - 표준화 데이터
dt.fit(train_ss,train_target)
* 과대적합 / 과소적합
# %%
# 훈련 점수
print(dt.score(train_ss, train_target))
# 테스트 점수
print(dt.score(test_ss,test_target))
# 과대적합이 되어 있는 모델
* 과대적합 / 과소적합
* 가지치기
# %%
### 가지치기
# 과대적합 해결 방법 - 나무의 깊이 제한
# 의사결정나무 - 전체나무 성장
from sklearn import tree
# 모형 객체
dt = tree.DecisionTreeClassifier(max_depth=3)
# 모형 학습 - 표준화 데이터
dt.fit(train_ss,train_target)
# 훈련 점수
print(dt.score(train_ss, train_target))
# 테스트 점수
print(dt.score(test_ss,test_target))
* 시각화
* 표준화 없이 시각화
* 특성 중요도
# %%
print(X.columns.values)
print(dt.feature_importances_)
4. 검증데이터 (교차 검증)
1) 교차 검증
훈련 6 : 검증 2 : 테스트 2 비율로 적용
* 데이터 준비 ~ 데이터 탐색 ~ 데이터 전처리 (같은 과정)
# %%
import pandas as pd
import numpy as np
# [Step 1] 데이터 준비/기본 설정
# Breast Cancer 데이터셋 가져오기(출처: UCI MI, Repository)
uci_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/\
breast-cancer-wisconsin/breast-cancer-wisconsin.data'
df = pd.read_csv(uci_path, header=None)
# 열 이름 지정
df.columns = ["id","clump","cell_size","cell_shape","adhesion","epithlial",
"bare_nuclei", "chromatin","normal_nucleoli", "mitoses", "class"]
# Ipython 디스플레이 설정 - 출력할 열의 개수 한도 늘리기
pd.set_option("display.max_column",15)
# [Step 2] 데이터 탐색
# 데이터 살펴보기
print(df.head())
# 데이터 자료형 확인
print(df.info())
# 데이터 통계 요약 정보 확인
df.describe()
# %%
# 유방암 데이터
df[df["bare_nuclei"]=="?"]
df.bare_nuclei.replace("?",np.nan,inplace=True) #?을 np.nan으로 변경
df.dropna(subset=["bare_nuclei"],axis=0,inplace=True)
df.bare_nuclei= df.bare_nuclei.astype("int")
df.describe()
* 데이터 분할
# %%
## 훈련,테스트 데이터 분할
## 독립변수
X = df.iloc[:,1:10]
## 종속변수
y=df["class"]
# train data와 test data로 구분 (7:3 비율)
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(X,y,
test_size=0.3,random_state=10)
print("train data: ", train_input.shape)
print("test data: ", test_input.shape)
# %%
# 훈련 검증 데이터 분할
train_sub_input, val_input, train_sub_target, val_target = train_test_split(
train_input,train_target,test_size=0.2, random_state=10)
print(train_sub_input.shape,val_input.shape)
* 모형 객체
# %%
# 모형 객체
dt = tree.DecisionTreeClassifier(max_depth=3)
# 모형 학습 - 훈련 데이터 382
dt.fit(train_sub_input,train_sub_target)
# 모형 평가 - 검증 데이터 96
# 훈련 점수
print(dt.score(train_sub_input, train_sub_target))
# 검증 점수
print(dt.score(val_input, val_target))
* 교차 검증, 스코어 확인
# %%
# 교차검증
from sklearn.model_selection import cross_validate
scores = cross_validate(dt, train_input, train_target)
print(scores)
# %%
scores["test_score"]
# %%
import numpy as np
np.mean(scores["test_score"])
2) 하이퍼 파라미터
* 이론
모델 파라미터 : ML 모델이 찾아주는 값 예) 계수
하이퍼 파라미터 : ML 모델 X
= 사용자 지정 파라미터
튜닝 방법 1. 모델 기본 값
2. 하이퍼파라미터 변경
3. AutoML
튜닝 반복문 : 반복문 구현 -> "그리드 서치"
- 교차 검증도 자동으로 해준다는 장점이 있음
* 하이퍼 파라미터 튜닝 - 그리드 서치 ~ 알고리즘 생성
# %%
### 하이퍼파라미터 튜닝
# 매개변수 조정을 통해서 최적 모델 찾는 과정
# 그리드서치
from sklearn.model_selection import GridSearchCV
# 노드 분할하기 위한 불순도 감소 최소량
params = {"min_impurity_decrease":[0.0001,0.0002,0.0003,0.0004,0.0005]}
# %%
from sklearn.tree import DecisionTreeClassifier
gs = GridSearchCV(tree.DecisionTreeClassifier(), params)
# %%
# 파라미터 5개 * 5 폴드 = 25번 반복 = 25개 모델
gs.fit(train_input, train_target)
* 하이퍼 파라미터 튜닝2 - 알고리즘 생성
# %%
### 하이퍼파라미터 튜닝
# 매개변수 조정을 통해서 최적 모델 찾는 과정
# 그리드서치
from sklearn.model_selection import GridSearchCV
# 노드 분할하기 위한 불순도 감소 최소량
params = {"min_impurity_decrease":[0.0001,0.0002,0.0003,0.0004,0.0005],
"max_depth": range(3,10+1,1),
"min_samples_split": range(2,100,5)} # 모델 350개 생성
# %%
from sklearn.tree import DecisionTreeClassifier
gs = GridSearchCV(tree.DecisionTreeClassifier(), params)
# %%
# 파라미터 5개 * 5 폴드 = 25번 반복 = 25개 모델
gs.fit(train_input, train_target)
# %%
# %%
# 최적의 모델
dt = gs.best_estimator_
print(dt.score(train_input, train_target))
print(dt.score(test_input,test_target))
* 핵심
- 시그모이드 함수식 이해하고 기억하기
* 코랩 링크 (생성한 계정으로 로그인하기)
* 오늘 실습 링크 (0503.py)
* 학습 자료
'배운 책들 정리 > 파이썬 머신러닝 판다스 데이터분석' 카테고리의 다른 글
파이썬 머신러닝 판다스 데이터 분석 7-3 질문 - 머신러닝 데이터 분석, 로지스틱 회귀, 교차검증 (0) | 2023.05.03 |
---|---|
파이썬 머신러닝 판다스 데이터 분석 6,7 - 데이터프레임의 다양한 응용, 머신러닝 데이터 분석 (0) | 2023.05.01 |
파이썬 머신러닝 판다스 데이터 분석 5,6 - 데이터 사전 처리, 데이터프레임의 다양한 응용 (0) | 2023.04.28 |
파이썬 머신러닝 판다스 데이터 분석 4_3, 5 - 시각화, 데이터 사전 처리 (0) | 2023.04.27 |
파이썬 머신러닝 판다스 데이터 분석 4_2 - 시각화 (0) | 2023.04.26 |