কে-মিনস ক্লাস্টারিং

সাদৃশ্যতার উপর ভিত্তি করে ডেটার ভেতরে কোন গ্রুপ আছে কিনা সেটা খুঁজে বের করা হয় কে-মিনস ক্লাস্টারিং এর মাধ্যমে। এটি একটি আনসুপারভাইজড লার্নিং। আমরা অনেক সময় ক্লাস্টারিং এবং ক্লাসিফিকেশন এর বিষয়ে কনফিউজড হয়ে যাই, তবে এই বিষয় দুইটি সম্পূর্ণ আলাদা এবং প্রয়োগ ক্ষেত্রও আলাদা।

  • ক্লাসিফিকেশন - ক্লাসিফিকেশন হচ্ছে সুপারভাইজড লার্নিং। ক্লাসিফিকেশনে লেবেল ডেটার মাধ্যমে মেশিনকে ট্রেইনিং দেয়া হয়। এরপর একটি অজানা ডেটা ইনপুট দিয়ে সেটি কোন ক্লাসের তা প্রেডিক্ট করা হয়। উদাহরন হিসেবে আইরিস ডেটাসেটের কথা বলা যেতে পারে। বিভিন্ন আইরিস ফুলের বৃত্তাংশ ও পাপড়ির পরিমাপ মেশিনকে ইনপুট দেয়া হয় একই সাথে বলে দেয়া হয় ফুলটি কোন প্রজাতির ছিল। এরপর একটি অজানা ফুলের বৃত্তাংশ ও পাপড়ির পরিমাপ ইনপুট দিলে মডেল অনুমান করতে পারে নতুন ফুলটি কোন প্রজাতির।

  • ক্লাস্টারিং- ক্লাস্টারিং হচ্ছে আনসুপারভাইজড লার্নিং। এই পদ্ধতিতে মেশিনকে কোন লেবেল ডেটা দিয়ে ট্রেইনিং দেয়া হয় না, বরং মেশিন নিজ থেকেই আবিস্কার করে ডেটাগুলোর সাদৃশ্যতার উপর ভিত্তি করে এদের ভেতর কয়টি গ্রুপ রয়েছে।

কে-মিনস ক্লাস্টারিং যেভাবে করা হয়

  • প্রথমে একটি র‍্যান্ডমলি কে-এর মান নির্ধারণ করা হয় । ক্লাস্টার এর সংখ্যা কয়টি হবে সেটি কে দ্বারা প্রকাশ করা হয়।

  • প্রতিটি ক্লাস্টারের জন্য আলাদা আলাদা সেন্ট্রয়েড ভ্যালু অ্যাসাইন করা হয় । সেন্ট্রয়েড গুলোর সাথে ডেটা পয়েন্টের দূরত্ব কত সেটাও বের করা হয়।

  • সেন্ট্রয়েডগুলোর পজিশন পরিবর্তন করে ডেটাপয়েন্টে গুলোর সাথে ডিসট্যান্স পুনরায় গননা করা হয় এবং দেখা হয় এরফলে এভারেজ ডিসট্যান্স কমেছে কিনা ?

  • এভাবে উপরের ধাপগুলো বার বার করা হয় যতক্ষন না প্রতিটি ক্লাস্টারের সেন্ট্রয়েড তার ডেটা পয়েন্টের সাথে মিনিমাম ডিসট্যান্স এ না আসে।

ডিস্ট্যান্স নির্ণয়

কে-মিনস ক্লাস্টারিং-এ যেকোনো ডেটা পয়েন্টের পরস্পরের দূরত্ব নির্ণয়ের জন্য আমরা ইউক্লিডিয়ান ডিস্ট্যান্স ব্যবহার করে থাকি। নিচের উদাহরনের দিকে লক্ষ্য করলে দেখবেন দুইজন কাস্টমারের ডেটার দূরত্ব নির্ণয় করা হয়েছে। ইউক্লিডিয়ান ডিস্ট্যান্স-এ ভ্যারিয়েবলের সংখ্যা বাড়তে থাকলে আমরা কেবল বিয়োগে ভ্যারিয়েবলের সংখ্যা বাড়াতে থাকি।

