Machine Learning – 26 – Decisiontrees&Randomforest

Regression மற்றும் Classification இரண்டிற்கும் உதவக்கூடிய நேர்கோடு முறையில் பிரிக்க இயலாத non-linear தரவுகளுக்கான model-ஆக decision trees மற்றும் random forest விளங்குகிறது. Decision trees என்பது பொதுவாக மாதிரித் தரவுகளில் உள்ள மதிப்புகளைக் கொண்டு அவற்றை சிறுசிறு பகுதிகளாகப் பிரித்துக் கற்கிறது. கீழ்க்கண்ட எடுத்துக்காட்டில் ஒரு மலர் மல்லியா, ரோஜாவா, தாமரையா என்று தீர்மானிக்க DecisionTreeClassifier() மற்றும் RandomForestClassifier() பயன்படுத்தப்பட்டுள்ளன. ஒவ்வொரு மலரின் இதழ்களுடைய(sepal) நீள அகலமும், அவற்றின் மேற்புற இதழ்களுடைய(petal) நீள அகலமுமான 4 அம்சங்களே ஒரு மலர் எந்த மலராக இருக்கும் என்பதைத் தீர்மானிக்கிறது. இந்த அம்சங்களிலுள்ள தரவுகளை பல்வேறு பகுதிகளாகப் பிரித்துக் கற்கும் வேலையை DecisionTreeClassifier() செய்கிறது. அவ்வாறு தரவுகளைப் பிரிப்பது என்பது ஒருசில conditions-ஐப் பொறுத்து நடக்கிறது. எனவேதான் இவை Eager learners என்று அழைக்கப்படுகின்றன. இதற்கு மாற்றாக KNN என்பது lazy learners ஆகும். Ensemble learning எனும் முறையில் random forest கற்கிறது. Ensemble என்றால் குழுமம் என்று பொருள். அதாவது பல்வேறு decision trees-ஐ உருவாக்கி, அவற்றை குழுமமாக வைத்துக் கற்கிறது. குழுமத்தில் உள்ள ஒவ்வொரு tree-ம் வெவ்வேறு பயிற்சித் தரவுகளை எடுத்துக் கொண்டு பயிற்சி பெற்றுக் கொள்கிறது. எனவே இதனுடைய accuracy இன்னும் அதிகமாக இருக்கும். கீழ்க்கண்ட எடுத்துக்காட்டில் இவைகளுக்கான நிரலைக் காணலாம். Decision Trees 89% accuracy -ஐயும், Random forest 97% accuracy -ஐயும் வெளிப்படுத்துவதைக் காணலாம். மேலும் ஒவ்வொன்றும் எவ்வாறு தரவுகளைப் பிரித்துக் கற்கிறது என்பது வரைபடமாகவும் காட்டப்பட்டுள்ளது.


from sklearn.datasets import load_iris
import pandas as pd
import os
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.metrics import confusion_matrix,accuracy_score,classification_report
from io import StringIO
import pydotplus
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from IPython.display import Image
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('./flowers.csv')
X = df[list(df.columns)[:-1]]
y = df['Flower']
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)
a = DecisionTreeClassifier(criterion = "entropy", random_state = 100,max_depth=3, min_samples_leaf=5) # gini
a.fit(X_train, y_train)
y_pred = a.predict(X_test)
print("Confusion Matrix: ", confusion_matrix(y_test, y_pred))
print ("Accuracy : ", accuracy_score(y_test,y_pred)*100)
print("Report : ", classification_report(y_test, y_pred))
dot_data = StringIO()
export_graphviz(a, out_file=dot_data,filled=True, rounded=True,special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png())
graph.write_png("decisiontree.png")
b = RandomForestClassifier(max_depth = None, n_estimators=100)
b.fit(X_train,y_train)
y_pred = b.predict(X_test)
print("Confusion Matrix: ", confusion_matrix(y_test, y_pred))
print ("Accuracy : ", accuracy_score(y_test,y_pred)*100)
print("Report : ", classification_report(y_test, y_pred))
export_graphviz(b.estimators_[5], out_file='tree.dot', feature_names = X_train.columns.tolist(),
class_names = ['Lotus', 'Jasmin', 'Rose'],
rounded = True, proportion = False, precision = 2, filled = True)
os.system ("dot -Tpng tree.dot -o randomforest.png -Gdpi=600")
Image(filename = 'randomforest.png')
f = pd.Series(b.feature_importances_,index=X_train.columns.tolist()).sort_values(ascending=False)
sns.barplot(x=f, y=f.index)
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.legend()
plt.show()

