প্রিন্সিপাল কম্পোনেন্ট এনালাইসিস এবং ডাইমেনশনালিটি রিডাকশন

মেশিন লার্নিং-এ ডেটাসেট যদি বড় হয় তাহলে মডেলও সাধারনত বেশ ভালো হয়। কিন্তু ডেটাসেটের সাইজ যদি খুব বেশী বড় হয়ে যায় তখন আবার উল্টো বেশ কিছু ঝামেলায় পড়তে হয়। খুব বড় ডেটাসেটে ফিচারের সংখ্যা সাধারনত বেশী হয়ে থাকে ফলে ডেটাসেটের ডাইমেনশনও বেশী হয়ে যায়। এরকম বড় ডাইমেশনের ডেটাসেটে সাধারনত অনেক রিডান্ডেন্ট ফিচার থাকে (একই ধরনের ফিচারের একাধিক বার উপস্থিতি )। এধরনের রিডান্ডেন্ট ফিচারের কারনে এক্সপ্লোরেটরি ডেটা এনালিসিস থেকে ডেটাসেটের ইনসাইটস বের করা বেশ কষ্টকর হয়ে যায়। এবং একই সাথে এধরনের ডেটাসেট প্রচুর পরিমানে কম্পিটেশনাল রিসোর্স ব্যবহার করে থাকে।
এই সমস্যার পরিত্রানের জন্যই ডেটাসেটের ডাইমেনশনকে ছোট করে ফেলা হয়, আর এই পদ্ধতিকেই বলা হয় ডাইমেনশনালিটি রিডাকশন। ডেটাসেটের ডাইমেনশনালিটি রিডাকশনের জন্য প্রথমেই আমাদের জেনে নিতে হয় কোন ফিচার গুলো অপেক্ষাকৃত বেশী গুরুত্বপূর্ণ , আর কোন ফিচার গুলো কম গুরুত্বপূর্ণ। যে পদ্ধতির মাধ্যমে গুরুত্বপূর্ণ ফিচার গুলো সনাক্ত করা হয় সেটাকে বলা হয় প্রিন্সিপাল কম্পোনেন্ট এনালাইসিস বা পিসিএ। প্রিন্সিপাল কম্পোনেন্ট এনালাইসিসে সাধারনত কোরিলেশন এবং প্যাটার্ন ব্যবহার করে গুরুত্বপূর্ণ ফিচার গুলো সনাক্ত করা হয়।
প্রিন্সিপাল কম্পোনেন্ট এনালাইসিসের ধাপ সমূহ,
১। স্কেলাইজড ডেটাসেট– স্কেলাইজেশন মূলত ডেটাসেটকে একধরণের সমতা করন পদ্ধতি। এরফলে ডেটাসেটকে অপেক্ষাকৃত আনবায়াজড করা হয়। ধরুন কোন ডেটাসেটে কিছু মানুষের বয়স এবং আয়ের ডেটা রয়েছে। বয়সের রেঞ্জ সাধারনত ০ থেকে ১১০ পর্যন্ত হতে পারে অপরদিকে আয়/বেতন কয়েক লাখ পর্যন্ত হতে পারে। তাহলে এই দুটি ফিচারের রেঞ্জ কিন্তু অনেক আলাদা, একই স্কেলে এদের তুলনা করা যুক্তিযুক্ত নয়। এধরনের ভিন্ন রেঞ্জের ফিচারকে একই স্কেলে তুলনা করার জন্যই স্কেলিং করা হয়। এটি প্রিন্সিপাল কম্পোনেন্ট এনালাইসিসের একটি গুরুত্বপূর্ণ ধাপ। ডেটা ট্রান্সফরমেশন অধ্যায়ে এবিষয়ে বিস্তারিত আলোচনা করা হয়েছে। সেখানে আমরা দেখেছি কিভাবে বিভিন্ন পদ্ধতিতে স্কেলাইজড করা যায়।
২। কোভ্যারিয়েন্স ম্যাট্রিক্স তৈরি – কোভ্যারিয়েন্স কি সেটা আমরা এই বইয়ের পরিসংখ্যান অধ্যায়ে আলোচনা করেছি। মূলত ডেটাসেটের বিভিন্ন ভ্যারিয়েবল গুলোর মধ্যকার কোভ্যারিয়েন্স থেকেই কোভ্যারিয়েন্স ম্যাট্রিক্স তৈরি করা হয়।
৩। আইজেন ভেক্টর এবং আইজেন ভ্যালু নির্ণয়- আইজেন ভেক্টরের সবথেকে সহজ উদাহরণ হচ্ছে ট্রান্সফরমেশন হলেও এটি ডিরেকশন পরিবর্তন করে না। সাধারনত কোভ্যারিয়েন্স ম্যাট্রিক্স থেকে আইজেন ভ্যালু নির্ণয় করা হয়। যে ভ্যারিয়েবল সমূহের ভেতর কোভ্যারিয়েন্স বেশী এরাই সবথেকে বেশী ইনফরমেশন ধারন করে।
ছবি - আইজেন ভেক্টর ( সূত্র- ইন্টারনেট )
আইজেন ভেক্টর সম্পর্কে লিনিয়ার অ্যাালজেব্রা অধ্যায়ে বিস্তারিত আলোচনা করা হয়েছে।
৪। প্রিন্সিপাল কম্পোনেন্ট নির্ণয় - আইজেন ভেক্টর এবং আইজেন ভ্যালু নির্ণয়ের পরে আমরা প্রাপ্ত মানকে ডিস্যান্ডিং অর্ডারে সাজাবো। সবথেকে বড় আইজেন ভ্যালু হচ্ছে সবথেকে বেশী গুরুত্বপূর্ণ এবং এটিই প্রথম প্রিন্সিপ্যাল কম্পোনেন্ট গঠন করে। এভাবেই যথাক্রমে পরবর্তী ভ্যালু গুলো ব্যবহার করে ক্রমান্বয়ে পরবর্তী প্রিন্সিপাল কম্পোনেন্ট গঠন করা হয়।
৫। ডাইমেনশন রিডাকশন - প্রথম প্রিন্সিপাল কম্পোনেন্ট ডেটাসেট সম্পর্কে সবথেকেবেশি গুরুত্বপূর্ণ তথ্য ধারন করে, এভাবে পর্যায়ক্রমে অন্যান্য প্রিন্সিপাল কম্পোনেন্ট গুলো ক্রমান্বয়ে গুরুত্বপূর্ণ তথ্য ধারন করে। আমরা চাইলে এখান থেকে অপেক্ষাকৃত কম গুরুত্বপূর্ণ বা একেবারেই ভূমিকা নেই বললেই চলে এমন কম্পোনেন্টকে বাদ দিয়ে ডাইমেনশনালিটি রিডাকশন করতে পারি।
প্রিন্সিপাল কম্পোনেন্ট এনালাইসিস এবং ডাইমেনশনালিটি রিডাকশন এর কিছু বৈশিষ্ট্য
  • ওভারফিটিং দূর করে এবং মাল্টিকলিনিয়ারিটি সমস্যা দূর করে।
  • ডাইমেনশন রিডাকশন হাওয়ায় অপেক্ষাকৃত কম মেমোরির প্রয়োজন হয় এবং অ্যালগরিদমের পারফরম্যান্স বৃদ্ধি পায় ।
  • 2D এবং 3D ( ডাইমেনশন ) ডেটার ক্ষেত্রে সহজেই ভিজুয়ালাইজ করা সম্ভব হয়, অপরদিকে অনেকক্ষেত্রেই অধিক ডাইমেনশনাল ডেটা ভিজুয়ালাইজ করা সাধারনত অসম্ভব।
  • ডাইমেনশন রিডাকশনের ফলে কম স্টোরেজের প্রয়োজন হয়।
  • ডাইমেনশনে রিডাকশনের ফলে ইনফরমেশন লস হয় ।
