1. scikit-learn 특징

  • 다양한 머신러닝 알고리즘을 구현한 파이썬 라이브러리
  • 심플하고 일관성 있는 API, 유용한 온라인 문서, 풍부한 예제
  • 머신러닝을 위한 쉽고 효율적인 개발 라이브러리 제공
  • 다양한 머신러닝 관련 알고리즘, 개발을 위한 프레임워크와 API 제공
  • 많은 사람이 사용하며 다양한 환경에서 검증된 라이브러리

 

 

2. scikit-learn 주요 모듈

모듈 설명
sklearn.datasets 내장된 예제 데이터 세트
sklearn.preprocessing 다양한 데이터 전처리 기능 제공(변환, 정규화, 스케일링 등)
sklearn.feature_selection feature 선택 기능 제공
sklearn.feature_extraction feature 추출에 사용
sklearn.model_selection 교차 검증을 위해 데이터를 학습용/테스트용으로 분리,
최적 파라미터를 추출하는 API 제공(GridSearch 등)
sklearn.metrics 분류, 회귀, 클러스터링, Pairwise에 대한 다양한 성능 측정 방법 제공(Accuracy, Precision, Recall, ROC-AUC, RMSE 등)
sklearn.pipeline 특징 처리 등의 변환과 ML 알고리즘 학습, 예측 등을 묶어서 실행할 수 있는 유틸리티 제공
sklearn.linear_model 선형 회귀, 릿지, 라쏘, 로지스틱 회귀 등 회귀 관련 알고리즘과 SGD(Stochastic Gradient Descent) 알고리즘 제공
sklearn.svm 서포트 벡터 머신(SVM) 알고리즘 제공
sklearn.neighbors 최근접 이웃(KNN 등) 알고리즘 제공
sklearn.naive_bayes 나이브 베이즈 알고리즘 제공(가우시안 NB, 다항분포 NB 등)
sklearn.tree 의사 결정 나무 알고리즘 제공
sklearn.ensemble 앙상블 알고리즘 제공(RandomForest, AdaBoost, GradientBoost 등)
sklearn.cluster 비지도 클러스터링 알고리즘 제공(K-means, 계층형 클러스터링, DBSCAN 등)

 

 

3. estimator API

  -scikit-learn이 어떤 식으로 이 API를 사용하는지 철학 또는 규칙

  • 일관성을 중요하게 생각: 모든 객체는 일관된 문서를 갖춘 제한된 메서드 집합에서 비롯된 공통 인터페이스를 공유함
  • 검사: 모든 지정된 파라미터 값은 공개 속성으로 노출되게 되어 있음
  • 제한된 객체 계층 구조
    • 알고리즘만 파이썬 클래스에 의해 표현되어 있음
    • 데이터 세트는 표준 형식(Numpy 배열, Pandas DataFrame, Scipy 희소 행렬)으로 표현
    • 매개변수 명은 표준 파이썬 문자열 사용
  • 구성: 많은 머신러닝 작업은 기본 알고리즘의 시퀀스(순서가 있는 나열)로 나타낼 수 있으며, scikit-learn은 가능한 곳이라면 어디서든 이 방식 사용
  • 합리적인 기본값: 모델이 사용자 파라미터를 필요로 할 때 라이브러리가 적절한 기본값을 정의(아무것도 입력하지 않으면 입력하도록 하거나 default 값으로 채워짐)

 

 

4. API 사용 방법

 1) scikit-learn으로부터 적절한 estimator 클래스를 임포트해서 모델의 클래스 선택

# 선형회귀 모델 임포트
from sklearn.linear_model import LinearRegression

 2) 클래스를 원하는 값으로 인스턴스화해서 모델의 하이퍼파라미터 선택

# 선형회귀 모델을 model이라는 변수로 인스턴스화
# 괄호안에 하이퍼파라미터 값 지정
model = LinearRegression()

 3) 데이터를 특징 배열과 대상 벡터로 배치(학습에 사용할 수 있는 feature들로 되어있는 배열(X), 예측 대상이 되는 배열(y))

 4) 모델 인스턴스의 fit() 메서드를 호출해 모델을 데이터에 적합

 5) 모델을 새 데이터에 대해서 적용

   -지도 학습: 대체로 predict() 메서드를 사용해 알려지지 않은 데이터에 대한 레이블 예측

   -비지도 학습: 대체로 transform()이나 predict() 메서드를 사용해 데이터의 속성을 변환하거나 추론

 

 -scikit-learn 사용 예시

import numpy as np
import matplotlib.pyplot as plt

# 데이터셋 생성
x = 10 * np.random.rand(50)
y = 2 * x + np.random.rand(50)
plt.scatter(x, y)

# 적절한 estimator 클래스를 임포트해서 모델의 클래스 선택
from sklearn.linear_model import LinearRegression

