일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 문제풀이
- 조합
- numpy
- maplotlib
- Slicing
- 리스트
- matplotlib
- 기계학습
- 재귀함수
- plt
- Folium
- tree.fit
- 파이썬
- 머신러닝
- python
- barh
- 순열
- 통계학
- pandas
- Machine Learning
- INSERT
- SQL
- 스터디노트
- pandas 메소드
- 자료구조
- 등비수열
- 등차수열
- DataFrame
- MacOS
- pandas filter
Archives
- Today
- Total
코딩하는 타코야끼
[스터디 노트] Week12_1일차 [1 ~ 3] - ML 본문
728x90
반응형
1. 머신러닝이란
📍 머신러닝(machine learning)
- 컴퓨터가 데이터를 통해 학습하여 특정 작업을 수행하는 능력을 개선하는 알고리즘과 기술의 집합입니다.
- 전통적인 프로그래밍에서는 문제를 해결하기 위해 직접 명령어를 작성하는 반면, 머신러닝에서는 대량의 데이터와 알고리즘을 사용하여 패턴을 찾아내고, 그 결과로 예측, 분류, 군집화 등의 작업을 수행합니다.
🔌 지도학습 (Supervised Learning)
- 입력 데이터와 해당 데이터에 대한 목표 또는 라벨이 주어집니다.
- 알고리즘은 주어진 입력에서 원하는 출력을 예측하는 방법을 학습합니다. 예를 들어, 스팸 메일 필터링이나 이미지 분류와 같은 작업에서 사용됩니다.
🔌 비지도학습 (Unsupervised Learning)
- 입력 데이터만 주어지고 목표 또는 라벨이 주어지지 않습니다.
- 알고리즘은 데이터의 구조나 패턴을 찾아냅니다. 예를 들어, 군집화나 차원 축소와 같은 작업에서 사용됩니다.
🔌 강화학습 (Reinforcement Learning)
- 에이전트(agent)가 환경과 상호작용하면서 보상을 최대화하는 행동을 학습합니다. 예를 들어, 게임 플레이나 로봇 제어와 같은 작업에서 사용됩니다.
2. 데이터관찰
⚡️ 데이터 보기
from sklearn.datasets import load_iris
iris = load_iris()
iris.keys()
>>>
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
iris["target"] # 0번 라벨은 setosa, 1번은 versicolor, 2번은 virginica
>>>
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
⚡️ 종류 라벨 추가
import pandas as pd
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df["species"] = iris.target
df.head()
⚡️ 꽃입 세로 길이(sepal length)
plt.figure(figsize=(12, 6))
sns.boxplot(x="sepal length (cm)", y="species", data=df, orient="h") # orient
⚡️ 꽃입 가로 길이(sepal width)
plt.figure(figsize=(12, 6))
sns.boxplot(x="sepal width (cm)", y="species", data=df, orient="h") # orient
⚡️ 꽃받침 가로 길이(petal length)
plt.figure(figsize=(12, 6))
sns.boxplot(x="petal length (cm)", y="species", data=df, orient="h") # orient
⚡️ 꽃받침 가로 길이(petal width)
plt.figure(figsize=(12, 6))
sns.boxplot(x="petal width (cm)", y="species", data=df, orient="h") # orient
⚡️ pairplot으로 확인
sns.pairplot(df,
vars=["petal length (cm)", "petal width (cm)"],
hue="species", height=4, palette="Set2")
⚡️ 시각화 분석
- petal length이 2.5 보다 작으면 다 Setosa 다.
- petal length이 2.5 보다 크고 petal width가 1.6 이하면 Versicolor
- petal lengthdl 2.5 보다 크고 petal width가 1.6 이상이면 Virginica
3. Decision Tree
📍 Decision Tree의 분할 기준(Split Criterion)
🔌 엔트로피 개념
- 열역학의 용어로 물질의 열적 상태를 나타내는 물리 량의 단위 중 하나. 무질서의 정도를 나타냄
- 1948년 엔트로피 개념에서 힌트를 얻어 확률 분포의 무질서도나 불확실성
- 혹은 정보 부담 정도를 나타내는 정보 엔트로피 개념을 클로드 섀넌이 고안함
- entropy : 얼마만큼의 정보를 담고 있는가? 또한, 무질서도(disorder)를 의미, 불확실성(uncertainty)를 나타내기도 함
- p는 해당 데이터가 해당 클래스에 속할 확률이고 위 식을 그려보면 다음과 같다
- 어떤 확률 분포로 일어나는 사건을 표현하는 데 필요한 정보의 양이며
- 이 값이 커질수록 확률 분포의 불확실성이 커지며 결과에 대한 예측이 어려워짐
import numpy as np
p = np.arange(0.001, 1, 0.001)
plt.grid()
plt.title("$-p \\log_{2}{p}$")
plt.plot(p, -p*np.log2(p))
4. Scikit Learn
- 2007년 구글 썸머 코드에서 처음 구현
- 현재 파이썬에서 가장 유명한 기계 학습 오픈 소스 라이브러리
🔌 모델 정의
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(random_state=0)
🔌 모델 학습
tree.fit(iris.data[:, 2:], iris.target)
🔌 모델 예측
from sklearn.metrics import accuracy_score
y_pred_tr = tree.predict(iris.data[:, 2:])
y_pred_tr
>>>
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
🔌 모델 정확도
accuracy_score(iris.target, y_pred_tr)
>>>
0.9933333333333333
5. 과적합(overfitting)
📍 지도 학습
- 학습 대상이 되는 데이터에 정답(label)을 붙여서 학습 시키고
- 모델을 얻어서 완전히 새로운 데이터에 모델을 사용해서 “답”을 얻고자 하는 것
📍 Tree model visualization
from sklearn.tree import plot_tree
plt.figure(figsize=(12, 8))
plot_tree(tree)
📍 결졍 경계 확인
from mlxtend.plotting import plot_decision_regions
plt.figure(figsize=(14, 8))
plot_decision_regions(X=iris.data[:, 2:], y=iris.target, clf=tree, legend=2)
plt.show()
❗️Accuracy가 높다고? 믿을 수 있는지 의심하기
- Acc가 높게 나왔다고 해도 좀 더 들여다 볼 필요가 당연히 있다.
- 저 경계면은 올바른 걸까?
- 저 결과는 내가 가진 데이터를 벗어나서 일반화할 수 있는 걸까?
- 어차피 얻은(혹은 구한) 데이터는 유한하고 내가 얻은 데이터를 이용해서 일반화를 추구하게 된다.
- 이때 복잡한 경계면은 모델의 성능을 결국 나쁘게 만든
6. 데이터분리
- 확보한 데이터 중에서 모델 학습에 사용하지 않고 빼둔 데이터를 가지고 모델을 테스트한다.
from sklearn.model_selection import train_test_split
X = iris.data[:, 2:]
y = iris.target
# X, y(전체 데이터셋)을 Train dataset 과 Test dataset으로 분리.
X_train, X_test, y_train, y_test = train_test_split(X, # 전체데이터셋 중 Features, input
y, # 전체데이터셋 중 Labels, output(target)
test_size=0.2,# (20%) // 전체중 test set의 비율 (기본값: 0.25)
stratify=y, # 전체 데이터셋의 출력 클래스의 비율과 동일한 비율로 나눠지도록 한다.분류 Dataset을 나눌때 필수, (회귀는 하지 않음.)
shuffle=True, # 데이터셋을 나누기 전에 섞는지(랜덤) 여부: True - 섞는다.(기본값), False - 안 섞는다.
random_state=0 # random seed 값.
)
X_train.shape
>>>
(120, 2)
❗️ 훈련용 / 테스트용이 잘 분리 되었을까?
np.unique(y_test, return_counts=True)
>>>
(array([0, 1, 2]), array([10, 10, 10]))
📍 모델 학습, 예측 및 추론
tree = DecisionTreeClassifier(random_state=0)
tree.fit(X_train, y_train)
plot_tree(tree)
pred_train = tree.predict(X_train)
# 예측
acc = accuracy_score(y_train, pred_train)
acc
>>>
0.9916666666666667
⚡️ 시각화
from mlxtend.plotting import plot_decision_regions
plt.figure(figsize=(14, 8))
plot_decision_regions(X=X_train, y=y_train, clf=tree, legend=2)
plt.show()
📍추론 활용기술 - zip과 언패킹
# zip
list1 = ["a", "b", "c"]
list2 = [1, 2, 3]
pairs = [pair for pair in zip(list1, list2)]
pairs
>>>
[('a', 1), ('b', 2), ('c', 3)]
dict(pairs)
>>>
{'a': 1, 'b': 2, 'c': 3}
⚡️ 언패킹
x , y = zip(*pairs)
print(x)
print(y)
>>>
('a', 'b', 'c')
(1, 2, 3)
반응형
'zero-base 데이터 취업 스쿨 > 스터디 노트' 카테고리의 다른 글
[스터디 노트] Week12_3일차 [6 ~ 7] - ML (0) | 2023.10.11 |
---|---|
[스터디 노트] Week12_2일차 [4 ~ 5] - ML (1) | 2023.10.11 |
[스터디 노트] Week10_3일차 [기본] - 통계학 (1) | 2023.09.11 |
[스터디 노트] Week10_2일차 [기본] - 통계학 (0) | 2023.09.11 |
[스터디 노트] Week10_1일차 [기본] - 통계학 (2) | 2023.09.11 |