৭.১. প্রথম প্রেডিকশন

প্রথম প্রেডিকশন

আমাদের ডাটাগুলোকে "আর" স্টুডিওতে লোড করলাম। এখন আসি আমাদের মেশিন লার্নিং এর প্রথম প্রেডিকশনে। একটা জিনিস জেনে রাখা ভালো, আমরা যতগুলো স্ক্রিপ্ট তৈরি করব, প্রতিটা শুরুতেই ডাটাসেট লোড করার জন্য কমান্ডগুলো আগে থেকেই লেখা থাকবে। এর ফলে প্রতিটি স্ক্রিপ্টটি হবে স্বয়ংসম্পূর্ণ। চলে যাই আমাদের প্রথম প্রেডিকশনে। শুরু করি আমাদের ডাটা নিয়ে আসল খোঁচা খুঁচি। এটাকে আমরা ডাটা সাইন্সের ভাষায় বলি, "এক্সপ্লোরেটোরি ডাটা এনালাইসিস"। ডাটাকে হৃদয়ে ঢুকে ঠিকমতো বোঝা।

এক্সপ্লোরেটরি ডাটা অ্যানালাইসিস

শুরুতেই লোড করি নতুন স্ক্রিপ্ট। প্রথম প্রেডিকশন। স্ক্রিপের নাম 1st-prediction.R।

১. চালু করুন আর ষ্টুডিও।

২. ক্লিক করুন “ফাইল”, তারপর “ওপেন ফাইল” → খুঁজে নিন আমাদের নতুন স্ক্রিপ্ট ওয়ার্কিং ডিরেক্টরি থেকে।

৩. ডাটাসেট লোড করার কমান্ডগুলোর পড়ে দেখুন প্রথম প্রেডিকশনে।

শুরুতেই চলেন “এক্সেস” করি আমাদের Survived কলামে। "আর" ষ্টুডিওর train ডাটাফ্রেমে। ওই কলামে “এক্সেস” করতে দরকার $ মানে ডলার চিহ্ন। আমরা ট্রেইন ডাটাফ্রেমে যদি জানতে চাই কতোজন বেঁচে অথবা মারা গিয়েছেন তাহলে সেটা জানতে হবে Survived কলাম থেকে। আর সেটাকে যদি আমরা টেবিল আকারে চাই তাহলে আরো ভালো হয়। এর জন্য খুঁজুন স্ক্রিপ্টের এই কমান্ডটা। ওই লাইনটার ওপর কার্সার রেখে চালান “রান” কমান্ড।

table(train$Survived)

কি এসেছে?

> table(train$Survived)

0 1

549 342

কাহিনী কি?

যেহেতু আমাদের Survived কলামে ০ এবং ১ আছে, কেমন হয় যদি আমরা সেই কলাম থেকে মোট শূন্যের সংখ্যা এবং "এক" সংখ্যা এর মোট সংখ্যা বের করি? তার মানে আমরা বের করতে পারবো কতোজন বেঁচে অথবা মারা গিয়েছেন। এজন্য আর এর একটা বেসিক সামারি স্ট্যাটিসটিক্স ফাংশন আছে, যার সোজা নাম table। আমরা train ডাটাফ্রেমে “সারভাইভড” কলামে কতজন বেঁচেছেন আর কতজন মারা গেছেন - সেটার সংখ্যা আসবে টেবুলেশন আকারে। আমাদের train ডাটাসেটে ৮৯১ জন এর মধ্যে বেঁচেছেন ৩৪২ জন। আর মারা গিয়েছেন ৫৪৯ জন। তার মানে আমাদের হিসেব বলে - মারা গিয়েছেন বেশিরভাগ মানুষই। কতভাগ মানুষ মারা গেছেন সেটা বের করতে আমাদের তৈরি করতে হবে অনুপাতের হিসাব। আর এই অনুপাত বের করার জন্য একটা “আর” ফাংশন আছে table নামে। চলুন আমাদের টেবিল ফাংশনটাকে পাঠিয়ে দেই নতুন ফাংশন এর পেটে। এটা ঠিক - অনেক কিছুই আমরা মুখে মুখে করতে পারি, তবে আপনাদের সুবিধার জন্য ঝালিয়ে নিচ্ছি কিছু “আর” কমান্ড। আগেই তো বলেছি আমরা কাজ করার পাশাপাশি শিখব বেশ কিছু “আর” কমান্ড। সমস্যা নেই তো আপনাদের?

> prop.table(table(train$Survived))

0 1

0.6161616 0.3838384

ভালো একটা অনুপাত পাওয়া গেল এখানে। কেমন যেন ভগ্নাংশে এসেছে জিনিসপত্র। শতকরা ভাগে পেতে গুন করে দেই ১০০ দিয়ে।

> prop.table(table(train$Survived)) * 100

0 1

61.61616 38.38384

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

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

এর পাশাপাশি আমরা চাচ্ছি আপনি যাতে অভ্যেস করেন এই সাবমিশনের। চেখে দেখেন নিজে আপনি কোথায় দাঁড়ান। প্রতি পদে পদে। ভয় পাবেননা সাবমিশনে। দশটার মতো সাবমিশন করতে পারবেন দিনে।