# 클래스를 원하는 값으로 인스턴스화해서 모델의 하이퍼파라미터 선택
model = LinearRegression(fit_intercept = True)
model
# 데이터를 특징 배열과 대상 벡터로 배치
# 특징 배열: X, 대상 벡터: y
X = x[:, np.newaxis] # np.newaxis는 배열에 새로운 축을 부여하여 1차원 배열을 2차원 배열로 만들어줌
X

  ※ np.newaxis 적용 후 X의 모양(2차원 배열)

  ※ np.newaxis 적용 전 x의 모양(1차원 배열)

# 모델 인스턴스(model)의 fit() 메서드를 호출해 모델을 데이터에 적합
model.fit(X, y)

# 선형회귀 모델의 회귀 계수
model.coef_  # 결과: array([2.0285485])

# 선형회귀 모델의 절편
model.intercept_  # 결과: 0.36150523836797355
# 모델을 새 데이터에 대해서 적용
# 처음에 생성해서 모델을 학습시킨 데이터를 테스트 해볼 새로운 데이터 생성
xfit = np.linspace(-1, 11)
Xfit = xfit[:, np.newaxis]
yfit = model.predict(Xfit) # 앞서 학습시킨 모델(model)에 새로 생성한 데이터 Xfit을 적용시켜 그에 대한 예측값 yfit 생성

 

  -모델이 잘 예측했는지 원래의 데이터 산점도와 새로 생성하여 예측한 데이터의 선그래프를 비교

plt.scatter(x, y)
plt.plot(xfit, yfit, '--r')

  -비교해본 결과 원래 데이터의 산점도의 경향성을 선그래프가 잘 나타내고 있는 것으로 보임

 

 

5. scikit-learn에서 기본으로 제공해주는 예제 데이터 세트

  -분류/회귀용 데이터 세트

API 설명
datasets.load_linnerud() 체력검사 데이터(다중 출력 회귀용)
datasets.load_breast_cancer() 위스콘신 유방암 특징과 양성/음성 레이블 데이터(분류용)
datasets.diabetes() 당뇨 데이터(회귀용)
datasets.load_digits() 0에서 9까지 숫자 이미지 픽셀 데이터(분류용)
datasets.load_iris() 붓꽃 특징 데이터(분류용)
datasets.load_wine() 와인 데이터(분류용)

 

  -온라인 데이터 세트(내장 데이터 세트와 다르게 크기가 커서 API로 제공)

API 설명
fetch_california_housing 캘리포니아 주택 가격 데이터
fetch_covtype() 회귀 분석용 토지 조사 데이터
fetch_20newsgroups() 뉴스 그룹 텍스트 데이터
fetch_olivetti_faces() 얼굴 이미지 데이터
fetch_lfw_people() 얼굴 이미지 데이터
fetch_lfw_paris() 얼굴 이미지 데이터
fetch_rcv1() 로이터 뉴스 말뭉치 데이터
fetch_lfw_mldata() ML 웹사이트에서 다운로드

 

  -분류와 클러스터링을 위한 표본 데이터 생성

API 설명
datasets.make_classifications() 분류를 위한 데이터 세트 생성, 높은 상관도·불필요한 속성 등 노이즈를 고려한 데이터를 무작위로 생성
datasets.make_blobs() 클러스터링을 위한 데이터 세트 생성, 군집 지정 개수에 따라 여러 클러스터링을 위한 데이터 세트를 무작위로 생성

 

  -예제 데이터 세트 구조

  • 일반적으로 딕셔너리 형태
  • data: 특징 데이터 세트(feature 데이터, X값)
  • target: 분류용은 레이블 값, 회귀용은 숫자 결과값 데이터(y값)
  • target_names: 개별 레이블의 이름(분류용에서만 포함되어 있음)
  • feature_names: 특징의 이름
  • DESCR: 데이터 세트에 대한 설명과 각 특징 설명

 

  -데이터 세트 불러오기 예시

표에 정리한 데이터 외에 다른 토이 데이터도 있음

from sklearn.datasets import load_diabetes
diabetes = load_diabetes()

# 예제 데이터 세트는 딕셔너리 형태로 구성되어 있으므로, key값을 출력하면 데이터 세트에 저장된 정보의 이름이 출력됨
print(diabetes.keys())

# 출력 결과
dict_keys(['data', 'target', 'frame', 'DESCR', 'feature_names', 'data_filename', 'target_filename', 'data_module'])
# 특징 데이터 세트 출력
print(diabetes.data)

# 출력 결과
[[ 0.03807591  0.05068012  0.06169621 ... -0.00259226  0.01990749
  -0.01764613]
 [-0.00188202 -0.04464164 -0.05147406 ... -0.03949338 -0.06833155
  -0.09220405]
 [ 0.08529891  0.05068012  0.04445121 ... -0.00259226  0.00286131
  -0.02593034]
 ...
 [ 0.04170844  0.05068012 -0.01590626 ... -0.01107952 -0.04688253
   0.01549073]
 [-0.04547248 -0.04464164  0.03906215 ...  0.02655962  0.04452873
  -0.02593034]
 [-0.04547248 -0.04464164 -0.0730303  ... -0.03949338 -0.00422151
   0.00306441]]
