Python's Scikit-Learn এর সাথে SVM এবং Kernel SVM বাস্তবায়ন করা

Python এর Scikit-Learn-এর সাথে SVM এবং Kernel SVM বাস্তবায়ন করা

ভূমিকা

এই নির্দেশিকাটি সাপোর্ট ভেক্টর মেশিন (SVMs) সম্পর্কে তিনটি গাইডের প্রথম অংশ। এই সিরিজে, আমরা একটি নকল ব্যাঙ্ক নোট ব্যবহারের ক্ষেত্রে কাজ করব, সাধারণ SVM সম্পর্কে জানব, তারপর SVM হাইপারপ্যারামিটার সম্পর্কে এবং অবশেষে, একটি ধারণা শিখব কার্নেল কৌশল এবং অন্যান্য ধরনের SVM অন্বেষণ করুন।

আপনি যদি সমস্ত গাইড পড়তে চান বা দেখতে চান যে কোনটি আপনার সবচেয়ে বেশি আগ্রহী, নীচে প্রতিটি গাইডে কভার করা বিষয়গুলির সারণী রয়েছে:

1. পাইথনের স্কিট-লার্নের সাথে এসভিএম এবং কার্নেল এসভিএম বাস্তবায়ন করা

  • কেস ব্যবহার করুন: ব্যাংক নোট ভুলে যান
  • SVM-এর পটভূমি
  • সরল (লিনিয়ার) SVM মডেল
    • ডেটাসেট সম্পর্কে
    • ডেটাসেট আমদানি করা হচ্ছে
    • ডেটাসেট অন্বেষণ
  • Scikit-Learn এর সাথে SVM বাস্তবায়ন করা
    • ট্রেন/পরীক্ষা সেটে ডেটা ভাগ করা
    • মডেল প্রশিক্ষণ
    • ভবিষ্যদ্বাণী করা
    • মডেল মূল্যায়ন
    • ফলাফল ব্যাখ্যা

2. SVM হাইপারপ্যারামিটার বোঝা (শীঘ্রই আসছে!)

  • সি হাইপারপ্যারামিটার
  • গামা হাইপারপ্যারামিটার

3. Python's Scikit-Learn-এর সাথে অন্যান্য SVM ফ্লেভার প্রয়োগ করা (শীঘ্রই আসছে!)

  • এসভিএমের সাধারণ ধারণা (একটি সংক্ষিপ্ত বিবরণ)
  • কার্নেল (কৌশল) SVM
  • Scikit-Learn-এর সাথে নন-লিনিয়ার কার্নেল SVM বাস্তবায়ন করা
  • লাইব্রেরি আমদানি করা হচ্ছে
    • ডেটাসেট আমদানি করা হচ্ছে
    • বৈশিষ্ট্য (X) এবং লক্ষ্য (y) মধ্যে ডেটা ভাগ করা
    • ট্রেন/পরীক্ষা সেটে ডেটা ভাগ করা
    • অ্যালগরিদম প্রশিক্ষণ
  • বহুপদী কার্নেল
    • ভবিষ্যদ্বাণী করা
    • অ্যালগরিদম মূল্যায়ন
  • গাউসিয়ান কার্নেল
    • ভবিষ্যদ্বাণী এবং মূল্যায়ন
  • সিগময়েড কার্নেল
    • ভবিষ্যদ্বাণী এবং মূল্যায়ন
  • নন-লিনিয়ার কার্নেল পারফরম্যান্সের তুলনা

ব্যবহারের ক্ষেত্রে: নকল ব্যাঙ্ক নোট

কখনও কখনও লোকেরা ব্যাংক নোট জাল করার উপায় খুঁজে পায়। যদি কোনও ব্যক্তি এই নোটগুলি দেখে এবং তাদের বৈধতা যাচাই করে তবে তাদের দ্বারা প্রতারিত হওয়া কঠিন হতে পারে।

কিন্তু প্রতিটি নোট দেখার জন্য একজন ব্যক্তি না থাকলে কী হবে? স্বয়ংক্রিয়ভাবে জানার কোন উপায় আছে কি ব্যাঙ্ক নোট নকল নাকি আসল?

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

যেহেতু ছবিগুলি ব্যবহার করা হচ্ছে, সেগুলিকে কম্প্যাক্ট করা যায়, গ্রেস্কেলে কমানো যায় এবং তাদের পরিমাপ বের করা বা পরিমাপ করা যায়৷ এইভাবে, প্রতিটি চিত্রের পিক্সেলের পরিবর্তে চিত্রের পরিমাপের মধ্যে তুলনা করা হবে।

এখন পর্যন্ত, আমরা ব্যাঙ্ক নোটগুলি প্রক্রিয়া এবং তুলনা করার একটি উপায় খুঁজে পেয়েছি, কিন্তু কীভাবে সেগুলিকে আসল বা নকল হিসাবে শ্রেণীবদ্ধ করা হবে? আমরা সেই শ্রেণিবিন্যাস করতে মেশিন লার্নিং ব্যবহার করতে পারি। একটি শ্রেণীবিভাগ অ্যালগরিদম বলা হয় ভেক্টর মেশিনকে সাপর্ট কর, প্রধানত তার সংক্ষিপ্ত ফর্ম দ্বারা পরিচিত: এসভিএম.

SVM-এর পটভূমি

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

Python এর Scikit-Learn PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ SVM এবং Kernel SVM বাস্তবায়ন করা। উল্লম্ব অনুসন্ধান. আ.

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

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

কিন্তু একটি সরল রেখা ব্যবহার করে ডেটা আলাদা করার উপায় না থাকলে কী হবে? অগোছালো জায়গা পয়েন্ট আউট আছে, বা যদি একটি বক্ররেখা প্রয়োজন হয়?

সেই সমস্যাটি সমাধানের জন্য, SVM পরবর্তীতে 1990-এর দশকে পরিমার্জিত করা হয়েছিল যাতে এমন ডেটাও শ্রেণীবদ্ধ করা যায় যেগুলির মধ্যে বিন্দু রয়েছে যা এর কেন্দ্রীয় প্রবণতা থেকে দূরে ছিল, যেমন আউটলায়ার্স, বা আরও জটিল সমস্যা যা দুটি মাত্রার বেশি ছিল এবং রৈখিকভাবে বিভাজ্য ছিল না। .

কৌতূহলের বিষয় হল যে শুধুমাত্র সাম্প্রতিক বছরগুলিতে SVMগুলি ব্যাপকভাবে গৃহীত হয়েছে, প্রধানত কখনও কখনও 90% এর বেশি সঠিক উত্তর অর্জন করার ক্ষমতার কারণে বা সঠিকতা, কঠিন সমস্যার জন্য।

অন্যান্য মেশিন লার্নিং অ্যালগরিদমগুলির সাথে তুলনা করার সময় SVMগুলি একটি অনন্য উপায়ে প্রয়োগ করা হয়, একবার সেগুলি শিখন কি বা এর উপর পরিসংখ্যানগত ব্যাখ্যার উপর ভিত্তি করে পরিসংখ্যানগত তত্ত্ব তত্ত্ব.

এই নিবন্ধে, আমরা সাপোর্ট ভেক্টর মেশিনের অ্যালগরিদমগুলি কী, একটি সমর্থন ভেক্টর মেশিনের পিছনে সংক্ষিপ্ত তত্ত্ব এবং পাইথনের স্কিট-লার্ন লাইব্রেরিতে তাদের বাস্তবায়ন দেখব। আমরা তারপর অন্য SVM ধারণার দিকে এগিয়ে যাব, যা নামে পরিচিত কার্নেল এসভিএম, বা কার্নেল কৌশল, এবং Scikit-Learn-এর সাহায্যে এটি বাস্তবায়ন করবে।

সরল (লিনিয়ার) SVM মডেল

ডেটাসেট সম্পর্কে

ভূমিকায় প্রদত্ত উদাহরণ অনুসরণ করে, আমরা একটি ডেটাসেট ব্যবহার করব যাতে বাস্তব এবং নকল ব্যাঙ্ক নোটের চিত্রের পরিমাপ রয়েছে।

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

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

একবার তরঙ্গের মাধ্যমে সময়ের মাত্রা এবং ফুরিয়ার পদ্ধতির মাধ্যমে ফ্রিকোয়েন্সি মাত্রা পাওয়া গেলে, সময় এবং ফ্রিকোয়েন্সির একটি সুপার ইম্পোজেশন তৈরি করা হয় যখন তাদের উভয়ের মিল থাকে, এটি হল প্রত্যয় বিশ্লেষণ কনভোলিউশনটি এমন একটি ফিট পায় যা চিত্রের ফ্রিকোয়েন্সিগুলির সাথে তরঙ্গের সাথে মেলে এবং কোন ফ্রিকোয়েন্সিগুলি বেশি বিশিষ্ট তা খুঁজে বের করে।

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

ডেটাসেট আমদানি করা হচ্ছে

আমরা এই বিভাগে যে ব্যাঙ্ক নোট ডেটাসেটটি ব্যবহার করতে যাচ্ছি তা একই যা শ্রেণীবিভাগের বিভাগে ব্যবহৃত হয়েছিল সিদ্ধান্ত গাছ টিউটোরিয়াল.

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

আসুন একটি পান্ডায় ডেটা আমদানি করি dataframe গঠন, এবং এর সাথে এর প্রথম পাঁচটি সারি দেখে নিন head() পদ্ধতি।

লক্ষ্য করুন যে ডাটা সংরক্ষণ করা হয়েছে a txt (টেক্সট) ফাইল ফরম্যাট, কমা দ্বারা বিভক্ত, এবং এটি একটি হেডার ছাড়া। আমরা এটিকে একটি হিসাবে পড়ার মাধ্যমে একটি টেবিল হিসাবে পুনর্গঠন করতে পারি csv, উল্লেখ করা separator একটি কমা হিসাবে, এবং সঙ্গে কলাম নাম যোগ names যুক্তি.

আসুন একবারে সেই তিনটি ধাপ অনুসরণ করি, এবং তারপর ডেটার প্রথম পাঁচটি সারি দেখুন:

import pandas as pd data_link = "https://archive.ics.uci.edu/ml/machine-learning-databases/00267/data_banknote_authentication.txt"
col_names = ["variance", "skewness", "curtosis", "entropy", "class"] bankdata = pd.read_csv(data_link, names=col_names, sep=",", header=None)
bankdata.head()

এর ফলে:

	variance skewness curtosis entropy class
0 3.62160 8.6661 -2.8073 -0.44699 0
1 4.54590 8.1674 -2.4586 -1.46210 0
2 3.86600 -2.6383 1.9242 0.10645 0
3 3.45660 9.5228 -4.0112 -3.59440 0
4 0.32924 -4.4552 4.5718 -0.98880 0

বিঃদ্রঃ: আপনি স্থানীয়ভাবে ডেটা সংরক্ষণ করতে এবং বিকল্প করতে পারেন data_link উন্নত data_path, এবং আপনার স্থানীয় ফাইলের পাথে পাস করুন।

আমরা দেখতে পাচ্ছি যে আমাদের ডেটাসেটে পাঁচটি কলাম রয়েছে, যথা, variance, skewness, curtosis, entropy, এবং class. পাঁচটি সারিতে, প্রথম চারটি কলাম সংখ্যা দিয়ে পূর্ণ হয় যেমন 3.62160, 8.6661, -2.8073 বা একটানা মান, এবং শেষ class কলামের প্রথম পাঁচটি সারি 0s, অথবা a দিয়ে ভরা বিযুক্ত মান।

যেহেতু আমাদের উদ্দেশ্য হল একটি ব্যাঙ্ক কারেন্সি নোট খাঁটি কিনা তা ভবিষ্যদ্বাণী করা, তাই আমরা নোটের চারটি বৈশিষ্ট্যের উপর ভিত্তি করে এটি করতে পারি:

  • variance ওয়েভলেট রূপান্তরিত চিত্রের। সাধারণত, ভ্যারিয়েন্স হল একটি ক্রমাগত মান যা ডেটা পয়েন্টগুলি ডেটার গড় মানের কতটা কাছাকাছি বা দূরে তা পরিমাপ করে। যদি পয়েন্টগুলি ডেটার গড় মানের কাছাকাছি হয়, তবে বিতরণটি একটি সাধারণ বিতরণের কাছাকাছি হয়, যার মানে সাধারণত এর মানগুলি আরও ভালভাবে বিতরণ করা হয় এবং ভবিষ্যদ্বাণী করা কিছুটা সহজ। বর্তমান চিত্রের প্রেক্ষাপটে, এটি সহগগুলির বৈচিত্র্য যা তরঙ্গায়িত রূপান্তরের ফলে হয়। কম বৈচিত্র্য, সহগ বাস্তব চিত্র অনুবাদের কাছাকাছি ছিল।

  • skewness ওয়েভলেট রূপান্তরিত চিত্রের। তির্যকতা একটি অবিচ্ছিন্ন মান যা একটি বন্টনের অসমতা নির্দেশ করে। গড়টির বাম দিকে আরও মান থাকলে, বন্টন হয় নেতিবাচকভাবে তির্যক, যদি গড়টির ডানদিকে আরও মান থাকে তবে বন্টন হয় ইতিবাচকভাবে তির্যক, এবং যদি গড়, মোড এবং মধ্যমা একই হয়, বন্টন হয় ভারসাম্য-সংক্রান্ত. একটি বন্টন যত বেশি প্রতিসম, এটি একটি সাধারণ বন্টনের কাছাকাছি, এর মানগুলি আরও ভালভাবে বিতরণ করা হয়। বর্তমান প্রেক্ষাপটে, এটি তরঙ্গের রূপান্তরের ফলে সহগগুলির তির্যকতা। যত বেশি প্রতিসম, আমরা সহগ তত কাছাকাছিvariance, skewness, curtosis, entropyপ্রকৃত চিত্র অনুবাদ করতে re.

Python এর Scikit-Learn PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ SVM এবং Kernel SVM বাস্তবায়ন করা। উল্লম্ব অনুসন্ধান. আ.

  • curtosis ওয়েভলেট ট্রান্সফর্মড ইমেজের (বা কুরটোসিস)। কুর্টোসিস একটি ক্রমাগত মান যা তির্যকতার মতো, একটি বিতরণের আকৃতিও বর্ণনা করে। কার্টোসিস সহগ (k) এর উপর নির্ভর করে, একটি বিতরণ - যখন সাধারণ বিতরণের সাথে তুলনা করা হয় তখন কম বা বেশি সমতল হতে পারে - বা এর প্রান্ত বা লেজে কম বা বেশি ডেটা থাকতে পারে। যখন বিতরণ আরও ছড়িয়ে পড়ে এবং চাটুকার হয়, তখন তাকে বলা হয় platykurtic; যখন এটি কম ছড়িয়ে পড়ে এবং মাঝখানে বেশি ঘনীভূত হয়, mesokurtic; এবং যখন বিতরণ প্রায় সম্পূর্ণরূপে মাঝখানে কেন্দ্রীভূত হয়, তখন এটি বলা হয় leptokurtic. এটি পূর্বের ক্ষেত্রে বৈচিত্র্য এবং তির্যকতার ক্ষেত্রে একই, বন্টনটি যত বেশি মেসোকার্টিক হবে, প্রকৃত চিত্র অনুবাদ করার জন্য সহগগুলি তত কাছাকাছি হবে।

Python এর Scikit-Learn PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ SVM এবং Kernel SVM বাস্তবায়ন করা। উল্লম্ব অনুসন্ধান. আ.

  • entropy ছবির এনট্রপিও একটি ক্রমাগত মান, এটি সাধারণত একটি সিস্টেমের এলোমেলোতা বা ব্যাধি পরিমাপ করে। একটি চিত্রের প্রসঙ্গে, এনট্রপি একটি পিক্সেল এবং এর প্রতিবেশী পিক্সেলের মধ্যে পার্থক্য পরিমাপ করে। আমাদের প্রেক্ষাপটে, সহগগুলির যত বেশি এনট্রপি থাকবে, চিত্রটি রূপান্তর করার সময় তত বেশি ক্ষতি হয়েছে – এবং এনট্রপি যত ছোট হবে, তথ্যের ক্ষতি তত কম হবে।

Python এর Scikit-Learn PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ SVM এবং Kernel SVM বাস্তবায়ন করা। উল্লম্ব অনুসন্ধান. আ.

পঞ্চম চলক ছিল class পরিবর্তনশীল, যার সম্ভবত 0 এবং 1 মান রয়েছে, যা বলে যে নোটটি আসল নাকি নকল।

আমরা পরীক্ষা করতে পারি যে পঞ্চম কলামে শূন্য রয়েছে এবং পান্ডাসের সাথে আছে কিনা। unique() পদ্ধতি:

bankdata['class'].unique()

উপরের পদ্ধতিটি ফিরে আসে:

array([0, 1]) 

উপরের পদ্ধতিটি 0 এবং 1 মান সহ একটি অ্যারে প্রদান করে। এর মানে হল যে আমাদের ক্লাস সারিগুলিতে থাকা একমাত্র মানগুলি হল শূন্য এবং এক। এটি হিসাবে ব্যবহার করার জন্য প্রস্তুত লক্ষ্য আমাদের তত্ত্বাবধানে শেখার মধ্যে।

  • class ছবির এটি একটি পূর্ণসংখ্যার মান, যখন চিত্রটি নকল হয় তখন এটি 0 হয় এবং চিত্রটি বাস্তব হলে 1 হয়৷

যেহেতু আমাদের কাছে বাস্তব এবং ভুলে যাওয়া চিত্রগুলির টীকা সহ একটি কলাম রয়েছে, এর অর্থ হল আমাদের শিক্ষার ধরন তত্ত্বাবধানে.

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

আমরা এর মাধ্যমে ডেটাতে সারির সংখ্যা দেখে আমাদের কাছে কতগুলি রেকর্ড বা চিত্র রয়েছে তাও দেখতে পারি shape সম্পত্তি:

bankdata.shape

এই আউটপুট:

(1372, 5)

উপরের লাইনটির অর্থ হল রূপান্তরিত ব্যাঙ্ক নোটের ছবিগুলির 1,372টি সারি এবং 5টি কলাম রয়েছে৷ এই তথ্য আমরা বিশ্লেষণ করা হবে.

আমরা আমাদের ডেটাসেট আমদানি করেছি এবং কয়েকটি চেক করেছি। এখন আমরা আমাদের ডেটা আরও ভালভাবে বোঝার জন্য অন্বেষণ করতে পারি।

ডেটাসেট অন্বেষণ

আমরা এইমাত্র দেখেছি যে শ্রেণী কলামে কেবলমাত্র শূন্য এবং এক আছে, তবে আমরা এটিও জানতে পারি যে সেগুলি কী অনুপাতে – অন্য কথায় – যদি একের চেয়ে বেশি শূন্য থাকে, শূন্যের চেয়ে বেশি থাকে, বা যদি এর সংখ্যা শূন্য সংখ্যার সমান, মানে তারা সুষম.

অনুপাত জানতে আমরা ডেটাতে প্রতিটি শূন্য এবং একটি মান গণনা করতে পারি value_counts() পদ্ধতি:

bankdata['class'].value_counts()

এই আউটপুট:

0 762
1 610
Name: class, dtype: int64

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

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

প্রথম ধাপ হল পান্ডা ব্যবহার করা value_counts() পদ্ধতি আবার, কিন্তু এখন যুক্তি সহ শতাংশ দেখুন normalize=True:

bankdata['class'].value_counts(normalize=True)

সার্জারির normalize=True প্রতিটি ক্লাসের জন্য ডেটার শতাংশ গণনা করে। এখন পর্যন্ত, নকল (0) এবং বাস্তব তথ্য (1) এর শতাংশ হল:

0 0.555394
1 0.444606
Name: class, dtype: float64

এর মানে হল যে আমাদের ডেটাসেটের প্রায় (~) 56% নকল এবং এর 44% আসল। এটি আমাদের একটি 56%-44% অনুপাত দেয়, যা 12% পার্থক্যের সমান। এটি পরিসংখ্যানগতভাবে একটি ছোট পার্থক্য হিসাবে বিবেচিত হয়, কারণ এটি 10% এর একটু উপরে, তাই ডেটা ভারসাম্যপূর্ণ বলে মনে করা হয়। যদি 56:44 অনুপাতের পরিবর্তে, একটি 80:20 বা 70:30 অনুপাত থাকে, তাহলে আমাদের ডেটা ভারসাম্যহীন বলে বিবেচিত হবে, এবং আমাদের কিছু ভারসাম্যহীনতার চিকিত্সা করতে হবে, কিন্তু, ভাগ্যক্রমে, এটি এমন নয়।

আমরা এই পার্থক্যটি চাক্ষুষভাবে দেখতে পারি, একটি পান্ডাস ইমবুড হিস্টোগ্রামের সাথে ক্লাস বা লক্ষ্যের বন্টনটি ব্যবহার করে:

bankdata['class'].plot.hist();

এটি সরাসরি ডেটাফ্রেম কাঠামো ব্যবহার করে একটি হিস্টোগ্রাম প্লট করে matplotlib লাইব্রেরি যা পর্দার আড়ালে।

Python এর Scikit-Learn PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ SVM এবং Kernel SVM বাস্তবায়ন করা। উল্লম্ব অনুসন্ধান. আ.

হিস্টোগ্রাম দেখে, আমরা নিশ্চিত হতে পারি যে আমাদের টার্গেট মান হয় 0 বা 1 এবং ডেটা ভারসাম্যপূর্ণ।

এটি একটি কলামের বিশ্লেষণ ছিল যা আমরা ভবিষ্যদ্বাণী করার চেষ্টা করছিলাম, কিন্তু আমাদের ডেটার অন্যান্য কলামগুলি বিশ্লেষণ করার বিষয়ে কী হবে?

আমরা এর সাথে পরিসংখ্যানগত পরিমাপ দেখতে পারি describe() ডেটাফ্রেম পদ্ধতি। আমরাও ব্যবহার করতে পারি .T ট্রান্সপোজ - কলাম এবং সারিগুলিকে উল্টাতে, এটিকে মান জুড়ে তুলনা করার জন্য আরও সরাসরি করে তোলে:

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

bankdata.describe().T

এর ফলে:

 count mean std min 25% 50% 75% max
variance 1372.0 0.433735 2.842763 -7.0421 -1.773000 0.49618 2.821475 6.8248
skewness 1372.0 1.922353 5.869047 -13.7731 -1.708200 2.31965 6.814625 12.9516
curtosis 1372.0 1.397627 4.310030 -5.2861 -1.574975 0.61663 3.179250 17.9274
entropy 1372.0 -1.191657 2.101013 -8.5482 -2.413450 -0.58665 0.394810 2.4495
class 1372.0 0.444606 0.497103 0.0000 0.000000 0.00000 1.000000 1.0000

লক্ষ্য করুন যে তির্যকতা এবং কার্টোসিস কলামগুলির গড় মান রয়েছে যা স্ট্যান্ডার্ড বিচ্যুতি মান থেকে অনেক দূরে, এটি নির্দেশ করে যে সেই মানগুলি যেগুলি ডেটার কেন্দ্রীয় প্রবণতা থেকে দূরে, বা একটি বৃহত্তর পরিবর্তনশীলতা রয়েছে।

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

আসুন প্রতিটি বৈশিষ্ট্যের বন্টন দিয়ে শুরু করি, এবং প্রতিটি ডেটা কলামের হিস্টোগ্রাম প্লট বাদে class কলাম দ্য class ব্যাঙ্কডেটা কলাম অ্যারেতে কলামের অবস্থান বিবেচনায় নেওয়া হবে না। সঙ্গে শেষ একটি ছাড়া সব কলাম নির্বাচন করা হবে columns[:-1]:

import matplotlib.pyplot as plt for col in bankdata.columns[:-1]: plt.title(col) bankdata[col].plot.hist() plt.show();

উপরের কোডটি চালানোর পরে, আমরা দেখতে পাচ্ছি যে উভয়ই skewness এবং entropy তথ্য বিতরণ নেতিবাচকভাবে তির্যক এবং curtosis ইতিবাচকভাবে তির্যক। সমস্ত বন্টন প্রতিসম, এবং variance একমাত্র বিতরণ যা স্বাভাবিকের কাছাকাছি।

আমরা এখন দ্বিতীয় অংশে যেতে পারি এবং প্রতিটি ভেরিয়েবলের স্ক্যাটারপ্লট প্লট করতে পারি। এটি করার জন্য, আমরা ক্লাস ব্যতীত সমস্ত কলাম নির্বাচন করতে পারি columns[:-1], Seaborn এর ব্যবহার করুন scatterplot() এবং প্রতিটি বৈশিষ্ট্যের জন্য জোড়ায় ভিন্নতা পেতে লুপের জন্য দুটি। প্রথম বৈশিষ্ট্যটি একটির সাথে দ্বিতীয়টির সমান কিনা তা পরীক্ষা করে আমরা একটি বৈশিষ্ট্যের জোড়াকে নিজের সাথে বাদ দিতে পারি if statement.

import seaborn as sns for feature_1 in bankdata.columns[:-1]: for feature_2 in bankdata.columns[:-1]: if feature_1 != feature_2: print(feature_1, feature_2) sns.scatterplot(x=feature_1, y=feature_2, data=bankdata, hue='class') plt.show();

লক্ষ্য করুন যে সমস্ত গ্রাফে বাস্তব এবং নকল উভয় ডেটা পয়েন্ট রয়েছে একে অপরের থেকে স্পষ্টভাবে আলাদা করা হয়নি, এর মানে ক্লাসগুলির একধরনের সুপারপজিশন রয়েছে। যেহেতু একটি SVM মডেল ক্লাসের মধ্যে আলাদা করার জন্য একটি লাইন ব্যবহার করে, গ্রাফের সেই গ্রুপগুলির মধ্যে কোন একটি শুধুমাত্র একটি লাইন ব্যবহার করে আলাদা করা যেতে পারে? এটা অসম্ভাব্য মনে হয়. এই সবচেয়ে বাস্তব তথ্য মত দেখায় কি. সবচেয়ে কাছাকাছি আমরা একটি বিচ্ছেদ পেতে পারেন এর সমন্বয়ে skewness এবং variance, বা entropy এবং variance প্লট এই সম্ভবত কারণে variance ডেটার একটি বিতরণ আকৃতি রয়েছে যা স্বাভাবিকের কাছাকাছি।

কিন্তু ক্রমানুসারে সেই সমস্ত গ্রাফের দিকে তাকানো একটু কঠিন হতে পারে। আমাদের কাছে Seaborn's ব্যবহার করে সব ডিস্ট্রিবিউশন এবং স্ক্যাটার প্লট গ্রাফ একসাথে দেখার বিকল্প আছে। pairplot().

লুপগুলির জন্য পূর্ববর্তী উভয়ই আমরা করেছি শুধুমাত্র এই লাইন দ্বারা প্রতিস্থাপিত করা যেতে পারে:

sns.pairplot(bankdata, hue='class');

পেয়ারপ্লটের দিকে তাকালে মনে হয়, আসলে, curtosis এবং variance বৈশিষ্ট্যগুলির সবচেয়ে সহজ সমন্বয় হবে, তাই বিভিন্ন শ্রেণী একটি লাইন দ্বারা পৃথক করা যেতে পারে, অথবা রৈখিকভাবে বিভাজ্য.

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

এই ক্ষেত্রে, আসুন আরও প্রিপ্রসেসিং ছাড়াই ডেটা যেমন আছে তেমন ব্যবহার করি এবং পরে, আমরা এক ধাপ পিছিয়ে যেতে পারি, ডেটা প্রিপ্রসেসিং-এ যোগ করতে পারি এবং ফলাফলের তুলনা করতে পারি।

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

বিঃদ্রঃ: সাধারণত পরিসংখ্যানে, মডেল তৈরি করার সময়, ডেটার ধরনের (বিচ্ছিন্ন, অবিচ্ছিন্ন, বিভাগীয়, সংখ্যাসূচক), এর বিতরণ এবং মডেল অনুমানের উপর নির্ভর করে একটি পদ্ধতি অনুসরণ করা সাধারণ। কম্পিউটার সায়েন্সে (CS) থাকাকালীন, ট্রায়াল, ত্রুটি এবং নতুন পুনরাবৃত্তির জন্য আরও জায়গা রয়েছে। CS-এ তুলনা করার জন্য একটি বেসলাইন থাকা সাধারণ। স্কিট-লার্নে, ডামি মডেলের (বা ডামি অনুমানকারী) একটি বাস্তবায়ন রয়েছে, কিছু একটি মুদ্রা ছুঁড়ে ফেলার চেয়ে ভাল নয় এবং কেবল উত্তর দিন হাঁ (বা 1) সময়ের 50%। ফলাফল তুলনা করার সময় প্রকৃত মডেলের জন্য একটি বেসলাইন হিসাবে ডামি মডেলগুলি ব্যবহার করা আকর্ষণীয়। এটি প্রত্যাশিত যে প্রকৃত মডেলের ফলাফলগুলি এলোমেলো অনুমানের চেয়ে ভাল, অন্যথায়, একটি মেশিন লার্নিং মডেল ব্যবহার করার প্রয়োজন হবে না৷

Scikit-Learn এর সাথে SVM বাস্তবায়ন করা

SVM কিভাবে কাজ করে তার তত্ত্ব সম্পর্কে আরও জানার আগে, আমরা ডেটা দিয়ে আমাদের প্রথম বেসলাইন মডেল তৈরি করতে পারি এবং Scikit-Learn's সমর্থন ভেক্টর ক্লাসিফায়ার or বাড়ি বর্গ.

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

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

কিছু লোক বলে যে মূল্যায়ন হল মধ্যস্থতাকারী সেট, অন্যরা বলবে যে পরীক্ষার সেটটি মধ্যস্থতাকারী সেট, এবং মূল্যায়ন সেটটি চূড়ান্ত সেট। এটি গ্যারান্টি দেওয়ার চেষ্টা করার আরেকটি উপায় যে মডেলটি একই উদাহরণ কোনোভাবেই দেখছে না, বা কোনো ধরনের তথ্য ফাঁস ঘটছে না, এবং শেষ সেট মেট্রিক্সের উন্নতির মাধ্যমে একটি মডেল সাধারণীকরণ রয়েছে। আপনি যদি সেই পন্থা অনুসরণ করতে চান, তাহলে আপনি এতে বর্ণিত ডেটাকে আরও একবার ভাগ করতে পারেন Scikit-Learn's train_test_split() - প্রশিক্ষণ, পরীক্ষা এবং বৈধতা সেট গাইড।

ট্রেন/পরীক্ষা সেটে ডেটা ভাগ করা

আগের সেশনে, আমরা ডেটা বুঝেছি এবং অন্বেষণ করেছি। এখন, আমরা আমাদের ডেটা দুটি অ্যারেতে ভাগ করতে পারি - একটি চারটি বৈশিষ্ট্যের জন্য এবং অন্যটি পঞ্চম বা লক্ষ্য বৈশিষ্ট্যের জন্য। যেহেতু আমরা তরঙ্গের সহগগুলির উপর নির্ভর করে ক্লাসের পূর্বাভাস দিতে চাই, আমাদের y হবে class কলাম এবং আমাদের X হবে variance, skewness, curtosis, এবং entropy কলাম.

লক্ষ্য এবং বৈশিষ্ট্যগুলিকে আলাদা করার জন্য, আমরা শুধুমাত্র বৈশিষ্ট্যগুলি দিতে পারি class কলাম থেকে y, পরে অবশিষ্ট কলামগুলিকে অ্যাট্রিবিউট করার জন্য ডেটাফ্রেম থেকে এটি বাদ দেওয়া হয়৷ X সঙ্গে .drop() পদ্ধতি:

y = bankdata['class']
X = bankdata.drop('class', axis=1) 

