비지도학습
- 정답의 유무
- 군집분석 : 타겟의 정보가 없어서, 전체를 몆 개의 군집으로 그룹화하여 각 군집의 특징의 파악하는 분석 방법론
- KMean , DBScan
- 평가지표 : 실루엣지수 , 듄 인덱스 지표
- 분석방법의 단게
- step01. 중심점을 기반으로해서 주변데이터의 분포
- step02. 밀도가 높은 방향으로 이동
- step03. 다시 주변의 분포를 확인하고 밀도가 높은 곳으로 업데이트
- step04. 더 이상 업데이트가 필요없을 때까지 반복
- step05. 최종적으로 센트로이드를 중심으로 군집을 형성
- 좋은군집이란? 실루엣지수의 평균값(0 ~ 1)이 1에 가까울 수록 좋은 군집
In [ ]:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# ai lib - sklearn
# xxxxxClassifier (분류) : 평가지표(정확도, 정밀도, 재현율, 조화평균)
# xxxxxRegression (예측)
import sklearn
from sklearn.datasets import load_iris , load_breast_cancer , fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
from sklearn.linear_model import LogisticRegression , LinearRegression , Ridge , Lasso
# 비지도학습
from sklearn.cluster import KMeans , DBSCAN
from sklearn.metrics import accuracy_score , classification_report , mean_squared_error, mean_absolute_error , silhouette_samples , silhouette_score
from sklearn.preprocessing import LabelEncoder , OneHotEncoder , StandardScaler , MinMaxScaler , Binarizer , PolynomialFeatures
print('sklearn version , ' , sklearn.__version__)
print('KMean - ')
sklearn version , 1.2.2 KMean -
In [ ]:
print('데이터 준비 - ')
uci_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00292/Wholesale%20customers%20data.csv'
frm = pd.read_csv(uci_path , header = 0 )
frm.info()
In [ ]:
frm.head()
Out[ ]:
Channel | Region | Fresh | Milk | Grocery | Frozen | Detergents_Paper | Delicassen | |
---|---|---|---|---|---|---|---|---|
0 | 2 | 3 | 12669 | 9656 | 7561 | 214 | 2674 | 1338 |
1 | 2 | 3 | 7057 | 9810 | 9568 | 1762 | 3293 | 1776 |
2 | 2 | 3 | 6353 | 8808 | 7684 | 2405 | 3516 | 7844 |
3 | 1 | 3 | 13265 | 1196 | 4221 | 6404 | 507 | 1788 |
4 | 2 | 3 | 22615 | 5410 | 7198 | 3915 | 1777 | 5185 |
In [ ]:
frm.head()
Out[ ]:
Channel | Region | Fresh | Milk | Grocery | Frozen | Detergents_Paper | Delicassen | |
---|---|---|---|---|---|---|---|---|
0 | 2 | 3 | 12669 | 9656 | 7561 | 214 | 2674 | 1338 |
1 | 2 | 3 | 7057 | 9810 | 9568 | 1762 | 3293 | 1776 |
2 | 2 | 3 | 6353 | 8808 | 7684 | 2405 | 3516 | 7844 |
3 | 1 | 3 | 13265 | 1196 | 4221 | 6404 | 507 | 1788 |
4 | 2 | 3 | 22615 | 5410 | 7198 | 3915 | 1777 | 5185 |
In [ ]:
scaler = StandardScaler()
scalerFrm = scaler.fit(frm).transform(frm)
In [ ]:
scalerFrm
Out[ ]:
array([[ 1.44865163, 0.59066829, 0.05293319, ..., -0.58936716, -0.04356873, -0.06633906], [ 1.44865163, 0.59066829, -0.39130197, ..., -0.27013618, 0.08640684, 0.08915105], [ 1.44865163, 0.59066829, -0.44702926, ..., -0.13753572, 0.13323164, 2.24329255], ..., [ 1.44865163, 0.59066829, 0.20032554, ..., -0.54337975, 2.51121768, 0.12145607], [-0.69029709, 0.59066829, -0.13538389, ..., -0.41944059, -0.56977032, 0.21304614], [-0.69029709, 0.59066829, -0.72930698, ..., -0.62009417, -0.50488752, -0.52286938]])
In [ ]:
clustering = KMeans(n_clusters=5)
clustering.fit(scalerFrm)
/usr/local/lib/python3.10/dist-packages/sklearn/cluster/_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning warnings.warn(
Out[ ]:
KMeans(n_clusters=5)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KMeans(n_clusters=5)
In [ ]:
cluster_label = clustering.labels_
cluster_label
In [ ]:
frm['cluster_label'] = clustering.labels_
frm
Out[ ]:
Channel | Region | Fresh | Milk | Grocery | Frozen | Detergents_Paper | Delicassen | cluster_label | |
---|---|---|---|---|---|---|---|---|---|
0 | 2 | 3 | 12669 | 9656 | 7561 | 214 | 2674 | 1338 | 3 |
1 | 2 | 3 | 7057 | 9810 | 9568 | 1762 | 3293 | 1776 | 3 |
2 | 2 | 3 | 6353 | 8808 | 7684 | 2405 | 3516 | 7844 | 3 |
3 | 1 | 3 | 13265 | 1196 | 4221 | 6404 | 507 | 1788 | 2 |
4 | 2 | 3 | 22615 | 5410 | 7198 | 3915 | 1777 | 5185 | 3 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
435 | 1 | 3 | 29703 | 12051 | 16027 | 13135 | 182 | 2204 | 2 |
436 | 1 | 3 | 39228 | 1431 | 764 | 4510 | 93 | 2346 | 2 |
437 | 2 | 3 | 14531 | 15488 | 30243 | 437 | 14841 | 1867 | 3 |
438 | 1 | 3 | 10290 | 1981 | 2232 | 1038 | 168 | 2125 | 2 |
439 | 1 | 3 | 2787 | 1698 | 2510 | 65 | 477 | 52 | 2 |
440 rows × 9 columns
In [ ]:
frm.plot(kind = 'scatter' , x = 'Grocery' , y = 'Frozen' ,
cmap = 'Set1' , colorbar = True , figsize=(15,5) ,
c='cluster_label')
plt.show()
plt.close()
In [ ]:
frm.plot(kind = 'scatter' , x = 'Milk' , y = 'Delicassen' ,
cmap = 'Set1' , colorbar = True , figsize=(15,5),
c='cluster_label')
plt.show()
plt.close()
In [ ]:
print('실루엣 계수를 이용한 군집평가 - ')
score_samples = silhouette_samples(scalerFrm , frm['cluster_label'])
print('type - ' , type(score_samples) , score_samples.shape)
print(score_samples[:5])
실루엣 계수를 이용한 군집평가 - type - <class 'numpy.ndarray'> (440,) [0.35404798 0.41605805 0.21189084 0.422231 0.13755443]
In [ ]:
frm['silhouette_coeff'] = score_samples
frm
In [ ]:
avg_score = silhouette_score(scalerFrm , frm['cluster_label'])
print(avg_score)
0.3507517883607992
In [ ]:
frm.groupby(by='cluster_label')['silhouette_coeff'].mean()
Out[ ]:
cluster_label 0 0.303992 1 0.183587 2 0.387684 3 0.351213 4 -0.111757 Name: silhouette_coeff, dtype: float64
In [ ]:
print('코랩에서 파일 업로드 - ')
from google.colab import files
tmp_file = files.upload()
코랩에서 파일 업로드 -
Saving middle_shcool_graduates_report.xlsx to middle_shcool_graduates_report.xlsx
In [ ]:
datasets = pd.read_excel('./middle_shcool_graduates_report.xlsx')
In [ ]:
datasets.head()
Out[ ]:
Unnamed: 0 | 지역 | 학교명 | 코드 | 유형 | 주야 | 남학생수 | 여학생수 | 일반고 | 특성화고 | ... | 외고_국제고 | 예고_체고 | 마이스터고 | 자사고 | 자공고 | 기타진학 | 취업 | 미상 | 위도 | 경도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 성북구 | 서울대학교사범대학부설중학교 | 3 | 국립 | 주간 | 277 | 0 | 0.585 | 0.148 | ... | 0.007 | 0.000 | 0.011 | 0.227 | 0.000 | 0.004 | 0 | 0.000 | 37.594942 | 127.038909 |
1 | 1 | 종로구 | 서울대학교사범대학부설여자중학교 | 3 | 국립 | 주간 | 0 | 256 | 0.680 | 0.199 | ... | 0.035 | 0.008 | 0.000 | 0.043 | 0.004 | 0.031 | 0 | 0.000 | 37.577473 | 127.003857 |
2 | 2 | 강남구 | 개원중학교 | 3 | 공립 | 주간 | 170 | 152 | 0.817 | 0.047 | ... | 0.012 | 0.003 | 0.006 | 0.090 | 0.003 | 0.009 | 0 | 0.003 | 37.491637 | 127.071744 |
3 | 3 | 강남구 | 개포중학교 | 3 | 공립 | 주간 | 83 | 72 | 0.755 | 0.097 | ... | 0.013 | 0.019 | 0.019 | 0.065 | 0.000 | 0.019 | 0 | 0.000 | 37.480439 | 127.062201 |
4 | 4 | 서초구 | 경원중학교 | 3 | 공립 | 주간 | 199 | 212 | 0.669 | 0.017 | ... | 0.010 | 0.005 | 0.000 | 0.282 | 0.000 | 0.010 | 0 | 0.000 | 37.510750 | 127.008900 |
5 rows × 21 columns
In [ ]:
datasets.columns
Out[ ]:
Index(['Unnamed: 0', '지역', '학교명', '코드', '유형', '주야', '남학생수', '여학생수', '일반고', '특성화고', '과학고', '외고_국제고', '예고_체고', '마이스터고', '자사고', '자공고', '기타진학', '취업', '미상', '위도', '경도'], dtype='object')
In [ ]:
datasets.drop('Unnamed: 0' , axis = 1 , inplace = True)
In [ ]:
datasets.head()
Out[ ]:
지역 | 학교명 | 코드 | 유형 | 주야 | 남학생수 | 여학생수 | 일반고 | 특성화고 | 과학고 | 외고_국제고 | 예고_체고 | 마이스터고 | 자사고 | 자공고 | 기타진학 | 취업 | 미상 | 위도 | 경도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 성북구 | 서울대학교사범대학부설중학교 | 3 | 국립 | 주간 | 277 | 0 | 0.585 | 0.148 | 0.018 | 0.007 | 0.000 | 0.011 | 0.227 | 0.000 | 0.004 | 0 | 0.000 | 37.594942 | 127.038909 |
1 | 종로구 | 서울대학교사범대학부설여자중학교 | 3 | 국립 | 주간 | 0 | 256 | 0.680 | 0.199 | 0.000 | 0.035 | 0.008 | 0.000 | 0.043 | 0.004 | 0.031 | 0 | 0.000 | 37.577473 | 127.003857 |
2 | 강남구 | 개원중학교 | 3 | 공립 | 주간 | 170 | 152 | 0.817 | 0.047 | 0.009 | 0.012 | 0.003 | 0.006 | 0.090 | 0.003 | 0.009 | 0 | 0.003 | 37.491637 | 127.071744 |
3 | 강남구 | 개포중학교 | 3 | 공립 | 주간 | 83 | 72 | 0.755 | 0.097 | 0.013 | 0.013 | 0.019 | 0.019 | 0.065 | 0.000 | 0.019 | 0 | 0.000 | 37.480439 | 127.062201 |
4 | 서초구 | 경원중학교 | 3 | 공립 | 주간 | 199 | 212 | 0.669 | 0.017 | 0.007 | 0.010 | 0.005 | 0.000 | 0.282 | 0.000 | 0.010 | 0 | 0.000 | 37.510750 | 127.008900 |
In [ ]:
X = datasets.loc[ : , ['과학고', '외고_국제고' , '자사고'] ]
X
In [ ]:
print('정규화 - 스케일된 설명변수 ')
scaler_X = StandardScaler().fit(X).transform(X)
scaler_X
정규화 -
Out[ ]:
array([[ 2.02375287, -0.57972902, 1.84751715], [-0.65047921, 1.84782097, -0.48039958], [ 0.68663683, -0.14623795, 0.11423133], ..., [-0.65047921, -1.18661652, -1.0244236 ], [-0.65047921, -1.18661652, -1.0244236 ], [-0.65047921, 0.89414062, -0.89790638]])
In [ ]:
print('DBSCAN - 밀도기반 클러스터링 알고리즘 - ')
print('DBSCAN - 클러스터 개수를 미지 지정할 필요가 없다 - ')
print('DBSCAN - 어떤 클래스에도 속하지 않는 포인트를 생성해서 유클리디언 거리값 계산 ')
print('DBSCAN - min_samples(포인트의 중심에 있는 표본 수 ) , eps(유클리디언 거리값 계산된 값을 측정해서 포인트의 중심) - ')
dbscan = DBSCAN(eps=0.2 , min_samples = 5)
dbscan.fit(scaler_X)
print(dbscan.labels_)
In [ ]:
cluster_label = dbscan.labels_
cluster_label_predict = dbscan.fit_predict(scaler_X)
In [ ]:
print('type - ' , type(cluster_label))
print('type - ' , type(cluster_label_predict))
print(cluster_label[:5])
print(cluster_label_predict[:5])
type - <class 'numpy.ndarray'> type - <class 'numpy.ndarray'> [-1 0 0 1 -1] [-1 0 0 1 -1]
In [ ]:
X['cluster_label'] = cluster_label
X
Out[ ]:
과학고 | 외고_국제고 | 자사고 | cluster_label | |
---|---|---|---|---|
0 | 0.018 | 0.007 | 0.227 | -1 |
1 | 0.000 | 0.035 | 0.043 | 0 |
2 | 0.009 | 0.012 | 0.090 | 0 |
3 | 0.013 | 0.013 | 0.065 | 1 |
4 | 0.007 | 0.010 | 0.282 | -1 |
... | ... | ... | ... | ... |
410 | 0.000 | 0.000 | 0.000 | 0 |
411 | 0.000 | 0.000 | 0.000 | 0 |
412 | 0.000 | 0.000 | 0.000 | 0 |
413 | 0.000 | 0.000 | 0.000 | 0 |
414 | 0.000 | 0.024 | 0.010 | 0 |
415 rows × 4 columns
Deep Learning (Artificial Neural Network ) : ANN, DNN
- Perceptron(층)
- 입력층 - 은닉층 - 출력층
- MLP(Multi Layer Perception)
- classification MLP , regression MLP , clustering MLP
- CNN(이미지) , RNN(자연어)
- 뉴런(손실함수 : NN 예측이 얼마나 잘 맞는지 측정하는 역할)
- 뉴런(활성화함수 : 예측값을 개선할 수 있도록 최적화된 계산을 수행하는 알고리즘)
In [ ]:
'데이터 분석 > 머신러닝' 카테고리의 다른 글
코랩을 이용한 머신러닝 기초 day06 (0) | 2023.11.08 |
---|---|
코랩을 이용한 머신러닝 기초 day05 (0) | 2023.11.08 |
코랩을 이용한 머신러닝 기초 day03 (0) | 2023.11.01 |
코랩을 이용한 머신러닝 기초 day02 (0) | 2023.11.01 |
코랩을 이용한 머신러닝 기초 day01 (0) | 2023.11.01 |