# 타겟 데이터 세트 출력
diabetes.target

# 출력 결과
[151.  75. 141. 206. 135.  97. 138.  63. 110. 310. 101.  69. 179. 185.
 118. 171. 166. 144.  97. 168.  68.  49.  68. 245. 184. 202. 137.  85.
 131. 283. 129.  59. 341.  87.  65. 102. 265. 276. 252.  90. 100.  55.
  61.  92. 259.  53. 190. 142.  75. 142. 155. 225.  59. 104. 182. 128.
  52.  37. 170. 170.  61. 144.  52. 128.  71. 163. 150.  97. 160. 178.
  48. 270. 202. 111.  85.  42. 170. 200. 252. 113. 143.  51.  52. 210.
  65. 141.  55. 134.  42. 111.  98. 164.  48.  96.  90. 162. 150. 279.
  92.  83. 128. 102. 302. 198.  95.  53. 134. 144. 232.  81. 104.  59.
 246. 297. 258. 229. 275. 281. 179. 200. 200. 173. 180.  84. 121. 161.
  99. 109. 115. 268. 274. 158. 107.  83. 103. 272.  85. 280. 336. 281.
 118. 317. 235.  60. 174. 259. 178. 128.  96. 126. 288.  88. 292.  71.
 197. 186.  25.  84.  96. 195.  53. 217. 172. 131. 214.  59.  70. 220.
 268. 152.  47.  74. 295. 101. 151. 127. 237. 225.  81. 151. 107.  64.
 138. 185. 265. 101. 137. 143. 141.  79. 292. 178.  91. 116.  86. 122.
  72. 129. 142.  90. 158.  39. 196. 222. 277.  99. 196. 202. 155.  77.
 191.  70.  73.  49.  65. 263. 248. 296. 214. 185.  78.  93. 252. 150.
  77. 208.  77. 108. 160.  53. 220. 154. 259.  90. 246. 124.  67.  72.
 257. 262. 275. 177.  71.  47. 187. 125.  78.  51. 258. 215. 303. 243.
  91. 150. 310. 153. 346.  63.  89.  50.  39. 103. 308. 116. 145.  74.
  45. 115. 264.  87. 202. 127. 182. 241.  66.  94. 283.  64. 102. 200.
 265.  94. 230. 181. 156. 233.  60. 219.  80.  68. 332. 248.  84. 200.
  55.  85.  89.  31. 129.  83. 275.  65. 198. 236. 253. 124.  44. 172.
 114. 142. 109. 180. 144. 163. 147.  97. 220. 190. 109. 191. 122. 230.
 242. 248. 249. 192. 131. 237.  78. 135. 244. 199. 270. 164.  72.  96.
 306.  91. 214.  95. 216. 263. 178. 113. 200. 139. 139.  88. 148.  88.
...
 118.  69. 273. 258.  43. 198. 242. 232. 175.  93. 168. 275. 293. 281.
  72. 140. 189. 181. 209. 136. 261. 113. 131. 174. 257.  55.  84.  42.
 146. 212. 233.  91. 111. 152. 120.  67. 310.  94. 183.  66. 173.  72.
  49.  64.  48. 178. 104. 132. 220.  57.]
# 데이터 세트에 대한 정보 출력
diabetes.DESCR

# 출력 결과
.. _diabetes_dataset:

Diabetes dataset
----------------

Ten baseline variables, age, sex, body mass index, average blood
pressure, and six blood serum measurements were obtained for each of n =
442 diabetes patients, as well as the response of interest, a
quantitative measure of disease progression one year after baseline.

**Data Set Characteristics:**

  :Number of Instances: 442 # 인스턴스 수 442개

  :Number of Attributes: First 10 columns are numeric predictive values

  :Target: Column 11 is a quantitative measure of disease progression one year after baseline

  :Attribute Information: # 속성 정보
      - age     age in years
      - sex
      - bmi     body mass index
      - bp      average blood pressure
      - s1      tc, total serum cholesterol
      - s2      ldl, low-density lipoproteins
...
For more information see:
Bradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani (2004) "Least Angle Regression," Annals of Statistics (with discussion), 407-499.
(https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf)
# feature 데이터의 이름만 출력
print(diabetes.feature_name)

# 출력 결과(DESCR에서 본 것과 다르게 이름의 약자가 출력)
['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
# 데이터 세트와 타겟의 파일이름
print(diabetes.data_filename)
print(diabetes.target_filename)

# 출력 결과(압축된 csv 파일 형태)
diabetes_data_raw.csv.gz
diabetes_target.csv.gz

+ Recent posts