ডেটা একবার বৈশিষ্ট্য এবং লেবেলে বিভক্ত হয়ে গেলে, আমরা এটিকে ট্রেন এবং পরীক্ষা সেটে বিভক্ত করতে পারি। এই হাত দ্বারা করা যেতে পারে, কিন্তু model_selection Scikit-Learn-এর লাইব্রেরিতে রয়েছে train_test_split() পদ্ধতি যা আমাদের এলোমেলোভাবে ট্রেন এবং পরীক্ষা সেটে ডেটা ভাগ করতে দেয়।

এটি ব্যবহার করার জন্য, আমরা লাইব্রেরি আমদানি করতে পারি, কল করতে পারি train_test_split() পদ্ধতি, পাস X এবং y তথ্য, এবং সংজ্ঞায়িত ক test_size একটি যুক্তি হিসাবে পাস. এই ক্ষেত্রে, আমরা এটি হিসাবে সংজ্ঞায়িত করব 0.20- এর মানে 20% ডেটা পরীক্ষার জন্য এবং বাকি 80% প্রশিক্ষণের জন্য ব্যবহার করা হবে।

এই পদ্ধতিটি এলোমেলোভাবে আমাদের সংজ্ঞায়িত শতাংশকে সম্মান করে নমুনা নেয়, তবে Xy জোড়াকে সম্মান করে, পাছে নমুনা সম্পূর্ণভাবে সম্পর্ককে মিশ্রিত করে।

যেহেতু নমুনা প্রক্রিয়াটি সহজাতভাবে এলোমেলো, পদ্ধতিটি চালানোর সময় আমাদের সর্বদা ভিন্ন ফলাফল থাকবে। একই ফলাফল, বা পুনরুত্পাদনযোগ্য ফলাফল পেতে সক্ষম হতে, আমরা 42 এর মান সহ SEED নামক একটি ধ্রুবককে সংজ্ঞায়িত করতে পারি।

আপনি এটি করতে নিম্নলিখিত স্ক্রিপ্ট চালাতে পারেন:

from sklearn.model_selection import train_test_split SEED = 42 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = SEED)

লক্ষ্য করুন যে train_test_split() পদ্ধতি ইতিমধ্যে প্রদান করে X_train, X_test, y_train, y_test এই ক্রমে সেট করে। আমরা প্রথম (0) উপাদান পেয়ে ট্রেন এবং পরীক্ষার জন্য আলাদা করা নমুনার সংখ্যা মুদ্রণ করতে পারি shape সম্পত্তি টিপল ফেরত:

xtrain_samples = X_train.shape[0]
xtest_samples = X_test.shape[0] print(f'There are {xtrain_samples} samples for training and {xtest_samples} samples for testing.')

এটি দেখায় যে প্রশিক্ষণের জন্য 1097টি এবং পরীক্ষার জন্য 275টি নমুনা রয়েছে।

মডেল প্রশিক্ষণ

আমরা ডেটাকে ট্রেন এবং টেস্ট সেটে ভাগ করেছি। এখন ট্রেন ডেটাতে একটি SVM মডেল তৈরি এবং প্রশিক্ষণের সময়। এটি করার জন্য, আমরা স্কিট-লার্নস আমদানি করতে পারি svm সঙ্গে লাইব্রেরি সমর্থন ভেক্টর ক্লাসিফায়ার ক্লাস, বা SVC বর্গ.

ক্লাস ইম্পোর্ট করার পরে, আমরা এটির একটি উদাহরণ তৈরি করতে পারি - যেহেতু আমরা একটি সাধারণ SVM মডেল তৈরি করছি, আমরা আমাদের ডেটা রৈখিকভাবে আলাদা করার চেষ্টা করছি, তাই আমরা আমাদের ডেটা ভাগ করার জন্য একটি লাইন আঁকতে পারি - যা একটি ব্যবহার করার মতই রৈখিক ফাংশন - সংজ্ঞায়িত করে kernel='linear' শ্রেণিবিন্যাসকারীর জন্য একটি যুক্তি হিসাবে:

from sklearn.svm import SVC
svc = SVC(kernel='linear')

এইভাবে, ক্লাসিফায়ার একটি লিনিয়ার ফাংশন খুঁজে বের করার চেষ্টা করবে যা আমাদের ডেটা আলাদা করে। মডেল তৈরি করার পর, এর প্রশিক্ষণ দেওয়া যাক, বা ফিট এটা, ট্রেন তথ্য সঙ্গে, নিয়োগ fit() পদ্ধতি এবং প্রদান X_train বৈশিষ্ট্য এবং y_train আর্গুমেন্ট হিসাবে লক্ষ্য.

মডেলটি প্রশিক্ষণের জন্য আমরা নিম্নলিখিত কোডটি কার্যকর করতে পারি:

svc.fit(X_train, y_train)

ঠিক সেভাবেই মডেল প্রশিক্ষিত। এখন পর্যন্ত, আমরা ডেটা বুঝেছি, ভাগ করেছি, একটি সাধারণ SVM মডেল তৈরি করেছি এবং মডেলটিকে ট্রেনের ডেটাতে ফিট করেছি।

পরবর্তী ধাপ হল আমাদের ডেটা বর্ণনা করতে কতটা উপযুক্ত তা বোঝা। অন্য কথায়, একটি রৈখিক SVM একটি পর্যাপ্ত পছন্দ ছিল কিনা উত্তর দিতে।

ভবিষ্যদ্বাণী করা

মডেলটি ডেটা বর্ণনা করতে পরিচালিত হলে উত্তর দেওয়ার একটি উপায় হল গণনা করা এবং কিছু শ্রেণীবিভাগ দেখা ছন্দোবিজ্ঞান.

শিক্ষার তত্ত্বাবধান করা হয় বিবেচনা করে, আমরা এর সাথে ভবিষ্যদ্বাণী করতে পারি X_test এবং সেই ভবিষ্যদ্বাণী ফলাফলগুলির তুলনা করুন - যা আমরা বলতে পারি y_pred - বাস্তবের সাথে y_test, বা কঠিন সত্য.

কিছু তথ্য ভবিষ্যদ্বাণী করতে, মডেল এর predict() পদ্ধতি ব্যবহার করা যেতে পারে। এই পদ্ধতিটি পরীক্ষার বৈশিষ্ট্যগুলি গ্রহণ করে, X_test, একটি যুক্তি হিসাবে এবং একটি ভবিষ্যদ্বাণী প্রদান করে, হয় 0 বা 1, প্রতিটির জন্য X_testএর সারি।

ভবিষ্যদ্বাণী করার পর X_test তথ্য, ফলাফল সংরক্ষণ করা হয় a y_pred পরিবর্তনশীল তাই সাধারণ রৈখিক SVM মডেলের সাথে ভবিষ্যদ্বাণী করা প্রতিটি ক্লাসই এখন রয়েছে৷ y_pred পরিবর্তনশীল।