পাইথনে প্রিন্সিপাল কম্পোনেন্ট এনালাইসিস এবং ডাইমেনশনালিটি রিডাকশন
প্রিন্সিপাল কম্পোনেন্ট এনালাইসিস দেখার জন্য আমরা আইরিস ডেটাসেটটি ব্যবহার করবো,
import pandas as pd
url='https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-iris.csv'
df = pd.read_csv(url)
df.head()
ফিচার এবং টার্গেট ভ্যারিয়েবল সেট করে নিচ্ছি,
features=['sepal_length','sepal_width','petal_length','petal_width']
x=df[features]
y=df.species
ডেটাসেটকে স্কেলাইজড করে নিচ্ছি,
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(x)
scaled = pd.DataFrame(scaler.transform(x),columns=x.columns)
scaled.head()
যেহেতু আমাদের ডেটাসেটে ফিচার ভ্যারিয়েবল ৪ টি সুতরাং এই ডেটাসেটের ডাইমেনশনও হবে ৪। এই ডেটাসেট থেকে আমরা সর্বোচ্চ ৪ টি প্রিন্সিপাল কম্পোনেন্ট পেতে পারি। ধরুন আমরা এই ডেটাসেটের সবগুলো প্রিন্সিপাল কম্পোনেন্ট দেখতে চাই,
from sklearn.decomposition import PCA
pca = PCA(n_components=4)
principalComponents = pca.fit_transform(scaled)
principalDf = pd.DataFrame(data = principalComponents , columns = ['pc-1', 'pc-2', 'pc-3','pc-4'])
principalDf
এবার প্রিন্সিপাল কম্পোনেন্টের সাথে টার্গেট ভ্যারিয়েবল যুক্ত করলে সম্পূর্ণ পরিবর্তিত একটি ডেটাসেট দেখতে পাবো।
finalDf = pd.concat([principalDf, df[['species']]], axis = 1)
finalDf.head()
এবার আমরা দেখবো ৪ টি প্রিন্সিপাল কম্পোনেন্টের ভেতরে কোন কম্পোনেন্ট কতখানি ইনফরমেশন ধারন করে বা কতখানি গুরুত্বপূর্ণ। নিচের অ্যারে থেকে আমরা দেখতে পাই ১ম এবং ২য় প্রিন্সিপাল কম্পোনেন্ট ডেটাসেটের প্রায় ৯৫.৮৭% ইনফরমেশন ধারন করে বা ডেটাসেটকে ব্যাখ্যা করতে পারে। ৩য় এবং ৪র্থ প্রিন্সিপাল কম্পোনেন্ট সেই তুলনায় অত্যন্ত নগণ্য বা একেবারেই কম গুরুত্বপূর্ণ।
pca.explained_variance_ratio_
আমরা চাইলে এটাকে প্লট করে দেখতে পারি, সেক্ষেত্রে বিষয়টি আরও সহজবোধ্য হয়।
import seaborn as sns
dfexp = pd.DataFrame({'var':pca.explained_variance_ratio_,'PC':['PC1','PC2','PC3','PC4']})
sns.barplot(x='PC',y="var", data=dfexp, color="c");
এবার প্রধান দুইটি প্রিন্সিপাল কম্পোনেন্টকে নিয়ে যদি প্লট করি সেক্ষেত্রে এই প্রিন্সিপাল কম্পোনেন্ট দুইটি কিভাবে ডেটাসেটকে ব্যাখ্যা করতে পারে সেটা সহজেই বোঝা যায়।
import matplotlib.pyplot as plt
sns.lmplot( x="pc-1", y="pc-2",data=finalDf,
fit_reg=False, hue='species', legend=True,scatter_kws={"s": 80})