কে-নিয়ারেস্ট নেইবোরস

কেএনএন এর পূর্ণ রূপ হোল কে-নিয়ারেস্ট নেইবোরস । এটি মূলত একধরনের ক্লাসিফিকেশন টাইপ অ্যালগোরিদম। নিচের ছবিটির দিকে লক্ষ্য করুন, মনেকরুন আপনার কাছে একটি ক্লাসিফিকেশন ডেটাসেট আছে। কেএনএন ক্লাসিফায়ারে আপনার ইনপুট দেয়া নতুন কোন ডেটা কোন ক্লাসে পরবে সেটা নির্ভর করবে তার আশেপাশের প্রতিবেশির সংখ্যার উপর। এই প্রতিবেশির সংখ্যাকে কে-দ্বারা প্রকাশ করা হয়।
ছবি - কেএনএন ক্লাসিফায়ার ( সম্পাদিত )
ধরুন আপনার ইনপুট দেয়া ডেটা উপরের ছবির স্টার চিহ্ন দেয়া জায়গায় অবস্থান করছে। আপনার ডেটা তাহলে কোন ক্লাসে পড়বে ?
  • আপনি যদি কে-এর মান ৩ নির্ধারণ করেন (তিনটি প্রতিবেশী) তাহলে দেখা যায় আপনার দুইটি প্রবিবেশী ক্লাস বি এবং একটি প্রতিবেশী ক্লাস এ। যেহেতু অধিকাংশ প্রতিবেশী ক্লাস বি'র তাই আমরা কে এর মান ৩ এর ক্ষেত্রে আমাদের ডেটা ক্লাস বি'র বলে ধরে নেব।
  • আপনি যদি কে-এর মান ৬ নির্ধারণ করেন (ছয়টি প্রতিবেশী) তাহলে দেখা যায় আপনার দুইটি প্রবিবেশী ক্লাস বি'র এবং চারটি প্রতিবেশী ক্লাস এ'র। যেহেতু অধিকাংশ প্রতিবেশী ক্লাস এ'র তাই আমরা কে এর মান ৬ এর ক্ষেত্রে আমাদের ডেটা ক্লাস এ'র বলে ধরে নেব।
আমাদের ডেটাসেটের জন্য কে-এর মান কত হবে সেটা জানা বেশ কষ্টকর। এজন্য বিভিন্ন কে-এর মান দিয়ে মডেলের পারফরম্যান্স তূলনা করা হয়। তবে এছাড়া আরেকটি উপায়ও আছে, আমরা একটু পড়েই দেখবো কিভাবে অপ্টিম্যাল কে-এর মান বের করতে হয়।
কে নিয়ারেস্ট নেইবোরস এর কিছু বৈশিষ্ট্য
  • কেএনএন-কে খুব সহজেই ইমপ্লিমেন্ট করা যায়, এর মাত্র দুটি প্যারামিটার রয়েছে এগুলো হচ্ছে নাম্বার অব কে এবং ডিস্ট্যান্স। •
  • কেএনএন-কে বলা হয় লেইজি অ্যালগরিদম, এটি ট্রেইনিং এর সময় কিছুই লার্ন করে না বরং প্রিডিকশনের সময় লার্ন করে।
  • এটি তুলনামূলক ধীর গতি সম্পন্ন এবং ডেটাসেটের সাইজ বড় হলে কিংবা ডাইমেশন অনেক বেশী হলে এই অ্যালগরিদমটি খুব বেশী কার্যকর নয়।
  • ডেটাসেটে নয়েজি ডেটা বা আউটলায়ার থাকলে সহজেই প্রভাবিত হয়
  • ডেটাসেটকে স্কেলাইজড করার প্রয়োজন হয়।
