ক্লাসিফিকেশন এন্ড রিগ্রেশন ট্রি

ক্লাসিফিকেশন এন্ড রিগ্রেশন ট্রি বা CART অ্যালগরিদমের মাধ্যমে ক্লাসিফিকেশন এবং রিগ্রেশন উভয় ধরনের প্রবলেমই সল্ভ করা যায়। সংক্ষেপে অনেকে এটিকে ডিসিশন ট্রি'ও বলে থাকেন। ডিসিশন ট্রি দেখতে অনেকটা গাছের শাখা-প্রশাখার মত, এজন্যই এর নামের সাথে ' ট্রি ' শব্দটি যুক্ত আছে। গাছের যেমন শুরু হয় শেকড় থেকে তেমনি ডিসিশন ট্রিও শুরু হয় ' রুট নোড ' থেকে। রুট নোড থেকে বিভিন্ন ডিসিশন কন্ডিশনের মাধ্যমে এই ট্রি'র শাখা প্রশাখা ছড়াতে থাকে , এধরনের নোডকে বলা হয় ডিসিশন নোড, এই নোড শেষমেশ গিয়ে চুড়ান্ত সিদ্ধান্ত প্রদান করে এদেরকে বলা হয় লিফ নোড
ছবি - ডিসিশন ট্রি ( সূত্র- ইন্টারনেট )
ডিসিশন ট্রি'র বিভিন্ন প্যারামিটার
  • স্প্লিটিং- রুট নোড থেকে শুরু করে বিভিন্ন ভ্যারিয়েবলের উপর ভিত্তি করে ডেটাসেটকে ক্রমাগত বিভক্ত করে ডিসিশনের দিকে এগিয়ে যাওয়াকে স্প্লিটিং বলা হয়।
  • এনট্রপি - এনট্রপি হচ্ছে বিশৃঙ্খলতার পরিমান। ট্রি'কে স্প্লিট করা হলে প্রতিটি নোডে একই ধরনের / ক্লাসের ডেটার পরিমান হচ্ছে পিউরিটি। একটি পিওর নোডে সকল ডেটা একই ক্লাসের হয়ে থাকে। পিওরিটি যত কম হবে এনট্রপি তত বাড়বে, অর্থাৎ একই নোডে বিভিন্ন ক্লাসের ডেটার পরিমান বাড়বে। আবার এনট্রপি যত কম হবে পিওরিটি বেশী হবে।
  • ইনফরমেশন গেইন- পিওরিটির পরিমাপক হচ্ছে ইনফরমেশন গেইন। ইনফরমেশন গেইন যত বেশী হবে ট্রি ততো বেশী পিওর নোড তৈরি করতে পারবে।
  • গিনি ইনডেক্স- গিনি হচ্ছে কোন নোডের সকল সদস্য যে একই ক্লাসের হবে তার প্রবাবিলিটির মান। এই মান ০ থেকে ১ এর ভেতরে হয়ে থাকে।গিনির মান ০ মানে ঐ নোডের সকল সদস্য একই ক্লাসের , আর গিনির মান ১ মানে ঐ নোডের সদস্যরা র‍্যান্ডমলি ডিস্ট্রিবিউটেড বা বিভিন্ন ক্লাসের অর্থাৎ এনট্রপি অনেক বেশী। গিনির মান যদি ০.৫ হয় তবে বুঝতে হবে দুই ক্লাসের সদস্যরা সমান ভাবে আছে (যদি ক্লাসের সংখ্যা ২ টি হয়)
কোন ডেটাসেট থেকে ডিসিশন ট্রি তৈরি করার সময় বিভিন্ন ভাবে স্প্লিট করে দেখা হয় কোন পদ্ধতিতে স্প্লিটিং করলে পারফরম্যান্স সবথেকে ভালো আসে। নিচের ছবিতে আমরা দেখতে পাচ্ছি সেক্স ভ্যারিয়েবলের উপর ভিত্তি করে স্প্লিট করলে ইনফরমেশন গেইন কোলেস্টোরেল এর তুলনায় স্প্লিটিং তুলনায় বেশী আসে। সুতরাং ১ম লেভেলের ক্ষেত্রে আমরা সেক্সকেই স্প্লিটিং এর জন্য বেছে নেব এবং এভাবে আমাদের ট্রি আগাতে থাকবে যতক্ষন না পর্যন্ত লিফ নোড না পাওয়া যায়।
ছবি - ডিসিশন ট্রি স্প্লিটিং (সূত্র- ইন্টারনেট)
ডিসিশন ট্রি’র কিছু বৈশিষ্ট্য
  • ডিসিশন ট্রি’কে খুব সহজেই ব্যাখ্যা করা যায়
  • ডিসিশন ট্রি’র জন্য ডেটাসেটকে স্কেলাইজড করার প্রয়োজন হয় না। •
  • অনেক ক্ষেত্রে কন্টিনিউয়াস ভ্যালু প্রিডিকশনের ক্ষেত্রে ডিসিশন ট্রি খুব বেশী কার্যকরী নয়।
  • ডিসিশন ট্রি মডেল ট্রেইনিং এর ক্ষেত্রে তুলনামূলক বেশী সময় নেয়।
রোগীর জন্য ঔষধ বাছাই
ক্লাসিফিকেশন এন্ড রিগ্রেশন ট্রি'র ব্যবহার দেখার জন্য আমরা ডিসিশন ট্রি'র মাধ্যমে একটি ক্লাসিফিকেশন প্রবলেমের সমাধান করবো। ধরুন আপনার কাছে একটি ডেটাসেট আছে যেখানে বিভিন্ন রোগীর বয়স, লিঙ্গ , রক্তচাপ, কোলেস্টোরেল এবং রক্তে সোডিয়াম-পটাশিয়ামের পরিমানের উপর ভিত্তি করে চিকিৎসক রোগীদের কি ঔষধ দেয় তার ডেটা রয়েছে। আপনার এখন এমন একটি মডেল বানাতে হবে যেটি নতুন রোগীর ক্ষেত্রে তার জন্য কোন ঔষধটি ভালো হবে সেটি অনুমান করতে পারবে।
প্রথমেই আমরা প্রয়োজনীয় লাইব্রেরী ইমপোর্ট এবং ডেটাসেট লোড করে নিচ্ছি,
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix,accuracy_score
url='https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-drugs.csv'
df = pd.read_csv(url)
df.head()
আমাদের ডেটাসেটটি দেখতে অনেকটা এরকম,
এবার ডেটাসেটের ফিচার এট্রিবিউটসে যে ক্যাটেগরিক্যাল ভ্যারিয়েবল গুলো (Sex, BP, Cholesterol) ব্যবহার করবো তাদের ম্যাপ ফাংশন ব্যবহার করে ডামি ভ্যালু বসিয়ে দেব,
d = {'HIGH': 2, 'LOW': 0, 'NORMAL': 1}
df['BP'] = df['BP'].map(d)
d = {'M': 1, 'F': 0}
df['Sex'] = df['Sex'].map(d)
d = {'HIGH': 1, 'NORMAL': 0}
df['Cholesterol'] = df['Cholesterol'].map(d)
ফিচার এবং টার্গেট ভ্যারিয়েবল সেট করে নেই,
features = ['Age', 'Sex', 'BP', 'Cholesterol','Na_to_K']
x = df[features]
y = df['Drug']
ট্রেইনিং ডেটাসেট দিয়ে মডেলকে ট্রেইন করি,
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=3)
drugTree = DecisionTreeClassifier()
drugTree.fit(x_train,y_train)
এবার চলুন ডিসিশন ট্রি ভিজুয়ালাইজ করি !
import graphviz
dot_data = tree.export_graphviz(drugTree, out_file=None, feature_names=x.columns,class_names=df.Drug,filled=True, rounded=True, special_characters=True)
valgTre = graphviz.Source(dot_data)
valgTre
এবার কনফিউশন ম্যাট্রিক্স এর মাধ্যমে আমাদের মডেলের অ্যাকুরেসি চেক করার পালা ,
y_pred = drugTree.predict(x_test)
print(classification_report(y_test, y_pred))
print('\nAccuracy: {0:.4f}'.format(accuracy_score(y_test, y_pred)))
predictions = drugTree.predict(x_test)
print('Confusion Matrix:\n',confusion_matrix(y_test, predictions))
মনে করুন যদু মিয়া নামের নতুন একজন রোগী যার বয়স ৩০ বছর , লিঙ্গ পুরুষ (১), রক্তচাপ স্বাভাবিক (১), কোলেস্টোরেল স্বাভাবিক ( ০) এবং সোডিয়াম-পটাশিয়াম এর পরিমান ১০ ইউনিট। এই রোগীর জন্য কোন ঔষধ প্রযোজ্য হবে ?
new_observation = [[30,1,1,0,10]]
drugTree.predict(new_observation)
array(['drugX'], dtype=object) মডেলের প্রেডিকশন অনুযায়ী তাকে drugX প্রেসক্রাইব করতে হবে।
ডিসিশন ট্রি'র মাধ্যমে রিগ্রেশন প্রবলেম সমাধান করার জন্য আমরা from sklearn.tree import DecisionTreeRegressor jইমপোর্ট করবো এবং DecisionTreeRegressor() এর মাধ্যমে মডেল তৈরি করবো। এই পদ্ধতিতে অ্যাকুরেসি নির্ণয়ের জন্য আমরা লিনিয়ার রিগ্রেশনে যে পদ্ধতি অবলম্বন করেছিলাম সেই একই পদ্ধতি অনুসরন করবো।