நிரலுக்கான விளக்கம்:

flowers.csv எனும் கோப்பில் மொத்தம் 150 தரவுகள் பயிற்சிக்கு உள்ளன. அவை train_test_split() எனும் முறைப்படி 112 தரவுகள் பயிற்சிக்கும், மீதி 38 தரவுகள் பயிற்சி செய்யப்பட்ட model-ஐ சோதிப்பதற்கும் பயன்படுத்தப்பட்டுள்ளன. கீழ்க்கண்ட decision tree-ன் முதல் node-க்குள் உள்ள samples=112 என்பது மொத்தம் பயிற்சிக்கு அளிக்கப்பட்டுள்ள தரவுகளைக் குறிக்கிறது. value = [34,41,37] என்பது 34 தரவுகள் மல்லிகைக்கும் 41 தரவுகள் தாமரைக்கும், 37 தரவுகள் ரோஜாவுக்கும் அமைந்துள்ளன எனும் விவரத்தைக் கொடுக்கிறது. entropy = 1.581 மாதிரிகளில் உள்ள uncertainty / disorder / impurity-ஐக் குறிக்கிறது. அதாவது நாம் வகைப்படுத்த வேண்டிய பல்வேறு பிரிவுகளில் உள்ள தரவுகளும் எந்த அளவு விகிதத்தில் கலந்துள்ளன என்பதைக் கூறும். இதற்கான கணக்கீடு பின்வரும் முறையில் நிகழும். முதலில் மொத்த தரவுகளில் ஒவ்வொரு பிரிவைச் சேர்ந்த தரவுகளும் எவ்வளவு எண்ணிக்கையில் உள்ளன எனும் பின்னம் கணக்கிடப்படும். பின்னர் அம்மதிப்புக்கு log base 2 கண்டுபிடிக்க வேண்டும். இதற்கான கருவி www.miniwebtool.com/log-base-2-calculator/ எனும் வலைத்தளத்தில் உள்ளது. இவ்வாறே மல்லி, ரோஜா, தாமரை என்னும் ஒவ்வொரு பிரிவுக்கும் தனித்தனியாகக் கண்டுபிடிக்க வேண்டும். கடைசியாக இவைகளின் கூட்டுத்தொகையை – எனும் எதிர்மறை குறியால் பெருக்கினால் கிடைப்பதே entropy ஆகும்.

Entropy = – {Summation of (fraction of each class.log base 2 of that fraction)}
= -{ (34/112).log2(34/112) + (41/112).log2(41/112) + (37/112).log2(37/112) }
= -{ (0.3035).log2(0.3035) + (0.3661).log2(0.3661) + (0.3303).log2(0.3303) }
= -{ (0.3035).(-1.7202) + (0.3661).(-1.4496) + (0.3303).(-1.5981) }
= -{ -0.5220 + -0.5307 + -0.5278 }
= -{ -1.5805}
= 1.581