কে মিনস ক্লাস্টারিং এর কিছু বৈশিষ্ট্য

  • ইমপ্লিমেন্ট করা তুলনামূলক সহজ এবং প্রাপ্ত ফলাফল ইন্টারপ্রেট করাও সহজ।

  • অপেক্ষাকৃত দ্রুত কাজ করে।

  • প্রাথমিক ভাবে সঠিক কে-এর মান নির্ণয় কষ্টকর , যদিও এলবো মেথড প্রয়োগ করে তা নির্ণয় করা সম্ভব।

  • নয়েজ এবং আউটলায়ার থাকলে মডেল প্রভাবিত হয়।

বাস্তব প্রয়োগ ক্ষেত্র

  • একাডেমিক পারফরম্যান্স ভিত্তিক ক্লাস্টার তৈরিতে

  • মার্কেটিং ,সেলস এবং কাস্টমার সেগমেন্টেশন তৈরিতে

  • ডকুমেন্টস ক্লাস্টার তৈরিতে

  • সার্চ ইঞ্জিন

  • টেলিকমিউনিকেশন ইন্ডাস্ট্রিতে

  • হেলথকেয়ার গবেষণায়

বয়স এবং আয়ের ক্লাস্টারিং

কে-মিনস ক্লাস্টারিং এর জন্য আমরা যে ডেটাসেট টি ব্যবহার করবো সেটি কিছু ব্যাক্তির বয়স এবং ইনকাম এর ডেটাসেট। আমাদের কাজ হবে বিভিন্ন মানুষদের বয়স এবং আয়ের উপর ভিত্তি করে তাদেরকে আলাদা আলাদা গ্রুপে ভাগ করা।

ডেটাসেটের বিবরন,

  • Name- ব্যাক্তির নাম

  • Age- ব্যাক্তির বয়স

  • Income- ব্যাক্তির আয়

কে-মিনস ক্লাস্টারিং এর জন্য আমরা প্রয়োজনীয় লাইব্রেরী ইমপোর্ট এবং ডেটাসেট লোড করে নেব,

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt 
from sklearn.cluster import KMeans 
%matplotlib inline
from sklearn.preprocessing import MinMaxScaler

df = pd.read_csv('https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-income-age-group.csv')
df.head()

আমাদের ডেটাসেটটি দেখতে অনেকটা এরকম,

এ পর্যায়ে আমরা Name কলামটি মুছে ফেলবো এবং dfp নামক আরেকটি ডেটাফ্রেমে তৈরি করবো।ক্যাটেগরিক্যাল ভ্যালুকে স্কেলাইজড করা যায় না এজন্যই ডেটা স্কেলাইজড করার আগে আমরা Name কলামটি মুছে ফেলবো।

dfp = df.drop('Name', axis=1)

কে-মিনস ক্লাস্টারিং এর জন্য আমাদের ডেটাসেট কে স্কেলাইজড করতে হবে। এজন্য আমরা বিভিন্ন পদ্ধতী অবলম্বন করতে পারি। তবে এখানে আমরা ম্যাক্স-মিন স্কেলার ব্যবহার করবো।

scaler = MinMaxScaler()
scaler.fit(dfp)
scaled = pd.DataFrame(scaler.transform(dfp),columns=dfp.columns)
scaled.head()

স্কেলাইজড হবার পরে আমাদের ডেটাসেটের ভ্যালুসমূহ ম্যাক্স-মিন স্কেলে পরিবর্তিত হয়ে যাবে।

