• 6주차 과제 : K-Means++

    image image

    • 사용 언어 : python
    • 해결 날짜 : 2021-11-01
    • 코드 설명 :

      • 1번 코드 설명
        • pandas의 read_csv 함수로 iris.csv 파일을 읽어오고, 0~3열의 값들은 data로, 4열의 값들은 target으로 설정한다.
        • plt.scatter를 사용하여 특징 값 네 개중 처음 두 개의 특징 값을 x축과 y축의 값으로 사용하고, target값으로 클래스(점 색깔)을 나눈다.
      • 2번 코드 설명
        • 이 전에 사용한 plt를 clf()함수로 초기화한다.
        • cluster의 개수를 3으로 지정하여 KMeans++ Clustering을 시행하고, 1번에서의 data로 훈련시킨다. 그 후 1번과 마찬가지로 scatter를 사용하여 특징 값 네 개중 처음 두 개의 특징 값을 x축과 y축의 값으로 사용하고, target값으로 방금 훈련시킨 모델의 라벨을 사용하여 점을 찍는다.
      • 3번 코드 설명
        • 2번에서와 마찬가지로 KMeans++ Clustering을 수행하되, cluster의 개수를 2,3,4,5,6으로 변화해가며 수행한다. Adjusted Rand Index(ARI)를 사용하여 실제 정답 cluster와 비교하여 평가한다. 이 결과 2일 때 0.54, 3일 때 0.73, 4일 때 0.65, 5일 때 0.62, 6일 때 0.45로 cluster의 개수가 3일 때가 적합도가 가장 높으므로 가장 적합하다고 볼 수 있다.
    • 결과 : image image image

    • 코드

      import pandas as pd
      from matplotlib import pyplot as plt
      
      df = pd.read_csv('iris.csv', header=None)
      data = df.iloc[:, :-1]
      target = df.iloc[:, -1]
      
      plt.scatter(data[0], data[1], c=target)
      plt.xlabel('feature1')
      plt.ylabel('feature2')
      plt.show()
      
      
      # In[33]:
      
      
      from sklearn.cluster import KMeans
      plt.clf()
      model_3 = KMeans(n_clusters=3, random_state=0)
      model_3.fit(data)
      
      plt.scatter(data[0], data[1], c=model_3.labels_)
      plt.show()
      
      
      # In[36]:
      
      
      from sklearn.metrics.cluster import adjusted_rand_score
      
      model_2 = KMeans(n_clusters=2, random_state=0)
      model_2.fit(data)
      
      model_4 = KMeans(n_clusters=4, random_state=0)
      model_4.fit(data)
      
      model_5 = KMeans(n_clusters=5, random_state=0)
      model_5.fit(data)
      
      model_6 = KMeans(n_clusters=6, random_state=0)
      model_6.fit(data)
      
      print("n clusters가 2일 때 : {:.2f}".format(adjusted_rand_score(model_2.labels_, target)))
      print("n clusters가 3일 때 : {:.2f}".format(adjusted_rand_score(model_3.labels_, target)))
      print("n clusters가 4일 때 : {:.2f}".format(adjusted_rand_score(model_4.labels_, target)))
      print("n clusters가 5일 때 : {:.2f}".format(adjusted_rand_score(model_5.labels_, target)))
      print("n clusters가 6일 때 : {:.2f}".format(adjusted_rand_score(model_6.labels_, target)))