본문 바로가기

배운 책들 정리/파이썬 머신러닝 판다스 데이터분석

파이썬 머신러닝 판다스 데이터 분석 7-3 - 머신러닝 데이터 분석 - 시그모이드 함수의 식, 로지스틱 회귀, 교차검증

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

 

* 참고 (선형회귀와 로지스틱 회귀의 차이)

 

파이썬 머신러닝 판다스 데이터 분석 7 질문 - 머신러닝 데이터 분석

1. 선형회귀와 로지스틱 회귀분석의 차이점과 문제점을 알려줘 선형회귀와 로지스틱 회귀분석의 차이점은 크게 세 가지가 있습니다. 종속 변수의 형태 선형회귀는 연속형 변수를 예측하는데 사

gurobig.tistory.com

 

종속 변수 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))

 

 

* 핵심

- 시그모이드 함수식 이해하고 기억하기

 

 

 

* 코랩 링크 (생성한 계정으로 로그인하기)

 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

* 오늘 실습 링크 (0503.py)

 

 

guromd1

 

guromd1.blogspot.com

 

* 학습 자료

 

 

기계학습(Machine Learning) — 실무 데이터 분석 2 documentation

Docs » 기계학습(Machine Learning) View page source 기계학습(Machine Learning) 기계학습이란 특정한 응용 영역에서 발생하는 데이터(경험)를 이용하여 높은 성능으로 문제를 해결하는 컴퓨터 프로그램을 만

compmath.korea.ac.kr

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST