티스토리 뷰
2021.1.14 23:49
안녕하세요
프로그래밍을 배우는 빛나는 샤트입니다.
AIFFEL 대전 1기 Exploration 2장 머신러닝 데이터 분류하기
*2021.01.07 (목)
0. 프로젝트 소개
머신러닝을 배우다 보면 유명한 데이터셋을 몇 개 다루게 되는데 여기서는 아래의 데이터를 활용해 분류 모델의 성능 비교를 한다.
1) 손글씨
2) 와인
3) 유방암
각 데이터들은 sklearn.datasets에서 쉽게 가져올 수 있어서 머신러닝 기초에서 자주 사용된다.
또한 사용할 모델들은 아래와 같다.
1) Decision Tree
2) Random Tree
3) SVM
4) SGD Classifier
5) Logistic Regression
※ 이 포스팅에서는 코드를 나열하지 않고 데이터가 어떤 형태이며 모델별 특징과 어떻게 평가를 했는지 서술할 예정
※ train : test = 8 : 2 비율로 나눠서 진행함
1. 데이터 소개
1-1. 손글씨 데이터
# 손글씨 데이터 불러오기 & 변수 할당하기
from sklearn.datasets import load_digits
digits = load_digits()
# 데이터 키 확인
# 'data', 'target', 'frame', 'feature_names', 'target_names', 'images', 'DESCR'
# 7개의 키로 데이터들을 확인할 수 있다.
digits.keys()
# 데이터 개수: 총 1797개의 데이터가 각각 (8*8)개의 정보를 가지고 있다.
digits_data = digits.data
digits_data.shape # 데이터 형태: (1797, 64)
# 특성을 확인할 수 있다.
# pixel_0_0 ~ pixel_7_7 총 64개의 데이터를 확인할 수 있다.
digits.feature_names
손글씨 데이터는 이미지 데이터이다.
총 1797개의 데이터이고 데이터 각각이 8*8의 크기를 가지고 있다.
실제로 어떻게 생겼는지 시각화를 통해 확인해보면 아래와 같다.
0~9까지의 숫자가 있는 것을 확인할 수 있다.
for i in range(10):
plt.subplot(2, 5, i+1)
plt.imshow(digits.data[i].reshape(8, 8), cmap='gray')
plt.axis('off')
plt.show() # 0 ~ 9 숫자를 확인
1-2. 와인 데이터
# 와인 데이터 불러오기 & 변수 할당하기
from sklearn.datasets import load_wine
wine = load_wine()
# 데이터 키 확인
# 'data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'
# 총 6개의 키로 데이터를 확인해볼 수 있다.
wine.keys()
# 데이터의 개수: 총 178개의 데이터가 각각 13개의 정보(feature)를 가지고 있다.
wine_data = wine.data
wine_data.shape # 데이터 형태: (178, 13)
# 특성을 확인할 수 있다. 위에서 확인했듯 13개의 feature이다.
# 'alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols',
# 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue',
# 'od280/od315_of_diluted_wines', 'proline'
wine.feature_names
와인 데이터는 텍스트 데이터이다.
총 178개의 데이터이고 13개의 feature를 가지고 있다.
13개 feature의 이름은 .feature_names 키를 이용해 접근할 수 있다.
와인 데이터를 데이터 프레임으로 표현해보면 아래와 같다. (label은 target 키를 이용해 추가해줬다)
1-3. 유방암 데이터
# 데이터 불러오기 & 변수 할당하기
from sklearn.datasets import load_breast_cancer
breast_cancer = load_breast_cancer()
# 데이터 키 확인
# 'data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'
# 7개의 키로 데이터를 확인할 수 있다.
breast_cancer.keys()
# 데이터 개수: 총 569개의 데이터가 각각 30개의 feature를 가지도 있다.
breast_cancer_data = breast_cancer.data
breast_cancer_data.shape # 데이터 형태: (569, 30)
# 특성을 확인해보면
"""
'mean radius', 'mean texture', 'mean perimeter', 'mean area',
'mean smoothness', 'mean compactness', 'mean concavity',
'mean concave points', 'mean symmetry', 'mean fractal dimension',
'radius error', 'texture error', 'perimeter error', 'area error',
'smoothness error', 'compactness error', 'concavity error',
'concave points error', 'symmetry error',
'fractal dimension error', 'worst radius', 'worst texture',
'worst perimeter', 'worst area', 'worst smoothness',
'worst compactness', 'worst concavity', 'worst concave points',
'worst symmetry', 'worst fractal dimension'], dtype='<U23'
"""
breast_cancer.feature_names
유방암 데이터는 텍스트 데이터이다.
총 569개의 데이터가 각각 30개의 feature를 가지고 있다.
유방암 데이터를 데이터 프레임으로 표현해보면 아래와 같다. (label은 target 키를 이용해 추가해줬다)
2. 모델 소개 (모델의 간단한 소개 정도로 적을 예정)
2-1. Decision Tree
의사 결정 나무라고 불리는 이 모델은 데이터를 분석해 이들 사이에 존재하는 패턴을 예측 가능한 규칙들의 조합으로 나타내는데 그 모양이 나무와 같아서 붙여진 이름이다. 흔히 알고 있는 '스무고개 놀이'와 비슷하다.
하지만 특정 데이터에만 잘 작동할 수 있는 단점이 있다.
참고 블로그 - ratsgo.github.io/machine%20learning/2017/03/26/tree/
2-2. Random Forest
랜덤 포레스트는 의사 결정 나무의 단점을 보완하고자 나왔다.
이름 그대로 임의의 숲을 이룬다는 의미로 의사 결정 나무 여러 개를 이용한다는 개념이다.
의사 결정 나무는 하나의 나무를 이용했다면 랜덤 포레스트는 다양한 나무를 이용해 다각도에서 분류 모델을 만든다.
그리고 이렇게 다수의 모델을 동시에 융합해 사용하는 기법을 앙상블 기법이라고 한다.
참고 블로그 - medium.com/@deepvalidation/title-3b0e263605de
2-3. SVM(Support Vector Machine)
낮은 차원에서 분류를 위한 경계를 찾는 것이 어렵다는 점을 보완하기 위해 비선형 매핑을 통해 고차원으로 변환한다. 이렇게 되면 데이터를 최적으로 분리하는 선형분리를 찾을 수 있다.
SVM은 분류를 위한 경계를 명확하게 만들기 위해 고차원으로 변환해 학습하는 모델이다.
충분히 큰 차원으로 변환되면 복잡한 분류 경계도 명확히 할 수 있어 다른 모델들보다 Over Fitting되는 경향이 적다는 장점이 있다.
참고 블로그 - excelsior-cjh.tistory.com/66
2-4. SGD Classifier (Stochastic Gradient Descent)
정확히 정의는 어렵지만 '확률적 경사 하강법'이라는 의미를 보면 손실함수를 최소로 하기 위해 최적의 파라미터를 찾는 방법 중 하나인 것 같다.
선형 분류와 선형 회귀를 이용해 대량의 데이터 학습에서 유용하다고 한다.
SGD Classifier의 장점으로는 구현이 용이하며 효율성이 높다는 것이다.
단점으로는 정규화 매개 변수와 반복 횟수 등과 같이 많은 하이퍼 파라미터가 필요하다.
cs231n-3강에서 나온다고 하니 풀잎스쿨;Deepml 시간에 집중해서 확립하고 가야겠다!
참고 블로그 - cding.tistory.com/2
2-5. Logistic Regression
선형 회귀.
회귀라는 것은 어떤 연속적인 데이터가 있을 때 데이터의 규칙, 패턴을 학습해 특정 값에 대한 예측을 해볼 수 있는 것이다. 즉, 여기서는 데이터의 각각의 경향이 선형으로 구분해 분류하겠다는 의미이다.
(예시: 키와 몸무게 두 개의 데이터가 있을 때 다양한 키와 몸무게 데이터를 학습해 선형 회귀를 통해 예측해 보면 특정 키를 알았을 때 대략적인 몸무게를 구할 수 있을 것)
참고 블로그 - hleecaster.com/ml-logistic-regression-concept/
3. 모델 결과 보고 지표
5개의 모델을 이용해 평가를 하려면 어떤 지표를 가지고 비교를 해야할 지 정해야 한다.
아래는 손글씨 분류의 의사 결정 나무의 결과 보고 지표이다.
<지표 설명>
1) precision(정밀도): 어떠한 클래스(예시: 클래스 A)로 분류한 데이터 중 실제로 클래스 A일 비율 (높을수록 좋다.)
>> 즉, 정밀도는 예측한 데이터 셋 중 얼마나 실제와 일치하는 지 보는 것
2) recall(재현율): 실제 클래스 A에 속한 데이터 중 클래스 A로 예측한 표본의 수 비율 (높을수록 좋다.)
>> 즉, 재현율은 실제 데이터 셋 중 여러 개의 데이터에 대해 하나의 클래스로 잘 분류할 수 있는 지 보는 것
3) F-Score: 정밀도와 재현율의 가중조화평균으로 구한다. 공식은 아래와 같다. 모델의 평균적인 성능 비교 시 유용
F1-score = (2precisionrecall) / (precision + recall)
4) accuracy(정확도): 전체 샘플 중 올바르게 예측한 샘플 수의 비율 (높을수록 좋다.) 하지만 데이터 편향되어 있다면 유용하지 않을 수 있다.
_다중 클래스 분류_의 경우 각각의 클래스에 대해 자신을 양성 클래스, 다른 클래스를 음성 클래스로 가정하는데 각 클래스별로 구한 정밀도, 재현율, F1-score의 평균 점수를 구해야 한다.
5) macro avg: 단순 평균
6) weighted avg: 각 클래스에 속하는 표본의 갯수로 가중평균
4-.1 손글씨 분류
다중 클래스(10개) 분류이며 전체적인 성능 비교가 중요하므로 F1-score의 weighted avg로 평가
4-2. 와인 분류
다중 클래스(3개) 분류이며 실제 데이터 셋에 대해 얼마나 잘 예측하는지가 중요하므로 recall의 weighted avg로 평가
4-3. 유방암 분류
이진 분류(2개)이며 분류한 데이터에 대해 실제 데이터와 얼마나 일치하는지가 중요하므로 precision의 weighted avg로 평가
5-1. 손글씨 분류 결과
SVM이 0.99의 수치로 가장 성능이 좋다. 클래스가 10개이다보니 차원을 늘려 학습한 SVM이 효과적인듯
5-2. 와인 분류 결과
>> Random Forest가 1.00으로 가장 높다. 클래스가 3개이고 다양한 나무들이 분류에 도움을 준 듯
>> SVM과 SGD Classifier은 0.61로 낮다. 적은 클래스라 SVM의 고차원 변환이 역효과를 낸 것 같고 SGD는 정확한 이유는 모르겠다.
5-3. 유방암 분류 결과
>> Random Forest가 1.00으로 가장 높다. 이진 분류이기에 랜덤 포레스트 혹은 선형회귀가 가장 높을 것이라 예상했는데 예상대로 1,2위를 차지했다.
6. 마무리하며...
* Exploration 2번째를 하면서 머신러닝의 기초인 붓꽃, 손글씨, 와인, 유방암 데이터를 제대로 경험해봐서 감회가 새롭다. 이름만 듣거나 스쳐 지나가며 학습했었는데 직접 데이터를 불러와서 5가지 모델별로 성능을 비교해보고 지표에 대한 공부도 할 수 있었다.
* 또한 데이터 확인 부분에서 target, feature_names 등을 통해 데이터를 먼저 확인한 후 어떻게 다뤄야 하는 지 배운 것이 가장 컸다. 데이터가 어떤 형태, 개수, 전처리에 따라 모델의 성능이 완전히 달라질 수 있기 때문이다.
* 이전 학습(가위바위보)에서 반성했던 점이 있었는데 적극적인 팀원들과의 교류와 교육생분들과의 소통을 통해 집단의 힘을 느낄 수 있었다.
* 아마 이번 파트는 다른 산업군과 융합한다면 더 크게 시너지를 일으킬 수 있을 것이다. 개발자가 아니더라도 유용하게 사용할 수 있을 것이라 생각한다.
+ CS231N 3강에서 좀 더 보강하는 시간을 가져봐야겠다.
'교육 > AIFFEL(대전)1기' 카테고리의 다른 글
[E08] Explicit Dataset(명시적) VS Implicit Dataset(암묵적) (0) | 2022.02.17 |
---|---|
[Exploration] E08 영화 추천 시스템 (0) | 2022.02.17 |
[Exploration]np.where 활용 (0) | 2022.02.17 |
AIFFEL(대전) [Exploration]3장 카메라 스티커앱 만들기 (0) | 2022.02.17 |
AIFFEL(대전) [Fundamental] 2장 필수 교양 Part.1 (0) | 2022.02.17 |
- Total
- Today
- Yesterday
- 대전 인공지능
- Python
- 도전
- ros
- SLAM강의
- 모두의연구소
- 실내자율주행
- AIFFEL후기
- SLAM공부
- Slam
- AIFFEL
- 자율주행기술
- 인공지능
- 아이펠
- 광주
- 인공지능교육
- 자율주행로봇
- 서빙로봇
- 해커톤
- 멘탈관리
- 멋쟁이사자처럼
- AIFFEL인공지능과정
- 광주인공지능사관학교
- 광주AI
- IT
- 배달로봇
- AIFFEL교육
- 인공지능 교육
- 모두의 연구소
- 양정연SLAM
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |