ডেটা ট্রান্সফরমেশন

"When the winds of change blows, some people build walls and others build windmills."-- Ancient Chinese Proverb

ডেটা ট্রান্সফরমেশন মেশিন লার্নিং এর জন্য একটি গুরুত্বপূর্ণ বিষয়। ধরুন আপনার কাছে একটি ডেটাসেট আছে সেখানে কিছু মানুষের বয়স এবং আয়ের ডেটা রয়েছে। মানুষের বয়েসের রেঞ্জ সাধারনত ০ থেকে ১০০ পর্যন্ত হয়ে থাকে, বাস্তবে দেখা যায় যারা আয় করে তাদের বয়স হয়তো ২৫ থেকে ৬০ এর ভেতরে হয়ে থাকে । অপরদিকে আয়ের পরিমান কয়েক হাজার থেকে কয়েক লাখ পর্যন্ত হতে পারে। সুতরাং এটি আমাদের কাছে পরিষ্কার বয়স এবং আয়ের রেঞ্জের ভেতরে বিস্তর পার্থক্য রয়েছে। কোন কোন সময় এধরনের পার্থক্যের ফলে মডেল বায়াসড হতে পারে। এছাড়াও ডেটাকে স্কেলিং করে নিলে মডেলের পারফরম্যান্স বাড়ে , মডেল রান করতে অনেক ক্ষেত্রে কম সময় লাগে। এধরনের প্রেক্ষাপট থেকেই মূলত ডেটা ট্রান্সফরমেশন করা হয়। ডেটা ট্রান্সফরমেশনকে অনেকে ফিচার ইঞ্জিনিয়ারিংও বলে থাকেন।

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

লেবেল এনকোডিং

লেবেল এনকোডিং ক্যাটেগরিক্যাল ডেটা প্রসেস করার একটি পদ্ধতি। এই পদ্ধতিতে আমারা ক্যাটেগরিক্যাল ভ্যারিয়েবেলের সকল ইউনিক ভ্যালুকে আলাদা আলাদা নাম্বার দিয়ে প্রকাশ করতে পারি। ধরুন আপনার কাছে একটা ডেটাসেট আছে সেখানে মানুষের জেন্ডার হিসাবে পুরুষ বা স্ত্রী লেখা আছে। আমরা লেবেল এনকোডিং এর মাধ্যমে পুরুসদেরকে ১ এবং স্ত্রীদেরকে ২ দ্বারা প্রকাশ করতে পারি। এটাকে ডামি ভ্যারিয়েবলও বলা হয়। নিচের কোডে দেখা যাচ্ছে ST_NAME ভ্যারিয়্যাবলটি একটি ক্যাটেগরিক্যাল ভ্যারিয়্যাবল, যাতে বিভিন্ন সড়কের নাম দেয়া রয়েছে । লেবেল এনকোডিং এর মাধ্যমে আমরা প্রতিটি ইউনিক সড়কের নামকে আলাদা আলাদা নাম্বার দ্বারা প্রকাশ করেছি। এরপর ডেটাসেটি আবার শো করালে আমরা দেখতে পাই সকল সড়ককে (ইউনিক ) আলাদা আলাদা নাম্বার দ্বারা প্রকাশ করা হয়েছে।

from sklearn.preprocessing import LabelEncoder 
le = LabelEncoder() 
df['ST_NAME']= le.fit_transform(df['ST_NAME']) 
df

ম্যাপিং ফাংশন

ম্যাপিং ফাংশন এর মাধ্যমেও আমারা ডেটাকে নিউম্যারিক্যাল থেকে ক্যাটেগরিক্যাল অথবা ক্যাটেগরিক্যাল থেকে নিউম্যারিক্যাল কনভার্ট করতে পারি। নিচের উদাহরনে আমরা OWN_OCCUPIED কলাম এর Y কে 1 এবং N কে 2 দ্বারা ম্যাপ করে নিয়েছি।

#use of mapping function
mapping = {'Y' :1 , 'N' : 2 }
df['OWN_OCCUPIED'] = df['OWN_OCCUPIED'].map(mapping)
df

ওয়ান হট এনকোডার

ওয়ান হট এনকোডার হোল একটি জনপ্রিয় এনকডার যার মাধ্যমে ক্যাটেগরিক্যাল ভ্যারিয়্যাবলকে আলাদা আলাদা কলামে কনভার্ট করা যায় এবং প্রতিটি কলামে বুলিয়ান ট্রু / ফলস বা 0/1 দ্বারা তাদের উপস্থিতি প্রকাশ করা যায়। OneHotEncoderফাংশনের মাধ্যমে এই এনকোডিং করা হয়, তবে আমরা get_dummiesফাংশন ব্যবহার করে এর ডামি ভ্যারিয়েবলের মাধ্যমে নিচের উদাহরনে এর প্রয়োগ দেখবো। যেমন আমারা আমরা OWN_OCCUPIED কলামের 1 এবং 2 এর জন্য আলাদা আলাদা দুইটি কলাম তৈরি করেছি এবং কলাম গুলোর ভ্যালু 0/1 দ্বারা প্রকাশ করেছি।

পরবর্তী কাজের সুবিধার্থে আমরা অন্য একটি ডেটাফ্রেমে এই প্রসেসড ডেটাফ্রেমকে রেখেছি

#One Hot Encoding for nominal data
df1 = pd.get_dummies(df, columns=['OWN_OCCUPIED'])
df1

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

মিন-ম্যাক্স নরমালাইজার

স্কেলিং সম্পর্কে আমরা আগেই কিছুটা জেনেছি। মিন-ম্যাক্স নরমালাইজারারের মাধ্যমে এ ভ্যারিয়েবলের ম্যাক্সিমাম এবং মিনিমাম ভ্যালু ব্যবহার করে স্কেলিং করা হয় , এর ফলে সকল ডেটাই একটি নির্দিষ্ট রেঞ্জের ভেতর নরমালাইজড অবস্থায় চলে আসে। এই পদ্ধতিতে প্রতিটি ডেটাকে তার মিনিমাম ভ্যালুর সাথে (উক্ত ভ্যারিয়েবলের) বিয়োগ করা হয় , উক্ত বিয়োগফলকে রেঞ্জ দ্বারা ভাগ করা হয়। এভাবেই প্রতিটি ডেটা স্কেলাইজড হয়। নিচের সমীকরন ব্যবহার করে মিন-ম্যাক্স নরমালাইজার করা হয়।

রেঞ্জ- রেঞ্জ হচ্ছে কোন ভ্যারিয়েবলের ম্যাক্সিমাম এবং মিনিমাম ভ্যালুর পার্থক্য। এই বইয়ের পরিসংখ্যান অংশে এই বিষয়ে বিস্তারিত আলোচনা করা হয়েছে।

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(df)
scaled = pd.DataFrame(scaler.transform(df),columns=df.columns)
scaled

স্ট্যান্ডার্ড স্কেলার

স্ট্যান্ডার্ড স্কেলার ডেটাসেটকে স্ট্যান্ডার্ডাইজেশন করে। নিচের সমীকরণ অনুযায়ী স্ট্যান্ডার্ড স্কেলার কাজ করে এবং ডেটাসেটের ভ্যালু গুলো স্ট্যান্ডার্ড ফর্মে পরিবর্তিত হয়ে যায়। কোন ডেটা ও উক্ত ভ্যারিয়েবলের গড় মানের বিয়োগফলকে তাদের স্ট্যান্ডার্ড ডেভিয়েশন দ্বারা ভাগ করে স্ট্যান্ডার্ডাইজেশন করা হয়।

স্ট্যান্ডার্ড ডেভিয়েশন- ভ্যারিয়্যান্স এর মানকে রুট করলে স্ট্যান্ডার্ড ডেভিয়েশন পাওয়া যায়।এই বইয়ের পরিসংখ্যান অংশে এই বিষয়ে বিস্তারিত আলোচনা করা হয়েছে।

import pandas as pd    
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
df_scaledstd = pd.DataFrame(ss.fit_transform(df),columns = df.columns)
df_scaledstd

রোবাস্ট স্কেলার

রোবাস্ট স্কেলার অনেকটা মিন-ম্যাক্স স্কেলারের মতই, এখানে মিনিমাম এবং ম্যাক্সিমাম ভ্যালুর পরিবর্তে ইন্টার কোয়ার্টাইল রেঞ্জ ব্যবহার করা হয়। এই পদ্ধতিতে ডেটা থেকে ১ম কোয়ার্টাইল ভ্যালু বিয়োগ করা হয় এবং এই বিয়োগফলকে ইন্টার কোয়ার্টাইল রেঞ্জ দ্বারা ভাগ করা হয়।

কোয়ার্টাইল এবং আইকিউআর- কোন ভ্যারিয়েবলকে সমান ৪ টি ভাগে ভাগ করলে প্রতিটি ভাগে ২৫% পরিমান ডেটা থাকে । এই চারটি ভাগকে বলা হয় কোয়ার্টাইল । ৩য় ও ১ম কোয়ার্টাইল এর পার্থক্যকে বলা হয় আইকিউআর । এই বইয়ের পরিসংখ্যান অংশে এই বিষয়ে বিস্তারিত আলোচনা করা হয়েছে।

from sklearn.preprocessing import RobustScaler
robust = RobustScaler()
robust_scaled_df = robust.fit_transform(df)
robust_scaled_df = pd.DataFrame(robust_scaled_df, columns=df.columns)
robust_scaled_df

ট্রান্সপোস ফাংশন

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

transposed_df=df.transpose()
transposed_df

কখন কোন ধরনের পদ্ধতি উপযুক্ত ?

কখন কোন ধরনের ট্রান্সফরমেশন ব্যবহার করতে হবে সেটি বলা বেশ দুস্কর। সমস্যার ধরনের সাথে বিষয়টি নির্ভর করে।

  • ডিসট্যান্স বেজড অ্যালগরিদম যেমন এসভিএম , কেএনএন , ক্লাস্টারিং ইত্যাদি ক্ষেত্রে ডেটা স্কেলিং অত্যন্ত গুরুত্বপূর্ণ, অপরদিকে নন ডিসট্যান্স বেজড অ্যালগরিদম নেইভ বেইজ, বিভিন্ন ট্রি বেজড অ্যালগরিদমের ক্ষেত্রে স্কেলিং তেমন গুরুত্ব বহন করে না।

  • নরমালাইজেশন ডেটাকে ০ থেকে ১ এর ভেতরে স্কেলে নিয়ে আসে

  • অপরদিকে স্ট্যান্ডার্ডাইজেশন ডেটাকে মিন ০ এবং স্ট্যান্ডার্ড ডেভিয়েশন ১ এর ভেতরে নিয়ে আসে।

  • ডেটাসেটের ফিচারের ভ্যালুগুলোর রেঞ্জে বিস্তর পার্থক্য থাকলে নরমালাইজেশন ব্যবহার করা যেতে পারে।

  • ডেটায় আউটলায়ার থাকলে স্ট্যান্ডার্ডাইজেশন ভালো কাজ করে।

  • তবে অধিকাংশ ক্ষেত্রেই দেখা যায় স্ট্যান্ডার্ডাইজেশন সার্বিক ভাবে ভালো কাজ করে।

Last updated