Python-এ Scikit-Learn সহ DBSCAN

Python-এ Scikit-Learn সহ DBSCAN

ভূমিকা

আপনি ডাটা সায়েন্টিস হিসাবে একটি পরামর্শকারী সংস্থায় কাজ করছেন। আপনাকে বর্তমানে যে প্রজেক্টের জন্য নিয়োগ করা হয়েছে তাতে সেই ছাত্রদের ডেটা রয়েছে যারা সম্প্রতি ফিনান্স বিষয়ে কোর্স শেষ করেছে। যে আর্থিক কোম্পানীটি কোর্সগুলি পরিচালনা করে তারা বুঝতে চায় যে সাধারণ কারণগুলি রয়েছে যা ছাত্রদের একই কোর্স কিনতে বা বিভিন্ন কোর্স কেনার জন্য প্রভাবিত করে। এই বিষয়গুলি বোঝার মাধ্যমে, কোম্পানি একটি ছাত্র প্রোফাইল তৈরি করতে পারে, প্রোফাইল দ্বারা প্রতিটি ছাত্রকে শ্রেণীবদ্ধ করতে পারে এবং কোর্সের একটি তালিকা সুপারিশ করতে পারে।

বিভিন্ন ছাত্র গোষ্ঠীর ডেটা পরিদর্শন করার সময়, আপনি নীচের 1, 2 এবং 3-এর মতো তিনটি পয়েন্টের মধ্যে এসেছেন:

Python PlatoBlockchain ডেটা ইন্টেলিজেন্সে Scikit-Learn সহ DBSCAN। উল্লম্ব অনুসন্ধান. আ.

লক্ষ্য করুন যে প্লট 1-এ, একটি অর্ধ বৃত্তে বেগুনি বিন্দু সংগঠিত আছে, সেই বৃত্তের ভিতরে গোলাপী বিন্দুর ভর, সেই অর্ধবৃত্তের বাইরে কমলা বিন্দুর সামান্য ঘনত্ব এবং পাঁচটি ধূসর বিন্দু যা অন্য সব থেকে দূরে।

প্লট 2-এ, বেগুনি বিন্দুর একটি বৃত্তাকার ভর, কমলা বিন্দুর আরেকটি, এবং চারটি ধূসর বিন্দু রয়েছে যা অন্য সব থেকে অনেক দূরে।

এবং প্লট 3-এ, আমরা চারটি বিন্দুর ঘনত্ব দেখতে পাচ্ছি, বেগুনি, নীল, কমলা, গোলাপী এবং আরও তিনটি দূরবর্তী ধূসর বিন্দু।

এখন, আপনি যদি এমন একটি মডেল বেছে নেন যা নতুন ছাত্রের ডেটা বুঝতে পারে এবং অনুরূপ গোষ্ঠীগুলি নির্ধারণ করতে পারে, তাহলে কি একটি ক্লাস্টারিং অ্যালগরিদম আছে যা এই ধরনের ডেটাতে আকর্ষণীয় ফলাফল দিতে পারে?

প্লট বর্ণনা করার সময়, আমরা এর মতো শর্তাবলী উল্লেখ করেছি বিন্দুর ভর এবং পয়েন্টের ঘনত্ব, নির্দেশ করে যে সমস্ত গ্রাফে বৃহত্তর ঘনত্বের ক্ষেত্র রয়েছে৷ আমরাও উল্লেখ করেছি বিজ্ঞপ্তি এবং অর্ধবৃত্তাকার আকৃতি, যা একটি সরল রেখা অঙ্কন করে বা শুধুমাত্র নিকটতম বিন্দু পরীক্ষা করে সনাক্ত করা কঠিন। উপরন্তু, কিছু দূরবর্তী পয়েন্ট রয়েছে যা সম্ভবত প্রধান ডেটা বিতরণ থেকে বিচ্যুত হয়, আরও চ্যালেঞ্জ প্রবর্তন করে বা গোলমাল গ্রুপ নির্ধারণ করার সময়।

একটি ঘনত্ব-ভিত্তিক অ্যালগরিদম যা শব্দ ফিল্টার করতে পারে, যেমন DBSCAN (Dসংবেদনশীলতা-Bঅবরোধ Sপটীয় Clustering of Aসঙ্গে অ্যাপ্লিকেশন Noise), ঘন এলাকা, বৃত্তাকার আকৃতি এবং শব্দ সহ পরিস্থিতির জন্য একটি শক্তিশালী পছন্দ।

DBSCAN সম্পর্কে

DBSCAN হল গবেষণায় সবচেয়ে উদ্ধৃত অ্যালগরিদমগুলির মধ্যে একটি, এটির প্রথম প্রকাশনা 1996 সালে প্রদর্শিত হয়, এটি হল আসল DBSCAN কাগজ. গবেষণাপত্রে, গবেষকরা প্রদর্শন করে যে কীভাবে অ্যালগরিদম অ-রৈখিক স্থানিক ক্লাস্টারগুলি সনাক্ত করতে পারে এবং দক্ষতার সাথে উচ্চ মাত্রার সাথে ডেটা পরিচালনা করতে পারে।