கணக்கிடப்பட்ட entropy மதிப்பையே வரைப்படத்தின் முதல் node-ல் காணலாம். இம்மதிப்பு 0-க்கு அதிகமாக இருப்பதால், 112 தரவுகளும் ஒரு condition மூலம் 37, 75 எனும் எண்ணிக்கையில் அமையும் இரு பிரிவுகளாகப் பிரிக்கப்படுகின்றன. அதாவது X2 எனப்படும் Petal_length அம்சத்தின் மதிப்புகளில் 2.35 -க்கு கீழ் இருந்தால் அத்தகைய தரவுகள் இடப்புற node-லும், அதிகமாக உள்ளவை வலப்புற node-லும் பிரிக்கப்படுகின்றன. பின்னர் மீண்டும் பிரிக்கப்பட்ட இரு பிரிவுகளுக்கும் entropy கணக்கிடப்படுகிறது. இடப்புறம் உள்ள node-ல் entropy 0.0 என வந்துள்ளது. இதுவே decision node எனப்படும். அதாவது 0-ஆக இருக்கும் பட்சத்தில் அதில் உள்ள தரவுகள் அனைத்தும் ஏதோ ஒரு வகையின் கீழ் பிரிக்கப்பட்டுவிட்டது என்று அர்த்தம். அதன் value மதிப்பும் [0,0,37] என்று உள்ளது. அதாவது மல்லிகைக்கும், தாமரைக்குமான தரவுகளின் எண்ணிக்கை 0. ரோஜாவுக்கான எண்ணிக்கை 37. இதுவே ஒரு பூவை ரோஜா என முடிவு செய்வதற்கான decision node ஆகும். இதே முறையில் வரைப்படத்திலுள்ள மற்ற nodes உருவாக்கப்படுகின்றன. மற்ற features-ம் சோதிக்கப்படுகின்றன. வரைப்படத்தின் கடைசி கிளையில் ஒரு பூவை மல்லி அல்லது தாமரை என முடிவு செய்வதற்கான decision nodes அமைந்துள்ளன. அதாவது கடைசி கிளையில் இடமிருந்து வலமாக உள்ள 3 nodes-ல், அதன் value மதிப்புகளை கவனிக்கவும். மல்லி என முடிவு செய்வதற்கான இடத்தில் 34 என மொத்தமாக இல்லாமல், 30, 3, 1 என தனித்தனியாகப் பிரித்து இத்தகைய decision nodes-ஐ உருவாக்கியுள்ளது. அவ்வாறே வலமிருந்து இடமாக உள்ள 3 nodes-ல், தாமரை என முடிவு செய்வதற்கான இடத்தில் 41 என மொத்தமாக இல்லாமல், 30, 8, 3 எனத் தனித்தனியாகப் பிரித்து உருவாக்கியுள்ளது. எனவேதான் இவைகளின் entropy 0 மற்றும் அதற்கு நெருங்கிய மதிப்பாக உள்ளது.

Information Gain:
ஒரு குறிப்பிட்ட பிரிவில் தரவுகளை வகைப்படுத்துவதற்குத் தேவையான விவரங்களை எந்த அளவுக்கு ஒரு feature அளிக்கிறது என்பதே Information Gain எனப்படும். இதுவும் entropy-ஐப் போன்றே தரவுகளை சரியாக வகைப்படுத்த உதவும் ஒரு metric ஆகும். entropy என்பது impurity ஆகும். இதை வைத்து, அந்த impurity-ஐக் குறைப்பதற்கு உதவும் metric தான் gini gain எனப்படும். இதற்கான வாய்ப்பாடு பின்வருமாறு.

Information Gain = Parent’s entropy – child’s entropy with weighted average

child’s entropy with weighted average = [(no. of examples in left child node) / (total no. of examples in parent node) * (entropy of left node)] +
[(no. of examples in right child node)/ (total no. of examples in parent node) * (entropy of right node)]

= (37/112)*0.0 + (75/112)*0.994
= 0 + 0.665625
= 0.665

மேற்கண்ட நிரலில் DecisionTreeClassifier()-க்குள் criterion = “entropy” என்பதற்கு பதிலாக “gini”எனக் கொடுத்து பயிற்சி அளித்தால், அது gini-ஐக் கணக்கிட்டு பின்வருமாறு கிளைகளை உருவாக்கிக் கற்கிறது.

Random Forest முறையில் கற்கும் model-ன் வரைபடம் பின்வருமாறு.

Random forest-ல் மாதிரித் தரவுகளில் உள்ள ஒவ்வொரு feature-ம் வகைப்படுத்தலுக்கு எந்த அளவுக்கு பங்களித்துள்ளது என்பதை பின்வரும் வரைப்படத்தில் காணலாம்.

%d bloggers like this: