#!/usr/bin/env python # coding: utf-8 # ## এক্সপ্লোরেটরি ডেটা অ্যানালাইসিস # রিভিশন ৪ # আসলে আমাদের ডেটার ভেতরে কী আছে সেটা না জানলে এর থেকে প্রেডিকশন বের করবো কী করে? সেকারণে এই এক্সপ্লোরেশন। ডেটা নিয়ে একটু ঘাঁটাঘাঁটি করলে এর ভেতরের অনেক ধারণা পাওয়া যায় যেটা মডেল সিলেকশন অথবা ফীচারগুলো বুঝতে সুবিধা হয়। আগের চ্যাপ্টারের ভেতরে কিছুটা "এক্সপ্লোরেটরি ডেটা অ্যানালাইসিস" করলেও এখানে সেটাকে আরেকটু খোলাসা করছি। # ### ডাটার শেপ, মানে কতোটা ইনস্ট্যান্স? # In[33]: n_samples, n_features = iris.data.shape # In[34]: n_samples # In[35]: n_features # In[36]: print("Shape of data:", iris['data'].shape) # কোন ডাটা মিসিং নেই # In[37]: len(iris.target) == n_samples # # ### ফিচারগুলোর নাম # # ওপরের ছবিতে চারটা ফিচারের নাম দেখেছি। চলুন দেখি সেগুলো আমাদের ডাটাসেট অবজেক্টে। iris এর পর ডট নোটেশন ব্যবহার করে ডাকি একটা "কী" ভ্যালুকে। feature_names হচ্ছে আমাদের iris.keys() থেকে পাওয়া একটা অ্যাট্রিবিউট। # In[38]: iris.feature_names # In[39]: print(iris['feature_names']) # ### টার্গেট অর্থাৎ কী প্রেডিক্ট করতে চাই আমরা? # # অনেকভাবেই করা সম্ভব। তবে print ফরম্যাটিং এ ভালো কাজ করে। # In[40]: iris.target_names # In[41]: print(iris.target_names) # In[42]: list(iris.target_names) # In[43]: print("Target names:", iris['target_names']) # ### কি আছে ডাটা অ্যারে আর টার্গেট অ্যারে এর ভেতর? # # এখানে অ্যারে নিয়ে কাজ হচ্ছে। iris.dataতে সেই চারটা ১. পেটাল দৈর্ঘ্য, ২. পেটাল প্রস্থ, ৩. সিপাল দৈর্ঘ্য, ৪. সিপাল প্রস্থ মাপগুলো পাশাপাশি দেয়া আছে। শুরুতে দেখি প্রথম রেকর্ড। এরপর পুরো রেকর্ড। # In[44]: iris.data[0] # In[45]: iris.data # In[46]: iris.target # আমাদের "ফিচার" আর "রেসপন্স" অর্থাৎ "টার্গেট" কি ধরণের কন্টেইনারে আছে, সেটা জানতে চাইলাম এখানে। ঠিক ধরেছেন। "নামপাই অ্যারে"। # In[47]: print(type(iris.data)) print(type(iris.target)) # ফিচারের ম্যাট্রিক্স কি? (১ম ডাইমেনশন = অবজার্ভেশনের সংখ্যা, ২য় = ফিচারের সংখ্যা) # In[48]: print(iris.data.shape) # টার্গেট ম্যাট্রিক্স কি? (১ম ডাইমেনশন = লেবেল, টার্গেট, রেসপন্স) # In[49]: print(iris.target.shape) # In[50]: print("Shape of target:", iris['target'].shape) # ### সাইকিট-লার্ন এ ডাটা হ্যান্ডলিং এর নিয়ম # # ১. এখানে "ফিচার" এবং "রেসপন্স" দুটো আলাদা অবজেক্ট # (আমাদের এখানে দেখুন, "ফিচার" এবং "রেসপন্স" মানে "টার্গেট" আলাদা অবজেক্ট) # # ২. "ফিচার" এবং "রেসপন্স" দুটোকেই সংখ্যা হতে হবে # (আমাদের এখানে দুটোই সংখ্যার, দুটোর ম্যাট্রিক্স ডাইমেনশন হচ্ছে (১৫০ x ৪) এবং (১৫০ x ১) # # ৩. "ফিচার" এবং "রেসপন্স" দুটোকেই "নামপাই অ্যারে" হতে হবে। # (আমাদের দুটো ফিচারই আছে "নামপাই অ্যারে"তে, বাকি ডাটা ডাটাসেট দরকার হলে সেটাকেও লোড করে নিতে হবে "নামপাই অ্যারে"তে) # # ৪. "ফিচার" এবং "রেসপন্স" দুটোকেই স্পেসিফিক shape হতে হবে # # * ১৫০ x ৪ -> পুরো ডাটাসেট # * ১৫০ x ১ টার্গেটের জন্য # * ৪ x ১ ফিচারের জন্য # * আমরা ইচ্ছা করলে যেকোন ম্যাট্রিক্স পাল্টে নিতে পারি আমাদের দরকার মতো। যেমন np.tile(a, [4, 1]), মানে a হচ্ছে ম্যাট্রিক্স আর [4, 1] হচ্ছে ইনডেন্ট ম্যাট্রিক্স আরেক ডাইমেনশনে। # In[51]: # ফিচার ম্যাট্রিক্স স্টোর করছি বড় "X"এ, মনে আছে f(x)=y কথা? x ইনপুট হলে y আউটপুট X = iris.data # রেসপন্স ভেক্টর রাখছি "y" তে y = iris.target # In[52]: X # In[53]: y