কে-মিনস ক্লাস্টারিং-এ কে এর মান কত হবে বা ক্লাস্টারের সংখ্যা কয়টি হবে সেটা অনুমান করা বেশ কঠিন, তবে এলবো মেথডের মাধ্যমে আমরা সহজেই তা বের করতে পারি। এলবো মেথডে কে এর মান বের করার জন্য নিচের কোডটুক রান করতে হবে।

Sum_of_squared_distances = []
K = range(1,15)
for k in K:
    km = KMeans(n_clusters=k)
    km = km.fit(scaled)
    Sum_of_squared_distances.append(km.inertia_)

plt.plot(K, Sum_of_squared_distances, 'bx-')
plt.xlabel('k')
plt.ylabel('Sum_of_squared_distances')
plt.title('Elbow Method For Optimal k')
plt.show()

নিচের ছবির দিকে লক্ষ্য করলে দেখা যাবে কে এর মান যখন ১ থেকে ২ এ নেমেছে তখন সাম অব স্কয়ারড ডিস্ট্যান্স ৫ থেকে ২-এ নেমে এসেছে। এর পর ২ থেকে ৩ এ নামার পর এই মান ২ থেকে প্রায় ০.৫ এ নেমে এসেছে।এরপর থেকে কে এর মান কমালেও সাম অব স্কয়ারড ডিস্ট্যান্স এর মান উল্লেখযোগ্য পরিমান কমে না, অর্থাৎ ব্যাবধান খুবই কম। সুতরাং আমরা কে এর মান ৩ কে অপটিমাল ভ্যালু হিসাবে ধরে নেব।

এবার ক্লাস্টারিং অ্যালগরিদম এর মাধ্যমে আমাদের ডেটাসেটকে ৩ টি ক্লাস্টারে ভাগ করবো ( যেহেতু কে এর মার ৩ পাওয়া গেছে)

clusterNum = 3
k_means = KMeans(init = "k-means++", n_clusters = clusterNum, n_init = 12)
k_means.fit(scaled)
labels = k_means.labels_
print(labels)

আমরা চাইলে ডেটাসেটের সবগুলো রো এর সাথে ক্লাস্টার নাম্বার বসিয়ে ডেটাসেটটি দেখে নিতে পারি।

df["Cluster"] = labels
df.head(5)

এবার আমরা প্রতিটি ক্লাস্টারের গড় ভ্যালু দেখবো। এর মাধ্যমে আমরা সহজেই বুঝতে পারবো কোন ক্লাস্টারের ডেটার বৈশিষ্ট্য কেমন । আমরা এখানে দেখতে পাচ্ছি প্রথম ক্লাস্টারের ব্যাক্তিদের গড় বয়স ২৮.৩৩ বছর এবং গড় আয় ৫৮৬১১.১১ ডলার। দ্বিতীয় ক্লাস্টারের ব্যাক্তিদের গড় বয়স ৩৮.২৮ বছর এবং গড় আয় ১৫০০০০ ডলার। তৃতীয় ক্লাস্টারের ব্যাক্তিদের গড় বয়স ৪০.৫ বছর এবং গড় আয় ৬৮৬৬৬.৬৬ ডলার

df.groupby('Cluster').mean()

আমরা চাইলে কোন ক্লাস্টারে কয়টি ডেটা আছে সেটা দেখে নিতে পারি।

frame = pd.DataFrame(scaled)
frame['cluster'] = labels
frame['cluster'].value_counts()

ক্লাস্টারগুলোকে স্কাটার প্লটের মাধ্যমে ভিজুয়ালাইজ করলে আমরা আলাদা আলাদা তিনটি ডেটা গ্রুপকে দেখতে পাবো।

df1 = df[df.Cluster==0]
df2 = df[df.Cluster==1]
df3 = df[df.Cluster==2]

plt.scatter(df1.Age,df1['Income($)'],color='yellow')
plt.scatter(df2.Age,df2['Income($)'],color='red')
plt.scatter(df3.Age,df3['Income($)'],color='black')

Last updated