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
'Python > Machine Learning' 카테고리의 다른 글
[머신러닝 알고리즘] 선형 회귀(1) (0) | 2022.12.29 |
---|---|
[머신러닝 알고리즘] 사이킷런 제대로 시작하기(2) (0) | 2022.12.28 |
[ML] 모델 훈련 (1) - 선형회귀 (0) | 2022.10.31 |
[ML] 분류 (2) - 다중 분류 (0) | 2022.10.27 |
[ML] 분류 (1) - 이진 분류 (0) | 2022.10.26 |