তার মানে - আমাদের টেস্ট সেটে দেখাতে হবে Survived কলামটা সব "০"। আগাগোড়া "০" - একেবারে শূন্য। আগে দেখে নিন - টেস্ট ডাটাফ্রেম লোড করা আছে তো আপনার? আমরা যদি ভালোভাবে লক্ষ্য করি test ডাটাফ্রেমে, কি দেখছি এখানে? Survived কলামটাই তো নেই। তাহলে? এখানে “আর” দুর্দান্ত। হটাৎ করেই তৈরি করতে পারে নতুন কলাম, কোন ক্যাচাল না করেই। এর পাশাপাশি এই কলামটা ভরে দিতে হবে শূন্য দিয়ে। কারন - আমরা ধারণা করছি মারা গেছে সবাই। এই দুটো কাজ আর করবে এক কমান্ডেই। এইখানেই "আর" এর দক্ষতা অতুলনীয়।

test$Survived <- rep(0, 418)

আগেই বলেছি "<-" হচ্ছে অ্যাসাইনমেন্ট অপারেটর। <- জিনিসটা তৈরি করে দেবে Survived কলাম - যদি না থাকে। আবার ৪১৮ বার ০ দিয়ে পূরণ করবে টেস্ট ডাটাফ্রেমের ৪১৮ জনের ডাটাতে। rep মানে হচ্ছে repeat করো ০ কে ৪১৮ বার। এক ঢিলে দুই পাখি।

দুর্দান্ত, তাই না?

এখন ক্যাগলে সাবমিশনের পালা। রেডি তো?

ক্যাগলে সাবমিশনের জন্য প্রস্তুতি

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

তবু আমাদের সবার জন্য লিখে দিচ্ছি উত্তর লেখার নিয়মটা। কারণ, এই নিয়মটাই আমরা ফলো করবো প্রতিটা প্রেডিকশনে। তৈরি তো?

১. আমাদের টেস্ট ডাটা সেটটা আছে csv ফাইলে, আমাদেরকে উত্তরটা দিতে হবে একই ফরম্যাটে। মানে ওই csv ফাইলে।

২. এখানে কলাম হবে দুটো। একটা প্রশ্নের সিরিয়াল নম্বর আরেকটা উত্তর। ধারণা করুন তো কি হতে পারে এখানে? ঠিক ধরেছেন। এখানে প্রশ্নের সিরিয়াল এর কলাম হচ্ছে আমাদের PassengerId, উত্তরের কলাম হচ্ছে Survived।

৩. এখানে থাকবে দুটো হেডার "রো" মানে সারি। বলুন তো কি হবে হেডারগুলোর নাম? সেটাই কলাম নাম হবে। ঠিক বলেছেন। PassengerId এবং Survived।

৪. উত্তরের ডাটা ফ্রেমে “রো” মানে সারি নম্বর নিষ্প্রয়োজন। বাই ডিফল্ট তৈরি করে “আর ষ্টুডিও”। 'এক্সপ্লিসিট' মানে আলাদাভাবে না করে দিতে হবে।

সাবমিশন ফাইল তৈরি

prediction1 <- data.frame (PassengerId = test$PassengerId, Survived = test$Survived)

write.csv (prediction1, file = "1stprediction.csv", row.names = FALSE)

এখানে data.frame নামের ফাাংশনটা দুটো ভ্যারিয়েবলের হেডার সহ পুরো জিনিস পাঠিয়ে দিচ্ছে prediction1 নামের ডাটাফ্রেমে। প্রয়োজন মাফিক টেস্ট ডাটাফ্রেমের ভেতরের দুটো ভ্যারিয়েবলই দরকার এখানে। তারপর write.csv ফাাংশনটা ওই ডাটাফ্রেমকে পাঠিয়ে দিচ্ছে একটা ফিজিক্যাল সিএসভি ফাইলে। উত্তরপত্র হিসেবে। সেটা পাবেন আমাদের ওয়ার্কিং ডিরেক্টরিতে। রান করুন এই দুটো লাইন। এতে তৈরি হয়ে যাবে "1stprediction.csv" নামে একটা ফাইল। আবারো বলছি - সেটা পাওয়া যাবে আমাদের ওয়ার্কিং ডিরেক্টরিতে। এখন উত্তরটা খুলে দেখি এক্সেলে। অবশ্যই দেখতে হবে খুলে। ওপরের চারটা কন্ডিশন মেনেছে তো ফাইলটা? এই দুটো লাইন ব্যবহার হবে প্রতিটা প্রেডিকশনে।

বাকি থাকে কি? আসল সাবমিশন?

ক্যাগলে সাবমিশন

সাবমিশন জিনিসটা মেইল পাঠানোর মতো অনেকটা। পানির মতো সহজ।

আবার লিস্ট!

২. ক্লিক করুন Submit Predictions বাটন। একটা আপলোড বক্স আসবে আপনার সামনে। আপলোড বক্সে ড্র্যাগ করে ছেড়ে দিন আপনার উত্তর 1stprediction.csv ফাইলটা। আপনার ব্রাউজার ড্রপ ফ্যাসিলিটি না দিলে ব্রাউজ করে দেখিয়ে দিন আপনার ফাইলটাকে। আপলোড শেষ।

একটা ব্যাপার দেখেছেন কি? মনে আছে তো আমাদের প্রথম প্রপোরশন টেবিলের কথা? সেটার শতাংশ আর আমাদের উত্তর কিন্তু প্রায় একরকম। কারণটা জানেন কি?

ব্যবহৃত গিটহাব স্ক্রিপ্ট (অনলাইন)

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

https://github.com/raqueeb/mltraining/blob/master/ML-workbook/1st-prediction.R

Last updated