2020년 12월 20일 일요일

KMeans 비지도 학습 (ML, python, KMeans)

k-means clustering이란 이름에서 알 수 있듯이 주어진 데이터셋을 k개의 중심점을 기준으로 하여 그룹짓는 방법이다. 

KMeans(n_clusters=??) n_clusters 인자에 의해 몇개로 나뉠것인지 갯수를 정하게 됩니다. 

KMeans 예제는 데이터는 2개 이차원(x,y) 값이 주어지고 나누게 됩니다. 여기에서 입력으로 사용하게 되는 format은 dataframe형태이지만, list의 list형태로도 가능합니다.

https://github.com/donarts/sourcecode/blob/main/python/example/3_kmeans_random_1.py

#KMeans
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import pandas as pd
import random
x = [random.randrange(1,100) for n in range(0,100)]
y = [random.randrange(1,100) for n in range(0,100)]
data = pd.DataFrame({"x":x,"y":y})
print(data)
'''
x y
0 32 1
1 49 99
2 78 21
.. .. ..
[100 rows x 2 columns]
'''
# 모델 만들기
model = KMeans(n_clusters=3)
# 학습
model.fit(data)
# predict
predictions = model.predict(data)
# 그림을 그리기 쉽게하기 학위해서 예측 결과를 dataframe으로 만들어서 붙이기
predict = pd.DataFrame(predictions)
predict.columns=['predict']
# concatenate labels to df as a new column
r = pd.concat([data,predict],axis=1)
print(r)
'''
x y predict
0 32 1 0
1 49 99 1
2 78 21 2
.. .. .. ...
[100 rows x 3 columns]
'''
# 그림 그리기
plt.scatter(r['x'],r['y'],c=r['predict'])
plt.show()
# 임의의 하나의 데이터 입력하여 예측, input one data
prediction = model.predict([[1,100]])
print(prediction)
'''
[1]
'''


결과

Result
x y
0 5 50
1 39 38
2 20 98
3 93 2
4 16 6
.. .. ..
95 62 41
96 76 73
97 61 11
98 97 27
99 48 36
[100 rows x 2 columns]
x y predict
0 5 50 2
1 39 38 2
2 20 98 1
3 93 2 0
4 16 6 2
.. .. .. ...
95 62 41 0
96 76 73 1
97 61 11 0
98 97 27 0
99 48 36 0
[100 rows x 3 columns]
[1]


비지도 학습이라고 불리는것은 것은 예제에서 x,y값은 주어지고 해당값이 어떤 그룹에 속하는지 미리 설정하지 않기 때문입니다.(label이 없음) 그러나 생각해보면 적당한 k값을 설정하지 않으면 원하는 결과를 얻을 수 없습니다.













댓글 없음:

댓글 쓰기