DBSCAN এর পিছনে মূল ধারণাটি হল যে ন্যূনতম সংখ্যক পয়েন্ট রয়েছে যা একটি নির্ধারিত দূরত্বের মধ্যে হবে বা ব্যাসার্ধ সবচেয়ে "কেন্দ্রীয়" ক্লাস্টার পয়েন্ট থেকে, বলা হয় মূল পয়েন্ট. সেই ব্যাসার্ধের মধ্যে থাকা বিন্দুগুলি হল আশেপাশের বিন্দু এবং সেই পাড়ার প্রান্তের বিন্দুগুলি হল সীমান্ত পয়েন্ট or সীমানা পয়েন্ট. ব্যাসার্ধ বা প্রতিবেশী দূরত্ব বলা হয় epsilon পাড়া, ε-প্রতিবেশী অথবা শুধুই ε (গ্রীক অক্ষর এপিসিলনের প্রতীক)।

অতিরিক্তভাবে, যখন এমন পয়েন্ট থাকে যেগুলি মূল পয়েন্ট বা সীমানা বিন্দু নয় কারণ তারা একটি নির্ধারিত ক্লাস্টারের অন্তর্গত হওয়ার জন্য ব্যাসার্ধ অতিক্রম করে এবং একটি মূল বিন্দু হওয়ার জন্য ন্যূনতম সংখ্যক পয়েন্টও থাকে না, তখন সেগুলি বিবেচনা করা হয় গোলমাল পয়েন্ট.

এর মানে আমাদের তিনটি ভিন্ন ধরনের পয়েন্ট আছে, যথা, কোর, সীমান্ত এবং গোলমাল. তদ্ব্যতীত, এটি লক্ষ করা গুরুত্বপূর্ণ যে মূল ধারণাটি মৌলিকভাবে একটি ব্যাসার্ধ বা দূরত্বের উপর ভিত্তি করে, যা DBSCAN -কে বেশিরভাগ ক্লাস্টারিং মডেলের মতো - সেই দূরত্ব মেট্রিকের উপর নির্ভর করে। এই মেট্রিক হতে পারে ইউক্লিডীয়, ম্যানহাটন, মহালানোবিস এবং আরও অনেক কিছু। অতএব, ডেটার প্রেক্ষাপট বিবেচনা করে একটি উপযুক্ত দূরত্বের মেট্রিক নির্বাচন করা অত্যন্ত গুরুত্বপূর্ণ। উদাহরণস্বরূপ, আপনি যদি একটি GPS থেকে ড্রাইভিং দূরত্বের ডেটা ব্যবহার করেন, তাহলে ম্যানহাটনের দূরত্বের মতো রাস্তার লেআউটগুলিকে বিবেচনায় নেওয়া একটি মেট্রিক ব্যবহার করা আকর্ষণীয় হতে পারে।

Python PlatoBlockchain ডেটা ইন্টেলিজেন্সে Scikit-Learn সহ DBSCAN। উল্লম্ব অনুসন্ধান. আ.

বিঃদ্রঃ: যেহেতু DBSCAN সেই পয়েন্টগুলিকে ম্যাপ করে যেগুলি গোলমাল তৈরি করে, তাই এটি একটি বহিরাগত সনাক্তকরণ অ্যালগরিদম হিসাবেও ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, আপনি যদি নির্ধারণ করার চেষ্টা করেন কোন ব্যাঙ্কের লেনদেনগুলি প্রতারণামূলক হতে পারে এবং প্রতারণামূলক লেনদেনের হার কম, তাহলে সেই পয়েন্টগুলি সনাক্ত করার জন্য DBSCAN একটি সমাধান হতে পারে৷

মূল বিন্দু খুঁজে বের করতে, DBSCAN প্রথমে এলোমেলোভাবে একটি বিন্দু নির্বাচন করবে, তার ε-প্রতিবেশীর মধ্যে সমস্ত পয়েন্ট ম্যাপ করবে এবং নির্বাচিত পয়েন্টের প্রতিবেশীর সংখ্যার সাথে ন্যূনতম পয়েন্টের সংখ্যার তুলনা করবে। নির্বাচিত বিন্দুতে ন্যূনতম পয়েন্টের চেয়ে সমান সংখ্যা বা বেশি প্রতিবেশী থাকলে, এটি একটি মূল পয়েন্ট হিসাবে চিহ্নিত করা হবে। এই মূল পয়েন্ট এবং এর আশেপাশের পয়েন্টগুলি প্রথম ক্লাস্টার গঠন করবে।

অ্যালগরিদম তারপর প্রথম ক্লাস্টারের প্রতিটি বিন্দু পরীক্ষা করবে এবং দেখবে যে এটিতে ε-এর মধ্যে ন্যূনতম সংখ্যক পয়েন্টের চেয়ে সমান সংখ্যা বা বেশি প্রতিবেশী পয়েন্ট আছে কিনা। যদি এটি হয়, সেই প্রতিবেশী পয়েন্টগুলিও প্রথম ক্লাস্টারে যোগ করা হবে। এই প্রক্রিয়াটি চলতে থাকবে যতক্ষণ না প্রথম ক্লাস্টারের পয়েন্টে ε-এর মধ্যে ন্যূনতম পয়েন্টের চেয়ে কম প্রতিবেশী না থাকে। যখন এটি ঘটবে, অ্যালগরিদম সেই ক্লাস্টারে পয়েন্ট যোগ করা বন্ধ করে দেয়, সেই ক্লাস্টারের বাইরে অন্য একটি কোর পয়েন্ট সনাক্ত করে এবং সেই নতুন কোর পয়েন্টের জন্য একটি নতুন ক্লাস্টার তৈরি করে।

DBSCAN তারপর দ্বিতীয় ক্লাস্টারের একটি নতুন কোর পয়েন্টের সাথে সংযুক্ত সমস্ত পয়েন্ট খুঁজে বের করার প্রথম ক্লাস্টার প্রক্রিয়াটি পুনরাবৃত্তি করবে যতক্ষণ না সেই ক্লাস্টারে আর কোনো পয়েন্ট যোগ করতে হবে না। এটি তারপরে অন্য একটি মূল পয়েন্টের মুখোমুখি হবে এবং একটি তৃতীয় ক্লাস্টার তৈরি করবে, অথবা এটি এমন সমস্ত পয়েন্টের মাধ্যমে পুনরাবৃত্তি করবে যা এটি আগে দেখেনি। যদি এই বিন্দুগুলি একটি ক্লাস্টার থেকে ε দূরত্বে থাকে তবে সেগুলি সেই ক্লাস্টারে যুক্ত হয়ে বর্ডার পয়েন্টে পরিণত হয়। যদি সেগুলি না থাকে তবে সেগুলিকে নয়েজ পয়েন্ট হিসাবে বিবেচনা করা হয়।

উপদেশ: DBSCAN এর পিছনে ধারণার সাথে জড়িত অনেক নিয়ম এবং গাণিতিক প্রদর্শন রয়েছে, আপনি যদি আরও গভীরে খনন করতে চান তবে আপনি মূল কাগজটি দেখতে চাইতে পারেন, যা উপরে লিঙ্ক করা আছে।

DBSCAN অ্যালগরিদম কীভাবে কাজ করে তা জানা আকর্ষণীয়, যদিও, সৌভাগ্যবশত, অ্যালগরিদম কোড করার কোনো প্রয়োজন নেই, একবার পাইথনের স্কিট-লার্ন লাইব্রেরিতে ইতিমধ্যেই একটি বাস্তবায়ন হয়ে গেছে।

চলুন দেখা যাক এটা কিভাবে কাজ করে!

ক্লাস্টারিংয়ের জন্য ডেটা আমদানি করা হচ্ছে

বাস্তবে DBSCAN কীভাবে কাজ করে তা দেখতে, আমরা প্রকল্পগুলিকে কিছুটা পরিবর্তন করব এবং একটি ছোট গ্রাহক ডেটাসেট ব্যবহার করব যার জেনার, বয়স, বার্ষিক আয়, এবং 200 জন গ্রাহকের খরচের স্কোর রয়েছে।

ব্যয়ের স্কোর 0 থেকে 100 এর মধ্যে থাকে এবং এটি প্রতিনিধিত্ব করে যে একজন ব্যক্তি 1 থেকে 100 এর স্কেলে কতবার একটি মলে অর্থ ব্যয় করে। অন্য কথায়, যদি একজন গ্রাহকের স্কোর 0 থাকে, তবে তারা কখনই অর্থ ব্যয় করে, এবং যদি স্কোর হয় 100, তারা সবচেয়ে বেশি খরচ করে।

বিঃদ্রঃ: আপনি ডেটাসেট ডাউনলোড করতে পারেন এখানে.

ডেটাসেট ডাউনলোড করার পরে, আপনি দেখতে পাবেন যে এটি একটি CSV (কমা দ্বারা পৃথক মান) ফাইল shopping-data.csv, আমরা পান্ডাস ব্যবহার করে এটি একটি ডেটাফ্রেমে লোড করব এবং এটিতে সংরক্ষণ করব customer_data পরিবর্তনশীল:

import pandas as pd path_to_file = '../../datasets/dbscan/dbscan-with-python-and-scikit-learn-shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

আমাদের ডেটার প্রথম পাঁচটি সারি দেখার জন্য, আপনি কার্যকর করতে পারেন customer_data.head():

এর ফলে:

 CustomerID Genre Age Annual Income (k$) Spending Score (1-100)
0 1 Male 19 15 39
1 2 Male 21 15 81
2 3 Female 20 16 6
3 4 Female 23 16 77
4 5 Female 31 17 40

ডেটা পরীক্ষা করে, আমরা গ্রাহক আইডি নম্বর, জেনার, বয়স, k$-এ আয় এবং খরচের স্কোর দেখতে পারি। মনে রাখবেন যে এই ভেরিয়েবলগুলির কিছু বা সমস্ত মডেল ব্যবহার করা হবে। উদাহরণস্বরূপ, যদি আমরা ব্যবহার করতাম Age এবং Spending Score (1-100) DBSCAN-এর ভেরিয়েবল হিসাবে, যা একটি দূরত্ব মেট্রিক ব্যবহার করে, বিকৃতির প্রবর্তন এড়াতে তাদের একটি সাধারণ স্কেলে নিয়ে আসা গুরুত্বপূর্ণ Age বছরে পরিমাপ করা হয় এবং Spending Score (1-100) 0 থেকে 100 পর্যন্ত একটি সীমিত পরিসর রয়েছে। এর মানে হল যে আমরা কিছু ধরণের ডেটা স্কেলিং করব।

ডেটার ধরন সামঞ্জস্যপূর্ণ কিনা তা দেখে এবং পান্ডা-এর নির্বাহের মাধ্যমে চিকিত্সা করা প্রয়োজন এমন কোনও অনুপস্থিত মান রয়েছে কিনা তা যাচাই করে আমরা স্কেলিং বাদ দিয়ে ডেটার আরও প্রি-প্রসেসিংয়ের প্রয়োজন আছে কিনা তাও পরীক্ষা করতে পারি। info() পদ্ধতি:

customer_data.info()

এটি প্রদর্শন করে:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 CustomerID 200 non-null int64 1 Genre 200 non-null object 2 Age 200 non-null int64 3 Annual Income (k$) 200 non-null int64 4 Spending Score (1-100) 200 non-null int64 dtypes: int64(4), object(1)
memory usage: 7.9+ KB

আমরা লক্ষ্য করতে পারি যে কোনও অনুপস্থিত মান নেই কারণ প্রতিটি গ্রাহক বৈশিষ্ট্যের জন্য 200টি নন-নাল এন্ট্রি রয়েছে। আমরা আরও দেখতে পারি যে শুধুমাত্র জেনার কলামে পাঠ্য বিষয়বস্তু রয়েছে, কারণ এটি একটি শ্রেণীগত পরিবর্তনশীল, যা প্রদর্শিত হয় object, এবং অন্যান্য সমস্ত বৈশিষ্ট্য সংখ্যাসূচক, প্রকারের int64. এইভাবে, ডেটা টাইপের ধারাবাহিকতা এবং শূন্য মানগুলির অনুপস্থিতির ক্ষেত্রে, আমাদের ডেটা আরও বিশ্লেষণের জন্য প্রস্তুত।

আমরা ডেটা কল্পনা করতে এগিয়ে যেতে পারি এবং DBSCAN-এ কোন বৈশিষ্ট্যগুলি ব্যবহার করা আকর্ষণীয় হবে তা নির্ধারণ করতে পারি। এই বৈশিষ্ট্যগুলি নির্বাচন করার পরে, আমরা সেগুলি স্কেল করতে পারি।

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

ডেটা ভিজ্যুয়ালাইজ করা

Seaborn এর ব্যবহার করে pairplot(), আমরা বৈশিষ্ট্যগুলির প্রতিটি সমন্বয়ের জন্য একটি স্ক্যাটার গ্রাফ প্লট করতে পারি। থেকে CustomerID এটি শুধুমাত্র একটি শনাক্তকরণ এবং একটি বৈশিষ্ট্য নয়, আমরা এটি দিয়ে সরিয়ে দেব৷ drop() প্লট করার আগে:

import seaborn as sns customer_data = customer_data.drop('CustomerID', axis=1) sns.pairplot(customer_data);

এই আউটপুট:

Python PlatoBlockchain ডেটা ইন্টেলিজেন্সে Scikit-Learn সহ DBSCAN। উল্লম্ব অনুসন্ধান. আ.

দ্বারা উত্পাদিত বৈশিষ্ট্য সমন্বয় এ খুঁজছেন যখন pairplot, এর গ্রাফ Annual Income (k$) সঙ্গে Spending Score (1-100) প্রায় 5 টি গ্রুপ পয়েন্ট প্রদর্শন করে বলে মনে হচ্ছে। এটি বৈশিষ্ট্যগুলির সবচেয়ে প্রতিশ্রুতিশীল সমন্বয় বলে মনে হচ্ছে। আমরা তাদের নামের সাথে একটি তালিকা তৈরি করতে পারি, তাদের থেকে নির্বাচন করতে পারি customer_data DataFrame, এবং নির্বাচন সংরক্ষণ করুন customer_data আমাদের ভবিষ্যতের মডেলে ব্যবহারের জন্য আবার পরিবর্তনশীল।

selected_cols = ['Annual Income (k$)', 'Spending Score (1-100)']
customer_data = customer_data[selected_cols]

কলাম নির্বাচন করার পর, আমরা পূর্ববর্তী বিভাগে আলোচিত স্কেলিং সম্পাদন করতে পারি। বৈশিষ্ট্যগুলিকে একই স্কেলে আনতে বা মানিক করা তাদের, আমরা Scikit-Learn's আমদানি করতে পারি StandardScaler, এটি তৈরি করুন, এর গড় এবং মানক বিচ্যুতি গণনা করার জন্য আমাদের ডেটা ফিট করুন এবং এর গড় বিয়োগ করে এবং স্ট্যান্ডার্ড বিচ্যুতি দ্বারা ভাগ করে ডেটা রূপান্তর করুন। এটি দিয়ে এক ধাপে করা যেতে পারে fit_transform() পদ্ধতি:

from sklearn.preprocessing import StandardScaler ss = StandardScaler() scaled_data = ss.fit_transform(customer_data)

ভেরিয়েবলগুলি এখন স্কেল করা হয়েছে, এবং আমরা কেবল বিষয়বস্তু মুদ্রণ করে সেগুলি পরীক্ষা করতে পারি scaled_data পরিবর্তনশীল বিকল্পভাবে, আমরা তাদের একটি নতুন যোগ করতে পারি scaled_customer_data কলামের নাম সহ ডেটাফ্রেম এবং ব্যবহার করুন head() আবার পদ্ধতি:

scaled_customer_data = pd.DataFrame(columns=selected_cols, data=scaled_data)
scaled_customer_data.head()

এই আউটপুট:

 Annual Income (k$) Spending Score (1-100)
0 -1.738999 -0.434801
1 -1.738999 1.195704
2 -1.700830 -1.715913
3 -1.700830 1.040418
4 -1.662660 -0.395980 

এই ডেটা ক্লাস্টারিংয়ের জন্য প্রস্তুত! DBSCAN প্রবর্তন করার সময়, আমরা ন্যূনতম পয়েন্ট এবং epsilon উল্লেখ করেছি। মডেল তৈরি করার আগে এই দুটি মান নির্বাচন করা প্রয়োজন। দেখা যাক কিভাবে এটা করা হয়.

ন্যূনতম নির্বাচন করা হচ্ছে। নমুনা এবং এপসিলন

DBSCAN ক্লাস্টারিংয়ের জন্য ন্যূনতম সংখ্যক পয়েন্ট বেছে নেওয়ার জন্য, একটি অঙ্গুষ্ঠের নিয়ম রয়েছে, যা বলে যে এটি ডেটা প্লাস ওয়ানের মাত্রার সংখ্যার সমান বা বেশি হতে হবে, যেমন:

$$
পাঠ্য{মিনিট পয়েন্ট} >= পাঠ্য{ডেটা মাত্রা} + 1
$$

ডাইমেনশন হল ডেটাফ্রেমের কলামের সংখ্যা, আমরা 2টি কলাম ব্যবহার করছি, তাই মিন. পয়েন্ট 2+1 হওয়া উচিত, যা 3 বা তার বেশি। এই উদাহরণের জন্য, এর ব্যবহার করা যাক 5 মিনিট. পয়েন্ট.

$$
টেক্সট{5 (মিনিট পয়েন্ট)} >= টেক্সট{2 (ডেটা ডাইমেনশন)} + 1
$$

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

এখন, ε-এর মান নির্বাচন করার জন্য একটি পদ্ধতি আছে যেখানে a নিকটতম প্রতিবেশী অ্যালগরিদম প্রতিটি বিন্দুর জন্য নিকটতম বিন্দুর পূর্বনির্ধারিত সংখ্যার দূরত্ব খুঁজে বের করার জন্য নিযুক্ত করা হয়। প্রতিবেশীদের এই পূর্বনির্ধারিত সংখ্যা হল মিন। পয়েন্টগুলি আমরা সবেমাত্র বিয়োগ 1 বেছে নিয়েছি। সুতরাং, আমাদের ক্ষেত্রে, অ্যালগরিদম আমাদের ডেটার প্রতিটি পয়েন্টের জন্য 5-1 বা 4টি নিকটতম পয়েন্ট খুঁজে পাবে। যারা হয় k-প্রতিবেশী এবং আমাদের k 4 এর সমান।

$$
text{k-neighbours} = text{min. পয়েন্ট} – 1
$$

প্রতিবেশীদের খুঁজে বের করার পরে, আমরা তাদের দূরত্বগুলিকে বৃহত্তম থেকে ক্ষুদ্রতম পর্যন্ত অর্ডার করব এবং y-অক্ষের দূরত্ব এবং x-অক্ষের বিন্দুগুলিকে প্লট করব। প্লটটির দিকে তাকালে, আমরা দেখতে পাব যে এটি একটি কনুইয়ের বাঁকের সাথে কোথায় সাদৃশ্যপূর্ণ এবং y-অক্ষ বিন্দু যা বর্ণনা করে যে কনুই বাঁকানো হল প্রস্তাবিত ε মান।

বিঃদ্রঃ: এটা সম্ভব যে ε মান খোঁজার জন্য গ্রাফটিতে এক বা একাধিক "কনুই বাঁকানো" আছে, হয় বড় বা ছোট, যখন এটি ঘটে, আপনি মানগুলি খুঁজে পেতে পারেন, তাদের পরীক্ষা করতে পারেন এবং ক্লাস্টারগুলিকে সর্বোত্তমভাবে বর্ণনা করে এমন ফলাফল সহ বেছে নিতে পারেন, হয় প্লটের মেট্রিক্স দেখে।

এই পদক্ষেপগুলি সম্পাদন করার জন্য, আমরা অ্যালগরিদম আমদানি করতে পারি, এটি ডেটাতে ফিট করতে পারি এবং তারপরে আমরা প্রতিটি বিন্দুর দূরত্ব এবং সূচকগুলি বের করতে পারি kneighbors() পদ্ধতি:

from sklearn.neighbors import NearestNeighbors
import numpy as np nn = NearestNeighbors(n_neighbors=4) nbrs = nn.fit(scaled_customer_data)
distances, indices = nbrs.kneighbors(scaled_customer_data)

দূরত্ব খুঁজে বের করার পরে, আমরা তাদের সবচেয়ে বড় থেকে ছোট পর্যন্ত সাজাতে পারি। যেহেতু দূরত্ব অ্যারের প্রথম কলামটি বিন্দুর নিজস্ব (অর্থাৎ সবগুলি 0), এবং দ্বিতীয় কলামে সবচেয়ে ছোট দূরত্ব রয়েছে, তারপরে তৃতীয় কলামে দ্বিতীয়টির চেয়ে বড় দূরত্ব রয়েছে এবং তাই, আমরা কেবলমাত্র বেছে নিতে পারি দ্বিতীয় কলামের মান এবং তাদের মধ্যে সংরক্ষণ করুন distances পরিবর্তনশীল:

distances = np.sort(distances, axis=0)
distances = distances[:,1] 

এখন যেহেতু আমাদের বাছাই করা ক্ষুদ্রতম দূরত্ব রয়েছে, আমরা আমদানি করতে পারি matplotlib, দূরত্ব প্লট করুন এবং যেখানে "কনুই বাঁক" আছে সেখানে একটি লাল রেখা আঁকুন:

import matplotlib.pyplot as plt plt.figure(figsize=(6,3))
plt.plot(distances)
plt.axhline(y=0.24, color='r', linestyle='--', alpha=0.4) plt.title('Kneighbors distance graph')
plt.xlabel('Data points')
plt.ylabel('Epsilon value')
plt.show();

এই ফলাফল:

Python PlatoBlockchain ডেটা ইন্টেলিজেন্সে Scikit-Learn সহ DBSCAN। উল্লম্ব অনুসন্ধান. আ.

লক্ষ্য করুন যে লাইনটি আঁকার সময়, আমরা ε মানটি খুঁজে বের করব, এই ক্ষেত্রে, এটি 0.24.

আমরা অবশেষে আমাদের সর্বনিম্ন পয়েন্ট এবং ε আছে. উভয় ভেরিয়েবলের সাথে, আমরা DBSCAN মডেল তৈরি এবং চালাতে পারি।

একটি DBSCAN মডেল তৈরি করা

মডেল তৈরি করতে, আমরা এটিকে স্কিট-লার্ন থেকে আমদানি করতে পারি, এটি ε দিয়ে তৈরি করতে পারি যা একই eps যুক্তি, এবং ন্যূনতম পয়েন্ট যা হল mean_samples যুক্তি. আমরা তারপর এটি একটি পরিবর্তনশীল মধ্যে সংরক্ষণ করতে পারেন, এর কল করা যাক dbs এবং স্কেল করা ডেটাতে এটি ফিট করুন:

from sklearn.cluster import DBSCAN dbs = DBSCAN(eps=0.24, min_samples=5)
dbs.fit(scaled_customer_data)

ঠিক তেমনই, আমাদের DBSCAN মডেল তৈরি করা হয়েছে এবং ডেটার উপর প্রশিক্ষণ দেওয়া হয়েছে! ফলাফল বের করতে, আমরা অ্যাক্সেস labels_ সম্পত্তি আমরা একটি নতুন তৈরি করতে পারেন labels মধ্যে কলাম scaled_customer_data ডেটাফ্রেম এবং ভবিষ্যদ্বাণীকৃত লেবেল দিয়ে এটি পূরণ করুন:

labels = dbs.labels_ scaled_customer_data['labels'] = labels
scaled_customer_data.head()

এই চূড়ান্ত ফলাফল:

 Annual Income (k$) Spending Score (1-100) labels
0 -1.738999 -0.434801 -1
1 -1.738999 1.195704 0
2 -1.700830 -1.715913 -1
3 -1.700830 1.040418 0
4 -1.662660 -0.395980 -1

আমরা লেবেল আছে যে লক্ষ্য করুন -1 মান এই হল গোলমাল পয়েন্ট, যেগুলো কোনো ক্লাস্টারের অন্তর্গত নয়। অ্যালগরিদমটি কতগুলি নয়েজ পয়েন্ট পেয়েছে তা জানতে, আমরা আমাদের লেবেল তালিকায় কতবার মান -1 প্রদর্শিত হবে তা গণনা করতে পারি:

labels_list = list(scaled_customer_data['labels'])
n_noise = labels_list.count(-1)
print("Number of noise points:", n_noise)

এই আউটপুট:

Number of noise points: 62

আমরা ইতিমধ্যেই জানি যে 62 পয়েন্টের আমাদের আসল ডেটার 200 পয়েন্টকে গোলমাল হিসাবে বিবেচনা করা হয়েছিল। এটি অনেক গোলমাল, যা নির্দেশ করে যে সম্ভবত DBSCAN ক্লাস্টারিং অনেকগুলি পয়েন্টকে ক্লাস্টারের অংশ হিসাবে বিবেচনা করেনি। আমরা শীঘ্রই বুঝতে পারব কি ঘটেছে, যখন আমরা ডেটা প্লট করব।

প্রাথমিকভাবে, যখন আমরা ডেটা পর্যবেক্ষণ করেছি, তখন মনে হয়েছিল 5 টি ক্লাস্টার পয়েন্ট রয়েছে। DBSCAN কতগুলি ক্লাস্টার তৈরি করেছে তা জানতে, আমরা -1 নয় এমন লেবেলের সংখ্যা গণনা করতে পারি। সেই কোড লেখার অনেক উপায় আছে; এখানে, আমরা লুপের জন্য একটি লিখেছি, এটি সেই ডেটার জন্যও কাজ করবে যেখানে DBSCAN অনেক ক্লাস্টার খুঁজে পেয়েছে:

total_labels = np.unique(labels) n_labels = 0
for n in total_labels: if n != -1: n_labels += 1
print("Number of clusters:", n_labels)

এই আউটপুট:

Number of clusters: 6

আমরা দেখতে পাচ্ছি যে অ্যালগরিদম ডেটাতে 6 টি ক্লাস্টার থাকার ভবিষ্যদ্বাণী করেছে, অনেকগুলি নয়েজ পয়েন্ট সহ। আসুন এটিকে সামুদ্রিক প্রাণীর সাথে প্লট করে কল্পনা করি scatterplot:

sns.scatterplot(data=scaled_customer_data, x='Annual Income (k$)', y='Spending Score (1-100)', hue='labels', palette='muted').set_title('DBSCAN found clusters');

এর ফলে:

Python PlatoBlockchain ডেটা ইন্টেলিজেন্সে Scikit-Learn সহ DBSCAN। উল্লম্ব অনুসন্ধান. আ.

প্লটটির দিকে তাকালে, আমরা দেখতে পাচ্ছি যে DBSCAN সেই পয়েন্টগুলিকে ধরেছে যেগুলি আরও ঘনভাবে সংযুক্ত ছিল, এবং যে পয়েন্টগুলিকে একই ক্লাস্টারের অংশ হিসাবে বিবেচনা করা যেতে পারে সেগুলি হয় শব্দ ছিল বা অন্য একটি ছোট ক্লাস্টার গঠনের জন্য বিবেচনা করা হয়েছিল।

Python PlatoBlockchain ডেটা ইন্টেলিজেন্সে Scikit-Learn সহ DBSCAN। উল্লম্ব অনুসন্ধান. আ.

যদি আমরা ক্লাস্টারগুলি হাইলাইট করি, লক্ষ্য করুন কীভাবে DBSCAN ক্লাস্টার 1 সম্পূর্ণরূপে পায়, যেটি বিন্দুর মধ্যে কম স্থান সহ ক্লাস্টার। তারপরে এটি ক্লাস্টার 0 এবং 3 এর অংশগুলি পায় যেখানে বিন্দুগুলি ঘনিষ্ঠভাবে একসাথে থাকে, আরও ব্যবধানযুক্ত বিন্দুকে শব্দ হিসাবে বিবেচনা করে। এটি নীচের বাম অর্ধেকের পয়েন্টগুলিকে আওয়াজ হিসাবে বিবেচনা করে এবং নীচের ডানদিকের পয়েন্টগুলিকে 3টি ক্লাস্টারে বিভক্ত করে, আবার ক্লাস্টার 4, 2 এবং 5 ক্যাপচার করে যেখানে পয়েন্টগুলি একসাথে কাছাকাছি থাকে৷