এটি ভবিষ্যদ্বাণী কোড:

y_pred = svc.predict(X_test)

আমাদের ভবিষ্যদ্বাণী আছে বিবেচনা করে, আমরা এখন তাদের প্রকৃত ফলাফলের সাথে তুলনা করতে পারি।

মডেল মূল্যায়ন

প্রকৃত ফলাফলের সাথে ভবিষ্যদ্বাণী তুলনা করার বিভিন্ন উপায় রয়েছে এবং তারা একটি শ্রেণীবিভাগের বিভিন্ন দিক পরিমাপ করে। কিছু সর্বাধিক ব্যবহৃত শ্রেণিবিন্যাস মেট্রিকগুলি হল:

  1. বিভ্রান্তি ম্যাট্রিক্স: যখন আমাদের জানতে হবে কতটা নমুনা আমরা সঠিক বা ভুল পেয়েছি প্রতিটি ক্লাস. যে মানগুলি সঠিক এবং সঠিকভাবে ভবিষ্যদ্বাণী করা হয়েছিল তাকে বলা হয় সত্য ইতিবাচক, যেগুলিকে ইতিবাচক হিসাবে ভবিষ্যদ্বাণী করা হয়েছিল কিন্তু ইতিবাচক ছিল না তাকে বলা হয় মিথ্যা ইতিবাচক. এর একই নামকরণ সত্য নেতিবাচক এবং মিথ্যা নেতিবাচক নেতিবাচক মানগুলির জন্য ব্যবহৃত হয়;

  2. স্পষ্টতা: যখন আমাদের লক্ষ্য হল আমাদের শ্রেণিবিন্যাসকারীর দ্বারা সঠিক ভবিষ্যদ্বাণী মানগুলিকে সঠিক বলে বিবেচিত হয়েছে তা বোঝা। নির্ভুলতা সেই সত্যিকারের ইতিবাচক মানগুলিকে সেই নমুনাগুলি দ্বারা ভাগ করবে যা ইতিবাচক হিসাবে ভবিষ্যদ্বাণী করা হয়েছিল;

$$
নির্ভুলতা = ফ্র্যাক{টেক্সট{ট্রু ইতিবাচক}}{টেক্সট{ট্রু ইতিবাচক} + টেক্সট{ফলস ইতিবাচক}}
$$

  1. প্রত্যাহার: আমাদের ক্লাসিফায়ার দ্বারা কতগুলি সত্য ইতিবাচক চিহ্নিত করা হয়েছে তা বোঝার জন্য সাধারণত নির্ভুলতার সাথে গণনা করা হয়। প্রত্যাহার গণনা করা হয় সত্যিকারের ইতিবাচককে এমন কিছু দিয়ে ভাগ করে যা ইতিবাচক হিসাবে ভবিষ্যদ্বাণী করা উচিত ছিল।

$$
recall = frac{text{true positives}}{text{true positives} + text{false negatives}}
$$

  1. F1 স্কোর: সুষম বা সুরেলা গড় নির্ভুলতা এবং প্রত্যাহার. সর্বনিম্ন মান 0 এবং সর্বোচ্চ 1। কখন f1-score 1 এর সমান, এর মানে হল সমস্ত ক্লাস সঠিকভাবে ভবিষ্যদ্বাণী করা হয়েছিল - এটি বাস্তব ডেটার সাথে প্রাপ্ত করা একটি খুব কঠিন স্কোর (ব্যতিক্রম প্রায় সবসময়ই থাকে)।

$$
text{f1-score} = 2* frac{text{precision} * text{recall}}{text{precision} + text{recall}}
$$

আমরা ইতিমধ্যেই কনফিউশন ম্যাট্রিক্স, নির্ভুলতা, রিকল এবং F1 স্কোর পরিমাপের সাথে পরিচিত হয়েছি। তাদের গণনা করতে, আমরা স্কিট-লার্নস আমদানি করতে পারি metrics লাইব্রেরি এই লাইব্রেরিতে রয়েছে classification_report এবং confusion_matrix পদ্ধতি, শ্রেণীবিভাগ রিপোর্ট পদ্ধতি নির্ভুলতা, প্রত্যাহার, এবং f1 স্কোর প্রদান করে। উভয় classification_report এবং confusion_matrix সেই সমস্ত গুরুত্বপূর্ণ মেট্রিক্সের মানগুলি খুঁজে বের করতে সহজেই ব্যবহার করা যেতে পারে।

মেট্রিক্স গণনার জন্য, আমরা পদ্ধতিগুলি আমদানি করি, সেগুলিকে কল করি এবং আর্গুমেন্ট হিসাবে ভবিষ্যদ্বাণীকৃত শ্রেণীবিভাগগুলিকে পাস করি, y_test, এবং শ্রেণীবিভাগ লেবেল, বা y_true.

বিভ্রান্তি ম্যাট্রিক্সের একটি ভাল ভিজ্যুয়ালাইজেশনের জন্য, আমরা এটিকে সিবোর্নে প্লট করতে পারি heatmap পরিমাণ টীকা সহ, এবং শ্রেণীবিভাগ রিপোর্টের জন্য, এটির ফলাফল প্রিন্ট করা ভাল, তাই এর ফলাফলগুলি বিন্যাসিত হয়৷ এটি নিম্নলিখিত কোড:

