본문 바로가기
기타(🎸X)/빅데이터

[빅데이터] 파이썬 빅데이터 분석 패키지 - scikit-learn

by 푸_푸 2023. 5. 30.
728x90

1. scikit-learn 개요

머신러닝 분석을 수행할 때 가장 유용하게 사용할 수 있는 파이썬 라이브러리

 

1) scikit-learn 임포트

import sklearn
print(sklearn.__version__)	#버전확인


2. scikit-learn 기반 프레임워크

머신러닝 모델 학습을 위한 fit 함수와 학습된 모델의 예측을 위한 predict 함수 제공

분류 알고리즘을 위한 클래스 Classifier, 회귀 알고리즘을 위한 클래스 Regressor

 

scikit-learn 구현 클래스

3. scikit-learn 주요 모듈

1) 예제 데이터

모듈 설명
sklearn.datasets scikit-learn에 내장되어 예제 데이터 세트를 제공

 

2) 변수 처리

모듈 설명
sklearn.preprocessing 데이터 전처리에 필요한 다양한 기능을 제공 (인코딩, 정규화, 스케일링 등)
sklearn.feature_selection 알고리즘에 큰 영향을 미치는 변수들을 선택하는 작업을 수행하는 다양한 기능을 제공
sklearn.feature_extraction 텍스트 데이터나 이미지 데이터와 같이 벡터화된 변수를 추출하는데 사용
Count Vectorizer 등을 생성하는 기능 제공
텍스트 변수 추출 : sklearn.feature_extraction.text 모듈에 내장
이미지 변수 추출 : sklearn.feature_extraction.image 모듈에 내장

 

3) 변수 처리 & 차원 축소

모듈 설명
sklearn.decomposition 차원 축소와 관련한 알고리즘을 지원
PCA, NMF, Truncated SVD 등을 통해 차원축소 기능 수행

 

4) 데이터 분리, 검증 & 매개변수 튜닝

모듈 설명
sklearn.model_selection 학습데이터와 검증 데이터, 예측 데이터로 데이터를 분리하기 위해 활용하는 train_test_split 내장
최적의 하이퍼 매개변수로 모델을 평가하기 위한 다양한 함수와 기능 제공

 

5) 평가

모듈 설명
sklearn.metrics 분류, 회귀, 클러스터링 등에 대한 다양한 성능 측정 방법 제공
모델 평가를 위한 Accuracy, Precision, Recall, ROC-AUC, RMSE 등 제공

 

6) 머신러닝 알고리즘

모듈 설명
sklearn.ensemble 앙상블 알고리즘 제공
랜덤포레스트, 에이다 부스트, 그래디언트 부스팅 등 제공
sklearn.linear_model 선형 회귀, 릿지(Ridge), 라쏘(Lasso) 및 로지스틱 회귀 등의 회귀 관련 알고리즘 지원
SGD(stochastic Gradient Descent) 관련 알고리즘 제공
sklearn.naive_bayes 나이브 베이즈 알고리즘 제공
가우시안 NB, 다항 분포 NB 등이 있음
sklearn.neighbors 최근접 이웃 알고리즘 제공
KNN 등이 있음
sklearn.svm 서포트 벡터 머신 알고리즘 제공
sklearn.tree 트리 기반 머신러닝 알고리즘을 제공
의사결정 트리 알고리즘 등이 있
sklearn.cluster 비지도 클러스터링 알고리즘을 제공
K-평균, 계층형, DBSCAN 등이 있음

 

7) 유틸리티

모듈 설명
sklearn.pipeline  변수 처리와 같은 변환 작업과 머신러닝 알고리즘 학습, 예측 등 머신러닝 프로세스를 함께 묶어서 실행할 수 있는 유틸리티 제공

 

4. scikit-learn 내장 데이터 세트

1) 내장 데이터 세트

함수 설명
datasets.load_boston 회귀 목적, 미국 보스턴의 부동산 변수들과 가격에 대한 데이터 세트로 구성
datasets.load_breast_canset 분류 목적, 위스콘신 유방암 환자의 주요 변수들과 악성/음성 레이블 데이터 세트로 구성 
datasets.load_diabetes 회귀 목적, 당뇨 환자의 주요 변수드륻이 데이터 세트로 구성
datasets.load_digits 분류 목적, 0에서 9까지 숫자의 이미지 픽셀 데이터 세트로 구성
datasets.load_iris 분류 목적, 붓꽃에 대한 주요 변수들의 데이터 세트로 구성

 

2) 표본 데이터 생성기

함수 설명
datasets.make_classifications 분류를 위한 데이터 세트 생성
높은 상관도, 불필요한 속성 등의 노이즈 효과가 적용된 데이터를 무작위로 생성할 수 있음
datasets.make_blobs 클러스터링을 위한 데이터 세트 생성
군집 지정 개수에 따라 여러가지 클러스터링을 위한 데이터 세트로 생성할 수 있음

 

3) 붓꽃 데이터 세트 불러오기

from sklearn.datasets import load_iris
iris=load_iris()
print('붓꽃 데이터세트 타입 : ',type(iris))
keys=iris.keys()
print('붓꽃 데이터세트 키 :' ,keys)
'''	결과
붓꽃 데이터세트 타입 :  <class 'sklearn.utils._bunch.Bunch'>
붓꽃 데이터세트 키 : dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])		'''

 

4) 붓꽃 데이터 세트 키

붓꽃 데이터세트의 키 의미

print('feature_names : ')
print(iris.feature_names)
print('\ntarget_names : ')
print(iris.target_names)
print('\ndata : ')
print(iris.data)
print('\ntarget : ')
print(iris.target)
'''	결과
feature_names : 
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

target_names : 
['setosa' 'versicolor' 'virginica']

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]
 
        ...
 
 [6.7 3.  5.2 2.3]
 [6.3 2.5 5.  1.9]
 [6.5 3.  5.2 2. ]
 [6.2 3.4 5.4 2.3]
 [5.9 3.  5.1 1.8]]

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]	'''

 

5. scikit-learn 머신러닝 만들어 보기

붓꽃 데이터 세트로 붓꽃의 품종을 분류해보자.

독립변수 : 꽃잎의 길이와 너비, 꽃받침의 길이와 너비

종속변수 : 꽃의 품종(Setosa, Versicolor, Virginica)

 

1) 분류 개요

분류는 대표적인 지도학습 방법 중 하나로 

학습을 위한 다양한 피처(Feature)데이터와 분류 결정값인 레이블(Label)데이터로 모델을 학습한 뒤 

별도의 테스트 데이터 세트에서 미지의 레이블을 예측하여 분류한다.

 

2) 붓꽃 데이터 세트 흝어보기

데이터 프레임의 데이터에 iris.data 할당, 컬럼에는 iris.feature_names 할당

label 이라는 컬럼을 추가해 iris.target 데이터를 삽입했다.

import pandas as pd

iris_df=pd.DataFrame(data=iris.data,columns=iris.feature_names)
iris_df['label']=iris.target
print(iris_df.head(3))
'''	 결과
sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \
0                5.1               3.5                1.4               0.2   
1                4.9               3.0                1.4               0.2   
2                4.7               3.2                1.3               0.2   

   label  
0      0  
1      0  
2      0  			'''

 

3) 학습/테스트 데이터 세트 분할

학습/ 테스트 데이터 세트 분리를 위해 train_test_split을 임포트

 

train_test_split의 첫 번째 매개변수는 iris_data 피처 데이터 세트, 두 번째 매개변수인 iris_label은 타겟 데이터 세트이다.

test_size=0.2는 전체 데이터 세트 중 테스트 데이터 세트의 비율이다.

random_state=11는 함수 호출 시 같은 학습/데이터 세트를 생성하기 위해 주어지는 난수 발생 값으로 지정하지 않으면 수행 할 때마다 다른 세트가 생성된다. 

 

아래의 예시에서는 학습 피처 데이터 세트를 x_train으로 학습 타겟 데이터 세트를 y_train으로 테스트 피처 데이터 세트를 x_test테스트 타겟 데이터 세트를 y_test로 생성했다.

from sklearn.model_selection import train_test_split

iris_data=iris.data
iris_label=iris.target

x_train,x_test,y_train,y_test=train_test_split(iris_data,iris_label,test_size=0.2,random_state=11)

print('train dataset')
print('x_train dataset : ', len(x_train))
print('y_train dataset : ', len(y_train))
print('test dataset')
print('x_test dataset : ', len(x_test))
print('y_test dataset : ', len(y_test))
'''	결과
train dataset
x_train dataset :  120
y_train dataset :  120
test dataset
x_test dataset :  30
y_test dataset :  30		'''

 

4) 의사결정 트리 머신러닝 학습

의사결정 트리 클래스인 DecisionTreeClssifier을 객체로 생성하고 fit 함수에 학습 피처 데이터 세트인 x_train과 학습 타겟 데이터 세트인 y_train을 입력해 호출하면 학습을 수행할 수 있다.

from sklearn.tree import DecisionTreeClassifier

dt_clf=DecisionTreeClassifier(random_state=11)
dt_clf.fit(x_train, y_train)
'''	결과
DecisionTreeClassifier(random_state=11)		'''

 

5) 의사결정 트리 머신러닝 테스트/평가

학습을 수행한 의사결정 트리 클래스인 df_clf를 이용해 분류 예측을 수행한다.

예측은 학습 데이터가 아닌 테스트 데이터를 사용한다.

 

acuuracy_score 함수를 사용해 정확도를 측정한다. 

첫 번째 매개변수로 타겟 데이터 세트두번째 매개변수로 예측 데이터 세트를 입력한다.

from sklearn.metrics import accuracy_score

pred=dt_clf.predict(x_test)
ac_score=accuracy_score(y_test,pred)
print('예측 정확도 : ',ac_score)
'''	결과
예측 정확도 :  0.9333333333333333	'''

 

6) 머신러닝 모델 구현 프로세스

머신러닝 모델 구현 프로세스

① 데이터 세트 분리 : 데이터 세트를 학습 데이터(Train Dateset)와 테스트 데이터(Test Dataset)으로 분리

모델 학습 : 학습 데이터를 기반으로 머신러닝 알고리즘을 적용해 모델을 학습

예측 수행 : 학습된 머신러닝 모델을 이용해 테스트 데이터의 분류를 예측

평가 : 예측된 결과 값과 테스트 데이터의 실제 결괏값을 비교해 머신러닝 모델의 성능을 평가

 

6. scikit-learn 데이터 전처리

결측치 허용 X : 얼마 되지 않는다면 평균값 대체, 대부분이라면 해당 데이터 삭제

문자열 값 허용 X : 명목형 변수는 코드 값으로 변환하여 처리

 

1) 레이블 인코딩

명목형 변수를 코드형 숫자 값으로 변환하는 것

LabelEncoder 클래스로 LabelEncoder를 객체로 생성한 후 fit과 transform을 호출해 레이블 인코딩 수행

from sklearn.preprocessing import LabelEncoder

items=['TV','냉장고','전자레인지','컴퓨터','TV','냉장고','컴퓨터','컴퓨터']

encoder=LabelEncoder()
encoder.fit(items)
labels=encoder.transform(items)

print('인코딩 변환값 : ',labels)
print('인코딩 클래스 : ', encoder.classes_)
'''	결과
인코딩 변환값 :  [0 1 2 3 0 1 3 3]
인코딩 클래스 :  ['TV' '냉장고' '전자레인지' '컴퓨터']	'''

 

origins=encoder.inverse_transform([0,1,2,3,0,1,3,3])
print('디코딩 원본값 : ', origins)
'''	결과
디코딩 원본값 :  ['TV' '냉장고' '전자레인지' '컴퓨터' 'TV' '냉장고' '컴퓨터' '컴퓨터']	'''

숫자 값의 크고 작음에 특성이 작용되는 몇몇 머신러닝 알고리즘에서 예측 성능이 떨어짐

 

2) 원-핫 코딩

변수 값의 유형에 따라 새로운 변수를 추가해 고유값에 해당하는 컬럼에만 1을 표시하고 나머지 컬럼에는 0을 표시

원-핫 인코딩

OneHotEncoder 클래스로 쉽게 변환가능하지만 다음 두 가지에 주의

1) OneHotEncoder로 변환하기 전에 모든 문자열 값이 숫자형으로 변환되어야 함

2) 입력 값으로 2차원 데이터가 필요

from sklearn.preprocessing import OneHotEncoder   #sklearn 원-핫 인코딩
import numpy as np

labels=labels.reshape(-1,1)		#2차원 데이터로 변환

oh_encoder=OneHotEncoder()
oh_encoder.fit(labels)
oh_labels=oh_encoder.transform(labels)

print('원-핫 인코딩 데이터')
print(oh_labels.toarray())
print('원-핫 인코딩 데이터 차원')
print(oh_labels.shape)
'''	결과
원-핫 인코딩 데이터
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]
 [1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 0. 1.]
 [0. 0. 0. 1.]]
원-핫 인코딩 데이터 차원
(8, 4)		'''

 

pandas에서는 명목형 데이터를 숫자형으로 변환할 필요 없이 get_dummies 함수를 이용해 바로 2차원 데이터로 변환

import pandas as pd         
item_df=pd.DataFrame({'item' : items})
pd.get_dummies(item_df)	  #Pandas get_dummies 원-핫 인코딩
'''	결과
item_TV	item_냉장고	item_전자레인지	item_컴퓨터
0	1	0	0	0
1	0	1	0	0
2	0	0	1	0
3	0	0	0	1
4	1	0	0	0
5	0	1	0	0
6	0	0	0	1
7	0	0	0	1		'''

 

3) 스케일링

서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업

표준화 : 원 데이터를 평균이 0이고 분산이 1인 정규 분포를 가진 값으로 변환

정규화 : 서로 다른 변수의 크기를 통일하기 위해 크기를 변환해주는 개념

#데이터 세트 흝어보기
from sklearn.datasets import load_iris
import pandas as pd

iris=load_iris()
iris_data=iris.data
iris_df=pd.DataFrame(data=iris.data,columns=iris.feature_names)

print('feature 들의 평균 값 : \n', iris_df.mean())
print('feature 들의 분산 값 : \n', iris_df.var())
'''	결과
feature 들의 평균 값 : 
 sepal length (cm)    5.843333
sepal width (cm)     3.057333
petal length (cm)    3.758000
petal width (cm)     1.199333
dtype: float64
feature 들의 분산 값 : 
 sepal length (cm)    0.685694
sepal width (cm)     0.189979
petal length (cm)    3.116278
petal width (cm)     0.581006
dtype: float64		'''

StandardScaler 객체 생성 후 fit과 transform 함수에 변환 대상 데이터 세트를 입력하고 호출하면 간단하게 변환됨

from sklearn.preprocessing import StandardScaler

scaler=StandardScaler()
scaler.fit(iris_df)
iris_scaled=scaler.transform(iris_df)
iris_df_scaled=pd.DataFrame(data=iris_scaled,columns=iris.feature_names)

print('feature 들의 평균 값 : \n', iris_df_scaled.mean())
print('feature 들의 분산 값 : \n', iris_df_scaled.var())
'''	결과
feature 들의 평균 값 : 
 sepal length (cm)   -1.690315e-15
sepal width (cm)    -1.842970e-15
petal length (cm)   -1.698641e-15
petal width (cm)    -1.409243e-15
dtype: float64
feature 들의 분산 값 : 
 sepal length (cm)    1.006711
sepal width (cm)     1.006711
petal length (cm)    1.006711
petal width (cm)     1.006711
dtype: float64			'''

MinMaxScaler : 데이터 값을 0과 1 사이의 범위 값으로 변환

from sklearn.preprocessing import MinMaxScaler

scaler=MinMaxScaler()
scaler.fit(iris_df)
iris_scaled=scaler.transform(iris_df)
irif_df_scaled=pd.DataFrame(data=iris_scaled,columns=iris.feature_names)

print('feature 들의 최소 값 : \m',iris_df_scaled.min())
print('feature 들의 최대 값 : \m',iris_df_scaled.max())
'''	결과
feature 들의 최소 값 : \m sepal length (cm)   -1.870024
sepal width (cm)    -2.433947
petal length (cm)   -1.567576
petal width (cm)    -1.447076
dtype: float64
feature 들의 최대 값 : \m sepal length (cm)    2.492019
sepal width (cm)     3.090775
petal length (cm)    1.785832
petal width (cm)     1.712096
dtype: float64		'''

스케일링 객체를 이용해 학습 데이터 세트로 fit과 transform을 적용하면 테스트 데이터 세트로는 다시 fit을 수행하지 않고 학습 데이터 세트로 fir을 수행한 결과를 이용해 transform 변환을 적용해야 한다.

(=학습 데이터로 fit이 적용된 스케일링 기준 정보를 그래도 테스트 데이터에 적용해야 한다)

from sklearn.preprocessing import MinMaxScaler
import numpy as np

train_array=np.arange(0,11).reshape(-1,1)
test_array=np.arange(0,6).reshape(-1,1)

scaler=MinMaxScaler()
scaler.fit(train_array)
train_scaled=scaler.transform(train_array)

print('원본 train_array 데이터 : ',np.round(train_array.reshape(-1),2))
print('scaled train_array 데이터 : ',np.round(train_scaled.reshape(-1),2))

#scaler.fit(test_array) 테스트 데이터에 다시 fit을 하면 안됨
test_scaled=scaler.transform(test_array)

print('원본 test_array 데이터 : ',np.round(test_array.reshape(-1),2))
print('scaled test_array 데이터 : ',np.round(test_scaled.reshape(-1),2))
'''	결과
원본 train_array 데이터 :  [ 0  1  2  3  4  5  6  7  8  9 10]
scaled train_array 데이터 :  [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
원본 test_array 데이터 :  [0 1 2 3 4 5]
scaled test_array 데이터 :  [0.  0.1 0.2 0.3 0.4 0.5]	'''

 

 

728x90

댓글