আমরা একটি উপসংহারে আসতে শুরু করতে পারি যে DBSCAN ক্লাস্টারগুলির ঘন এলাকাগুলি ক্যাপচার করার জন্য দুর্দান্ত ছিল তবে ডেটার বড় স্কিম, 5 টি ক্লাস্টারের সীমানা চিহ্নিত করার জন্য এতটা নয়। আমাদের ডেটা সহ আরও ক্লাস্টারিং অ্যালগরিদম পরীক্ষা করা আকর্ষণীয় হবে। আসুন দেখি কোন মেট্রিক এই অনুমানকে সমর্থন করবে কিনা।

অ্যালগরিদম মূল্যায়ন

DBSCAN মূল্যায়ন করতে আমরা ব্যবহার করব সিলুয়েট স্কোর যা একই ক্লাস্টারের বিন্দুর মধ্যে দূরত্ব এবং ক্লাস্টারগুলির মধ্যে দূরত্ব বিবেচনা করবে।

বিঃদ্রঃ: বর্তমানে, বেশিরভাগ ক্লাস্টারিং মেট্রিকগুলি DBSCAN মূল্যায়ন করার জন্য ব্যবহার করার জন্য সত্যিই উপযুক্ত নয় কারণ সেগুলি ঘনত্বের উপর ভিত্তি করে নয়৷ এখানে, আমরা সিলুয়েট স্কোর ব্যবহার করছি কারণ এটি ইতিমধ্যেই স্কিট-লার্নে প্রয়োগ করা হয়েছে এবং এটি ক্লাস্টারের আকার দেখার চেষ্টা করে।

আরও উপযুক্ত মূল্যায়নের জন্য, আপনি এটি ব্যবহার করতে বা এর সাথে একত্রিত করতে পারেন ঘনত্ব-ভিত্তিক ক্লাস্টারিং বৈধতা (DBCV) মেট্রিক, যা বিশেষভাবে ঘনত্ব-ভিত্তিক ক্লাস্টারিংয়ের জন্য ডিজাইন করা হয়েছিল। এই উপর উপলব্ধ DBCV জন্য একটি বাস্তবায়ন আছে GitHub.

প্রথমত, আমরা আমদানি করতে পারি silhouette_score Scikit-Learn থেকে, তারপর, এটি আমাদের কলাম এবং লেবেলগুলি পাস করুন:

from sklearn.metrics import silhouette_score s_score = silhouette_score(scaled_customer_data, labels)
print(f"Silhouette coefficient: {s_score:.3f}")

এই আউটপুট:

Silhouette coefficient: 0.506

এই স্কোর অনুসারে, মনে হচ্ছে DBSCAN প্রায় 50% ডেটা ক্যাপচার করতে পারে।

উপসংহার

DBSCAN এর সুবিধা এবং অসুবিধা

DBSCAN একটি খুব অনন্য ক্লাস্টারিং অ্যালগরিদম বা মডেল।

যদি আমরা এর সুবিধার দিকে তাকাই, তবে এটি ডেটা এবং পয়েন্টগুলিতে ঘন এলাকাগুলি বাছাই করতে খুব ভাল যা অন্যদের থেকে অনেক দূরে। এর মানে হল যে ডেটার একটি নির্দিষ্ট আকৃতি থাকতে হবে না এবং অন্যান্য বিন্দু দ্বারা বেষ্টিত হতে পারে, যতক্ষণ না তারা ঘনভাবে সংযুক্ত থাকে।

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

এর অসুবিধাগুলির জন্য, আমরা দেখেছি যে এটি একই ক্লাস্টারে বিভিন্ন ঘনত্ব ক্যাপচার করতে পারে না, তাই ঘনত্বের বড় পার্থক্যের সাথে এটির কঠিন সময় রয়েছে। এটি পয়েন্টের দূরত্ব মেট্রিক এবং স্কেলিং এর উপরও নির্ভরশীল। এর মানে হল যে যদি ডেটা ভালভাবে বোঝা না যায়, স্কেলের পার্থক্য এবং দূরত্বের মেট্রিকের সাথে যা বোঝা যায় না, তাহলে সম্ভবত এটি বুঝতে ব্যর্থ হবে।

DBSCAN এক্সটেনশন

অন্যান্য অ্যালগরিদম আছে, যেমন হায়ারার্কিক্যাল DBSCAN (HDBSCAN) এবং ক্লাস্টারিং স্ট্রাকচার সনাক্ত করার জন্য পয়েন্ট অর্ডার করা (OPTICS), যা DBSCAN এর এক্সটেনশন হিসেবে বিবেচিত হয়।

HDBSCAN এবং OPTICS উভয়ই সাধারণত ভাল পারফরম্যান্স করতে পারে যখন ডেটাতে বিভিন্ন ঘনত্বের ক্লাস্টার থাকে এবং পছন্দ বা প্রাথমিক মিনিটের প্রতিও কম সংবেদনশীল হয়। পয়েন্ট এবং ε পরামিতি।

সময় স্ট্যাম্প:

থেকে আরো Stackabuse