from sklearn.metrics import classification_report, confusion_matrix cm = confusion_matrix(y_test,y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Confusion matrix of linear SVM') print(classification_report(y_test,y_pred))

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

 precision recall f1-score support 0 0.99 0.99 0.99 148 1 0.98 0.98 0.98 127 accuracy 0.99 275 macro avg 0.99 0.99 0.99 275
weighted avg 0.99 0.99 0.99 275

Python এর Scikit-Learn PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ SVM এবং Kernel SVM বাস্তবায়ন করা। উল্লম্ব অনুসন্ধান. আ.

শ্রেণীবিভাগের প্রতিবেদনে, আমরা জানি যে নকল নোটের জন্য 0.99 এর একটি নির্ভুলতা, 0.99 এর প্রত্যাহার এবং 1 এর একটি f0.99 স্কোর রয়েছে, বা শ্রেণী 0। এই পরিমাপগুলি সমর্থন কলামে দেখানো 148টি নমুনা ব্যবহার করে প্রাপ্ত করা হয়েছিল। এদিকে, ক্লাস 1, বা আসল নোটের জন্য, ফলাফল ছিল এক ইউনিট নীচে, 0.98 নির্ভুলতা, 0.98 প্রত্যাহার এবং একই F1 স্কোর। এই সময়, সেই ফলাফলগুলি পাওয়ার জন্য 127 টি চিত্র পরিমাপ ব্যবহার করা হয়েছিল।

যদি আমরা বিভ্রান্তি ম্যাট্রিক্সের দিকে তাকাই, আমরা এটিও দেখতে পারি যে 148টি ক্লাস 0 নমুনা থেকে, 146টি সঠিকভাবে শ্রেণীবদ্ধ করা হয়েছিল এবং সেখানে 2টি মিথ্যা ইতিবাচক ছিল, যখন 127টি ক্লাস 1 নমুনার জন্য, 2টি মিথ্যা নেতিবাচক এবং 125টি সত্য পজিটিভ ছিল।

আমরা শ্রেণীবিভাগ রিপোর্ট এবং বিভ্রান্তি ম্যাট্রিক্স পড়তে পারি, কিন্তু তারা কি মানে?

ফলাফল ব্যাখ্যা

অর্থ খুঁজে বের করতে, আসুন একত্রিত সমস্ত মেট্রিক্স দেখি।

ক্লাস 1-এর প্রায় সমস্ত নমুনা সঠিকভাবে শ্রেণীবদ্ধ করা হয়েছিল, প্রকৃত ব্যাঙ্ক নোট শনাক্ত করার সময় আমাদের মডেলের জন্য 2টি ভুল ছিল৷ এটি 0.98, বা 98%, প্রত্যাহার হিসাবে একই। ক্লাস 0 এর ক্ষেত্রেও অনুরূপ কিছু বলা যেতে পারে, শুধুমাত্র 2টি নমুনা ভুলভাবে শ্রেণীবদ্ধ করা হয়েছে, যখন 148টি সত্য নেতিবাচক, মোট 99% এর নির্ভুলতা।

এই ফলাফলগুলি ছাড়াও, অন্য সবগুলি 0.99 চিহ্নিত করছে, যা প্রায় 1, একটি খুব উচ্চ মেট্রিক৷ বেশিরভাগ সময়, যখন এই ধরনের উচ্চ মেট্রিক বাস্তব জীবনের ডেটার সাথে ঘটে, তখন এটি এমন একটি মডেলকে নির্দেশ করতে পারে যা ডেটার সাথে সামঞ্জস্যপূর্ণ, বা ওভারফিটেড.

যখন একটি ওভারফিট থাকে, মডেলটি ইতিমধ্যে পরিচিত ডেটার পূর্বাভাস দেওয়ার সময় ভাল কাজ করতে পারে, তবে এটি নতুন ডেটাতে সাধারণীকরণ করার ক্ষমতা হারায়, যা বাস্তব বিশ্বের পরিস্থিতিতে গুরুত্বপূর্ণ।

একটি ওভারফিট ঘটছে কিনা তা খুঁজে বের করার জন্য একটি দ্রুত পরীক্ষা ট্রেনের ডেটা দিয়েও। যদি মডেলটি ট্রেনের ডেটা কিছুটা মুখস্থ করে থাকে তবে মেট্রিক্স 1 বা 100% এর খুব কাছাকাছি হবে। মনে রাখবেন যে ট্রেনের ডেটা পরীক্ষার ডেটা থেকে বড় - এই কারণে - এটিকে আনুপাতিকভাবে দেখার চেষ্টা করুন, আরও নমুনা, ভুল করার সম্ভাবনা বেশি, যদি না কিছু ওভারফিট না থাকে।

ট্রেন ডেটা দিয়ে ভবিষ্যদ্বাণী করতে, আমরা পরীক্ষার ডেটার জন্য যা করেছি তা পুনরাবৃত্তি করতে পারি, কিন্তু এখন X_train:

y_pred_train = svc.predict(X_train) cm_train = confusion_matrix(y_train,y_pred_train)
sns.heatmap(cm_train, annot=True, fmt='d').set_title('Confusion matrix of linear SVM with train data') print(classification_report(y_train,y_pred_train))

এই আউটপুট:

 precision recall f1-score support 0 0.99 0.99 0.99 614 1 0.98 0.99 0.99 483 accuracy 0.99 1097 macro avg 0.99 0.99 0.99 1097
weighted avg 0.99 0.99 0.99 1097

Python এর Scikit-Learn PlatoBlockchain ডেটা ইন্টেলিজেন্স সহ SVM এবং Kernel SVM বাস্তবায়ন করা। উল্লম্ব অনুসন্ধান. আ.

99 গুণ বেশি ডেটা থাকাকালীন ট্রেনের মেট্রিক্স 4% হয়ে গেলে ওভারফিট বলে মনে করা সহজ। এই দৃশ্যে কি করা যেতে পারে?

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

আপনি এই গাইডের দ্বিতীয় অংশটি পরীক্ষা করতে পারেন (শীঘ্রই আসছে!) কিভাবে ক্রস বৈধতা বাস্তবায়ন করতে হয় এবং একটি হাইপারপ্যারামিটার টিউনিং করতে হয় তা দেখতে।

উপসংহার

এই নিবন্ধে আমরা সাধারণ লিনিয়ার কার্নেল SVM অধ্যয়ন করেছি। আমরা SVM অ্যালগরিদমের পিছনে অন্তর্দৃষ্টি পেয়েছি, একটি বাস্তব ডেটাসেট ব্যবহার করেছি, ডেটা অন্বেষণ করেছি এবং দেখেছি কীভাবে এই ডেটাটি Python এর Scikit-Learn লাইব্রেরির সাথে প্রয়োগ করে SVM-এর সাথে ব্যবহার করা যেতে পারে।

অনুশীলন চালিয়ে যেতে, আপনি অন্যান্য বাস্তব-বিশ্বের ডেটাসেটগুলির মতো জায়গায় উপলব্ধ করার চেষ্টা করতে পারেন৷ Kaggle, আইসিইউ, বিগ কোয়েরি পাবলিক ডেটাসেট, বিশ্ববিদ্যালয়, এবং সরকারী ওয়েবসাইট।

আমি আপনাকে SVM মডেলের পিছনে প্রকৃত গণিত অন্বেষণ করার পরামর্শ দেব। যদিও SVM অ্যালগরিদম ব্যবহার করার জন্য আপনার এটির প্রয়োজন হবে না, তবে আপনার অ্যালগরিদম সিদ্ধান্তের সীমানা খুঁজে বের করার সময় পর্দার পিছনে আসলে কী ঘটছে তা জানা এখনও খুব সহজ।

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

থেকে আরো Stackabuse