2022.03.07 월
numpy
numpy 배열 : scikit-learn의 기본 데이터 구조 과학 계산 다차원 배열, 선형 대수 연산, 푸리에 변환, 유사 난수 생성기
import numpy as np
x = np.array([[1,2,3],[4,5,6]])
print("x:\\n",x)
scipy scikit-learn 알고리즘 구현시 함수 사용
spicy.sparse - 희소 행렬 기능 제공 * 과학 계산용 함수 고성능 선형 대수, 함수 최적화, 신호 처리, 특수한 수학 함수, 통계 분포
from scipy import sparse
# eye 대각선 원소만 1, 나머지 0
eye = np.eye(4) # (4by4)
print("numpy 배열:\\n",eye)
# numpy배열 -> CSR포맷 scipy희박행렬
# (CSR compressed sparse row 행 인덱스 압축 저장)
sparse_matrix = sparse.csr_matrix(eye)
print("\\nscipy의 csr행렬:\\n",sparse_matrix)
# 희소 행렬 직접 만들기
data = np.ones(4)
row_indices = np.arange(4)
col_indices = np.arange(4)
# COO포맷 희소행렬 (coordinate system : 좌표계 - 별도 좌표로 전달)
eye_coo = sparse.coo_matrix((data, (row_indices,col_indices)))
print("\\ncoo표현:\\n",eye_coo)
matplotlib 과학 계산용 그래프 선 그래프, 히스토그램, 산점도 지원
%matplotlib inline
import matplotlib.pyplot as plt
# -10에서 10까지 100개 간격으로 나뉘어진 배열을 생성
x = np.linspace(-10, 10, 100)
# 사인 함수를 사용하여 y 배열을 생성
y = np.sin(x)
# plot 함수는 한 배열의 값을 다른 배열에 대응해서 선 그래프 그리기
# 마커x표시
plt.plot(x,y,marker="x")
pandas 데이터 처리, 분석 테이블 구조를 기반으로 만들어짐 numpy와 달리 각 열 타입 달라도 OK 다양한 데이터베이스(sql, excel, csv)에서 데이터를 읽어들일 수 있음 < 나중에 궁금해지면 ‘파이썬 라이브러리를 활용한 데이터 분석’ 책 참고하기 >
import pandas as pd
# 데이터셋 생성
data = {'Name': ["john", "Anna", "Peter","Linda"],
'Location': ["new york", "paris", "berlin", "London"],
'Age':[24,13,53,33]
}
# 테이블 만들기
data_pandas = pd.DataFrame(data)
# 예쁘게 출력
display(data_pandas)
# 질의
display(data_pandas[data_pandas.Age >30])
mglearn 이 책을 위해 만든 유틸리티 함수 간단하게 그림을 그리거나 필요한 데이터를 바로 불러들일 때 사용
기본 임포트 라이브러리
from IPython.display import display
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
!pip install mglearn
import mglearn # github clone
데이터 포인트 : 붓꽃 1개 → 기대 출력 : 꽃의 품종 (결과값 : 레이블)
from sklearn.datasets import load_iris
iris_dataset = load_iris()
# iris 객체 = bunch 클랙스 객체 (딕셔너리와 유사)
print("iris_dataset의 키:\\n",iris_dataset.keys())
# dataset의 간략한 설명
print(iris_dataset['DESCR'][:193] + "\\n...")
# 붓꽃 품종 이름 문자열 배열
print("타깃의 이름:",iris_dataset['target_names'])
# 각 특성 설명 문자열 리스트
print("특성의 이름:",iris_dataset['feature_names'])
# 데이터 타입
print("data type:",type(iris_dataset['data']))
# 데이터 크기
print("data size:",iris_dataset['data'].shape)
# 처음 다섯 행 샘플의 **특성값**
print("data의 처음 다섯행:", iris_dataset['data'][:5])
# target type
print("target type:",type(iris_dataset['target']))
# target size
print("target size:",iris_dataset['target'].shape)
# target (0은 s, 1은 ver, 2는 vi)
print("target:\\n",iris_dataset['target'])
# 결과
iris_dataset의 키:
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
.. _iris_dataset:
Iris plants dataset
--------------------
**Data Set Characteristics:**
:Number of Instances: 150 (50 in each of three classes)
:Number of Attributes: 4 numeric, pre
...
타깃의 이름: ['setosa' 'versicolor' 'virginica']
특성의 이름: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
data type: <class 'numpy.ndarray'>
data size: (150, 4)
data의 처음 다섯행: [[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]]
target type: <class 'numpy.ndarray'>
target size: (150,)
target:
[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]
성능 측정 모델 만들 때 사용한 데이터 평가에 사용 X → 새로운 데이터를 모델에 적용해야 함 → 우리가 가진 데이터 / 2 groups ⇒ 훈련 데이터(training set) + 테스트 데이터(test set)
X : 데이터 (2차원 배열 = 행렬)
y : 레이블 (1차원 배열 = 벡터)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
iris_dataset['data'], iris_dataset['target'], random_state=0
)
# random_state = 0 난수 초깃값 고정 - 항상 같은 결과로 출력됨
# X_train : 75%, X_test : 25%
print("X_train 크기:", X_train.shape)
print("y_tarin 크기:", y_train.shape)
print("X_test 크기:", X_test.shape)
print("y_test 크기:", y_test.shape)
데이터 확인 특이값, 정보 누락 등 살피기 ⇒ 시각화 ⇒ 산점도
import mglearn
# X_train 데이터 사용하여 데이터 프레임 만들기
# 열 이름 : iris_dataset.feature_names에 있는 문자열 사용
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
# 데이터프레임을 사용해 y_train에 따라 구분된 산점도 행렬 만들기
pd.plotting.scatter_matrix(iris_dataframe, c=y_train,
figsize=(15,15), marker='o', hist_kwds={'bins':20},
s= 60, alpha=.8, cmap=mglearn.cm3)
# figsize : 튜플(각 네모칸) (w,h), hist()의 bins 파라미터 : 히스토그램의 가로 구간의 개수를 지정
# alpha : 투명도, cmap : 색깔
k-최근접 이웃 알고리즘 새로운 데이터 예측이 필요 → 가장 가까운 훈련 데이터 포인트 찾기 ⇒ 찾은 훈련 데이터 레이블 = 새 데이터 포인트의 레이블 = 가장 가까운 k개의 이웃을 찾을거야 빈도가 가장 높은 클래스를 예측값으로 사용
from sklearn.neighbors import KNeighborsClassifier
# 클래스로부터 객체 만들기
knn = KNeighborsClassifier(n_neighbors=1) # 이웃 1개 찾을거야
# 모델 만들기 -> fit() : knn 자체 반환
knn.fit(X_train,y_train)
예측하기
# 새로운 데이터 (샘플 수 : 1, 특성 수 : 4 - 2차원 배열)
X_new = np.array([[5,2.9,1,0.2]])
print("X_new.shape:", X_new.shape)
#예측하기
prediction = knn.predict(X_new)
print("예측:",prediction)
print("예측 타깃 이름:", iris_dataset['target_names'][prediction])