কেএনএন এর প্রয়োগ দেখার জন্য আমরা একটি টেলিকম কোম্পানির কাস্টমার ডেটাসেট ব্যবহার করবো। ডেটাসেটটি আইবিএম বিগডেটা ইউনিভার্সিটি থেকে সংগ্রহ করা হয়েছে। এই ডেটাসেটা টেলিকম কোম্পানির কাস্টমার/ফোন ইউজারদের ঠিকানা, বয়স , বৈবাহিক অবস্থা, চাকরির বয়স, জেন্ডার, ইনকাম ইত্যাদির উপর ভিত্তি করে চারটি ক্লাসে ভাগ করা হয়েছে। ক্লাসগুলো হচ্ছে 1- Basic Service 2- E-Service 3- Plus Service এবং 4- Total Service। আপনার কাজ হবে নতুন কোন ব্যাক্তি এই কোম্পানির কাস্টমার হলে তিনি কোন ক্লাসের হবে সেটা প্রিডিক্ট করা ?
প্রথমেই আমরা প্রয়োজনীয় লাইব্রেরী ইমপোর্ট এবং ডেটাসেট লোড করে নিচ্ছি,
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import NullFormatter
import pandas as pd
import numpy as np
import matplotlib.ticker as ticker
from sklearn import preprocessing
%matplotlib inline
url='https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-telecom-customer.csv'
df = pd.read_csv(url)
df.head()
আমাদের ডেটাসেটটি দেখতে অনেকটা এরকম,
টার্গেট ভ্যারিয়েবল এবং ফিচার ভ্যারিয়েবলস সেট করে নেব,
X = df[['region', 'tenure','age', 'marital', 'address', 'income', 'ed', 'employ','retire', 'gender', 'reside']]
y = df['custcat']
এবার টেস্ট এর জন্য ২৫% ডেটা রেখে বাকি ডেটা দিয়ে মডেল ট্রেইন করবো,
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=4)
print ('Train set:', X_train.shape, y_train.shape)
print ('Test set:', X_test.shape, y_test.shape)
আমারা আগেই বলেছিলাম কে-এর মান কত হবে সেটা বের করা কিছুটা জটিল। সাধারন ভাবে আমরা ভিন্ন ভিন্ন কে-এর মান দিয়ে ভিন্ন ভিন্ন মডেল বানাতে পারি এবং সবগুলো মডেলের পারফরম্যান্স তুলনা করে কে-এর অপ্টিম্যাল ভ্যালু বের করতে পারি। তবে এই পদ্ধতি বেশ জটিল এবং সময় সাপেক্ষ। এই জটিলতা পরিহার করার জন্য আমরা নিচের পদ্ধতি অবলম্বন করতে পারি। কোডের প্রথমেই আমরা একটি রেঞ্জ নির্ধারণ করে দেব অর্থাৎ আমাদের এই প্রোগ্রাম সর্বনিম্ন এবং সর্বোচ্চ কত সীমার ভেতরে কে-এর অপ্টিম্যাল ভ্যালু খুঁজে বের করবে তা এই রেঞ্জের উপর ভিত্তি করেই করবে।
k_range = range(1, 26)
# We can create Python dictionary using [] or dict()
scores = []
# We use a loop through the range 1 to 26
# We append the scores in the dictionary
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
scores.append(metrics.accuracy_score(y_test, y_pred))
print(scores)
plt.plot(k_range, scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Testing Accuracy')
নিচের যে ছবিটি দেখা যাচ্ছে সেখানে কে-এর বিভিন্ন মানের জন্য মডেলের অ্যাকুরেসি পাওয়া যাচ্ছে। কে-এর মান ৩ হলে অ্যাকুরেসি বাড়ে আবার ৪ এ এসে কমে যায়। এভাবে ভিন্ন ভিন্ন কে-এর মানের জন্য মডেলের অ্যাকুরেসি কখনো বাড়ে আবার কখনো কমে যায়। আমরা দেখতে পাচ্ছি কে-এর মান ৭ হলে অ্যাকুরেসি মোটামুটি ম্যাক্সিমাম হয়। সুতরাং আমরা এই ডেটাসেটের জন্য কে-এর মান ৭ নির্ধারণ করবো।
কে এর মান ৭ ধরে আমরা কে-নিয়ারেস্ট নেইবোরস মডেল তৈরি করছি,
from sklearn.neighbors import KNeighborsClassifier
k = 7
#Train Model and Predict
neigh = KNeighborsClassifier(n_neighbors = k).fit(X_train,y_train)
neigh
আমাদের মডেল এখন তৈরি। এবার অ্যাকুরেসি চেক করার পালা।
predictions = neigh.predict(X_test)
print('Classification Report:\n',classification_report(y_test, predictions))
print('Confusion Matrix:\n',confusion_matrix(y_test, predictions))
print('Accuracy Score:',accuracy_score(y_test, predictions))
আমরা দেখতে পাচ্ছি আমাদের মডেল ৩৫% নির্ভুল ভাবে প্রিডিক্ট করতে পারে। মডেল হিসাবে এই মান খুব একটা ভালো নয় !
চলুন নতুন কাস্টমার কোন ক্লাসের হবে সেটা প্রেডিক্ট করি ,
new_observation = [[2,11,0,22,0,1,40,3,5,0,1]]
neigh.predict(new_observation)
array([1])
আমরা দেখতে পেলাম আমাদের নতুন কাস্টমার 1 অর্থাৎ Basic Service ক্লাসের।