해당 분석글은 https://liz09045.tistory.com/94 글을 토대로 작성되었습니다.
분류(Classification) 문제로 유명한 붓꽃(Iris) 데이터셋을 분석해보자.
붓꽃(Iris)은 위와 같이 3가지의 종류(Setosa, Versicolor, Virginica)를 가지고 있다.
이제 샘플 데이터를 불러와보자.
사이키런(Sklearn)에는 머신 러닝을 쉽게 배울 수 있게 샘플 데이터셋들을 가지고 있다. 그 중에 붓꽃(Iris) 데이터셋도 있으니 이를 로드해준다. 붓꽃 데이터셋은 자료형이 딕셔너리(Dictionary)니 먼저 Key 값을 확인해주자.
[ 파이썬에는 딕셔너리라 하는 자료형이 있다. 단어 뜻이 '사전'인 것처럼, 사전처럼 이해하면 된다. "flower" 이 라는 단어에 "꽃", "grass" 라는 단어에 "잔디"라는 뜻이 부합되어 있듯, 딕셔너리는 key와 value 를 한 쌍으로 가지고 있는 자료형이다. 여기선 key가 flower과 grass, value는 꽃과 잔디가 될 것이다. 딕셔너리는 리스트나 튜플처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고, key를 통해 value를 얻는다. 이것이 바로 딕셔너리의 가장 큰 특징이다. grass이라는 단어의 뜻을 찾기 위해 사전의 내용을 순차적으로 모두 검색하는 것이 아니라 grass 라는 단어가 있는 곳만 펼쳐 보면 되는 것이다. - https://wikidocs.net/16 - ]
그럼 이제 DESCR 키(key)를 사용해 데이터셋의 정보를 확인해보자.
데이터셋에 대해 설명한 위의 정보를 통해, 총 150개의 붓꽃 샘플 데이터가 정리되어 있음과 4개의 피처(feature) [sepal length/width : 꽃받침의 길이/너비, petal length/width : 꽃잎의 길이/너비]값이 들어있음을 알 수 있다. 그리고 Class 에서 setosa, versicolur, virginica 이렇게 3가지의 붓꽃 품종이 있음을 알 수 있다. 따라서, 붓꽃을 3가지의 품종 중에서 하나의 품종으로 분류하는 다중분류 문제다.
DESCR을 통해서도 볼 수 있지만 feature_names 와 tager_nams를 통해서 피처와 레이블의 이름을 알아낼 수 있다.
Target 속성
'target' 키를 이용해 목표 변수의 데이터를 확인해보았다. 150개의 샘플 데이터에 대한 레이블(label) 값이 1차원 배열에 들어있음을 확인할 수 있다. 총 3개의 (Setosa[0], Versicolor[1], Virginica[2]) 클래스를 가지고 있다.
Data 속성
150개의 샘플 데이터를 다 부르기엔 너무 크니 잘라주었다. 위 코드는 10개의 행을 출력한 것이다([0]~[9]). [:행, :열] 을 통해 범위를 지정해 줄 수 있다.
예를 들어, [:3, :2] 로 한다면 3개의 행과 두번째 열까지만을 보겠다는 의미. 2로 지정해줘서 꽃받침(sepal)의 길이와 너비값만 볼 수 있다.
데이터 프레임 변환
데이터를 좀 더 쉽게 다루기 위해서 판다스(Pandas)의 데이터 프레임으로 변환시켜주자. 데이터 프레임으로 바꿔주는 게 보기에도 편하니.
Datframe에 그냥 data라고만 넣으면 위의 처럼 숫자로 나타내지니, columns (칼럼,열) 에 이름을 iris 딕셔너리의 속성feature_names 를 가져와 넣어준다. head(5) 는 숫자 만큼의 행을 추출할 수 있다.
Column의 이름을 편한대로 바꿔주자.
이 프레임에 target 열을 새로 추가시켜 줄 수도 있다. 보면 0번부터 4번까지의 데이터는 모두 Setosa 품종임을 알 수 있다. 열이 추가되었으니, 데이터셋의 크기도 (150,4)가 아니라 (150,5)가 된다.
데이터 탐색해보기
1. 유효값 확인하기
info() 를 통해 데이터 프레임의 기본 정보를 볼 수 있다. 보면 150개의 유효값(non-null)이 존재하고 64 비트의 실수와 정수형으로 구성되어 있음을 알 수 있다.
"유효값이란 결측값(존재하지 않는(null) 값의 일종)이 아님을 뜻한다."
isnull()을 통해서 각 데이터의 피처값이 결측값(null)인지 아닌지를 확인해 볼 수 있다. 결측값일 시 true, 아닐 시 false를 반환한다.
isnull() 에 sum()을 적용해주면, 각 열의 결측값의 총 개수를 계산해준다. 모두 0이니 결측값이 존재하지 않음을 알 수 있다.
2. 통계 정보 확인하기
describe()은 150개 샘플의 평균값, 표준편차, 최소값, 최대값 등의 통계 정보를 요약해준다
3. 중복 데이터 확인하기
dupicated() 를 통해 중복 데이터를 확인할 수 있는데, 중복되면 true를, 그렇지 않으면 false를 반환한다. sum() 을 적용해 총 몇개의 행이 중복되어 있는지 확인할 수 있다. 현재 1개의 행이 중복되어 있음을 알 수 있다.
현재 142번 데이터가 중복됨을 알 수 있다. [ loc 속성을 통해 인덱스를 기준으로 행 데이터를 추출할 수 있다.]
어떤 데이터끼리 중복되어 있는지 정보를 입력해서 확인해보았다. 칼럼의 이름에 띄어쓰기를 한 상태에서는 저런식으로 불러올 수 없으니 _ 를 붙인 이름을고 고쳐주었다.
띄어쓰기를 한 상태여도 이런식으로 값을 불러 올 수도 있긴 하다. 그치만 편하게 접근하기 위해 그냥 _ 붙인 이름을 사용하겠다.
df.drop_duplicates() 를 통해 중복데이터를 제거할 수도 있다.
4. 상관 관계 분석
corr() 을 통해 상관 계수 행렬을 출력할 수 있다.
상관관계 분석은 한 개의 변수가 다른 변수와 어느 정도의 관련성이 있는 지를 개관할 수 있는 분석 기법이라 한다...
5. 데이터 시각화하기
시각화 패키지인 맷플롯립(matplolib)과 시본(seaborn)을 불러온다.
seaborn 의 heatmap()을 이용해 상관 계수 행렬을 히트맵으로 나타냈다. 각 변수 간의 상관계수를 다른 색으로 표현하고 있는데, annnot 옵션을 사용해 상관 계수 숫자까지 표시할지 말지 정할 수 있다. true 일 시 숫자 보이기. cbar 는 그래프 옆에 컬러바를 의미하는데, 위 처럼 보이게 하고 싶으면 true 헤주면 된다.
(한국어로 칼럼을 입력했더니 그래프에 칼럼 이름 표기가 불가능해서 결국 다시 영어로 바꿈 ㅠ 역시 프로그래밍은 영어로 해야해...)
(품종 번호라 이름 지어준 칼럼도 Target으로 바꿔줬다 ㅜ)
value_counts()를 적용하면, 데이터 종류별 샘플 개수를 출력한다. 3가지의 클래스(Setosa[0], Versicolor[1], Virginica[2])에 각각 50개의 데이터가 저장되어 있음을 확인할 수 있다.
Train-Test 데이터셋 분할
모델학습에 사용한 훈련(train) 데이터와 모델성능을 평가하는데 사용돨 테스트(Test) 데이터로 분할한다. (보통 훈련:테스트 = 8: 2 의 비율로 분할한다.) 사이킷런의 train_test_split()을 사용해서 편리하게 나눌 수 있다.
분류 알고리즘- KNN (K-최근접 이웃)으로 학습 시키기
KNN(K-Nearest-Neighbors) 알고리즘은 예측하려는 데이터 x가 주어지면, 기존 데이터 중 속성이 비슷한 k개의 이웃을 먼저 찾는 알고리즘이다. 즉, x를 둘러싼 k개의 가장 가까운 이웃을 찾고, 이웃 데이터가 가장 많이 속해있는 목표 클래스르 예측값으로 결정하는 것이다. k값에 따라 모델의 예측력이 달라지므로 적절한 k값을 설정해야 한다.
-https://liz09045.tistory.com/94-
k = 7 로 KNN 모델을 정의하구 fit()으로 학습시킨다.
X_test를 predict()에 입력해 예측값을 산출해보았다.
모델의 성능 평가를 위해 사이킷런 metrics 모듈에서 accuracy_score()를 불러온다.
X_test의 정답 레이블 y_test를 예측값 y_knn_pred와 함께 입력해서 정확도를 산출했다.
k=7일 때, KNN모델은 100%의 정확도를 보인다.
시험삼아 k의 값을 1로 줄여보니 정확도가 확연히 낮아짐을 볼 수 있다.
'인공지능 > Machine & Deep Learning' 카테고리의 다른 글
가중치 규제 (Weight Regularization) ft. 과적합 해결하기 (0) | 2023.05.09 |
---|---|
Linear Regression 과 Logistic Regression (0) | 2023.05.09 |
Train data | Test data | Validation data 차이 (0) | 2023.04.19 |
과대적합(Overfitting)과 과소적합(Underfitting) (0) | 2023.04.18 |
배치 사이즈(batch size) | 에포크(epoch) | 반복(iteration) 차이 (2) | 2023.04.18 |