파이썬_머신러닝02

서유리·2022년 4월 3일
1
post-thumbnail

02-Scikit-Learn 기초와 데이터 표현방식 학습(1)

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

02-훈련데이터와 테스트 데이터(2)

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
profile
best of best

0개의 댓글

관련 채용 정보