2-1. Scikit-Learn 라이브러리
🔴 머신러닝 알고리즘을 구현한 오픈소스 라이브러리 중 하나
🔴 장점 : 일관되고 간결한 API, 문서화가 잘 되어 있음
🔴 알고리즘 : 파이썬 클래스 구현
🔴 데이터 셋 : Numpy 배열, Pandas DataFrame, SciPy 희소행렬을 사용할 수 있음
2-2. Scikit-Learn 데이터 표현 방식
🟠 특징 행렬 (Feature Matrix)
🔸 표본(sample)은 데이터셋이 설명하는 개별 객체를 나타냄
🔸 특징(feature)은 각 표본을 연속적인 수치값, 부울값, 이산값으로 표현하는 개별 관측치를 의미
🔸 표본 ➡ 행렬의 행
🔸 행의 개수 ➡ n_samples
🔸 특징(feature) ➡ 행렬의 열
🔸 열의 개수 ➡ n_features
🔸 관례적으로 특징행렬은 변수 X에 저장
🔸 [n_samples, n_features] 형태의 2차원 배열 구조를 사용 (주로 Numpy 배열, Pandas Data Frame, SciPy 희소행렬을 사용)
2-2. Scikit-Learn 데이터 표현 방식
🟠 대상 벡터 (Target Vector)
🔸 연속적인 수치값, 이산 클래스/레이블을 가짐
🔸 길이 ➡ n_samples
🔸 관례적으로 대상 벡터는 변수 y에 저장
🔸 1차원 배열 구조를 사용(주로 Numpy 배열, Pandas Series를 사용)
🔸 특징 행렬로 부터 예측하고자 하는 값의 벡터
🔸 종속 변수, 출력 변수, 결과 변수, 반응 변수라고 함
😃 특징행렬과 대상벡터(예측값)의 데이터 레이아웃의 길이는 같아야 함
🔹 코딩
## Numpy 배열을 이용한 특징 행렬(X), 대상 벡터(y)의 생성
# 넘파이 라이브러리 불러오기
import numpy as np
# seed : 난수생성 (난수값 일치)
rs = np.random.RandomState(10)
x = 10 * rs.rand(5)
y = 2 * x - 1 * rs.rand(5)
x.shape, y.shape
# 결과
# ((5,), (5,))
# shape 변경
# 1차원 배열구조에서 2차원 배열구조로 변화
X = x.reshape(-1, 1)
X.shape
# 결과
# (5, 1)
## Pandas DataFrame을 이용한 특징 행렬(X), 대상 벡터(y)의 생성
# 시각화 라이브러리
import seaborn as sns
iris = sns.load_dataset("iris")
iris.info()
# feature과 레이블 구분
# 입력 데이터에 의해 species(종) 결정
iris.head()
## feature matrix와 target vector를 나누는 작업 필요
# 열을 drop 시킴
X = iris.drop("species", axis=1)
X.shape
# 결과
# 행과 열 (150, 4)
y = iris["species"]
y.shape
# 결과
# (150,)
## Bunch 객체를 이용한 특징 행렬(X), 대상 벡터(y)의 생성
from sklearn.datasets import load_iris
iris = load_iris()
type(iris)
# 결과
# sklearn.utils.Bunch
iris.keys()
# 결과
# dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
iris.feature_names
# 결과
# ['sepal length (cm)',
# 'sepal width (cm)',
# 'petal length (cm)',
# 'petal width (cm)']
# 슬라이싱 이용 [start: end: step]
iris.data[:5]
# 결과
# array([[5.1, 3.5, 1.4, 0.2],
# [4.9, 3. , 1.4, 0.2],
# [4.7, 3.2, 1.3, 0.2],
# [4.6, 3.1, 1.5, 0.2],
# [5. , 3.6, 1.4, 0.2]])
iris.data.shape
# 결과
# (150, 4)
iris.target
# 1차원 배열
iris.target.shape
# 결과
# (150,)
iris.target_names
# 결과
# array(['setosa', 'versicolor', 'virginica'], dtype='<U10')
# X : 특징행렬, Y : 대상행렬
X = iris.data
y = iris.target
X = iris.data
y = iris.target
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X,y)
# 결과
# KNeighborsClassifier(n_neighbors=1)
y_pred = knn.predict(X)
# 실제값과 예측값이 같음
np.mean(y == y_pred)
# 결과
# 1.0
🟢 훈련 데이터와 테스트 데이터의 분리
◽ 머신러닝 모델을 만들 때, 사용한 데이터는 모델의 성능측정용으로 사용하지 않음 ➡ 일반화 문제
◽ 훈련 데이터 : 머신러닝 모델을 만들 목적으로 사용
◽ 테스트 데이터 : 머신러닝 모델이 잘 작동하는지를 측정할 목적으로 사용
◽ Scikit-learn의 train_test_split함수를 주로 사용 (기본적으로 훈련용 75%, 테스트용 25% 구성)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=25)
X_train.shape, y_train.shape, X_test.shape, y_test.shape
# 결과
# ((120, 4), (120,), (30, 4), (30,))
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
# 결과
# KNeighborsClassifier(n_neighbors=1)
## 테스트 데이터를 이용한 모델의 성능 측정
y_pred = knn.predict(X_test)
y_pred
# 결과
# array([0, 2, 2, 1, 2, 1, 2, 0, 1, 1, 0, 0, 0, 1, 0, 1, 2, 2, 1, 1, 1, 1,
# 1, 0, 0, 2, 1, 2, 2, 0])
# 실제값과 예측값
np.mean(y_test == y_pred)
# 결과
# 0.9
knn.score(X_test, y_test)
# 결과
# 0.9
# accuracy_score 분류 문제
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)
# 결과
# 0.9