خانه / مقالات / داده کاوی و هوش مصنوعی / classification دیتاست گل ذنبق با استفاده از درخت تصمیم در R

classification دیتاست گل ذنبق با استفاده از درخت تصمیم در R

classification دیتاست گل ذنبق با استفاده از درخت تصمیم در R

در مقاله های پیشین به بررسی دسته بندی دیتا با استفاده از درخت تصمیم در نرم افزارهای وکا، رپیدماینر و متلب پرداختیم در این مقاله قصد داریم این الگوریتم را در نرم افزار R بررسی کنیم. پیش از شروع توضیح مختصری درباره درخت تصمیم آورده ایم.
یکی دیگر از الگوریتم های دسته بندی درخت تصمیم است. درخت تصمیم مجموعه ای از قوانین ساده است مانند : “اگر طول کاسبرگ کمتر از ۵٫۴۵ باشد، گونه ها را به عنوان setosa دسته بندی کن.” درخت های تصمیم غیر پارامتری هستند زیرا نیاز به هیچ تخمینی از توزیع متغیرهای هر کلاس ندارند.
درخت تصمیم از یک درخت برای ساخت یک مدل پیش بینی (تخمین) استفاده می کند که مشاهدات درباره یک آیتم را به نتیجه گیری هایی درباره مقدار هدف آن آیتم مپ می کند یا نگاشت می دهد. درخت تصمیم گیری یکی از رویکردهای پیش بینانه است که در آمار و دیتا ماینینگ و یادگیری ماشین استفاده می شود. به مدل های درخت که در آنها متغیرهای هدف می توانند مجموعه متناهی از مقادیر داشته باشند درخت های طبقه بندی یا classification trees می گویند.
در این ساختار درختها، برگها نشان دهنده لیبل های کلاس و شاخه ها نشان دهنده ارتباط ویژگی هایی هستند که به این کلاس لیبل ها منتج می شود.
درخت به این صورت ساخته می شود که در ابتدا یکسری data training وجود دارد که طبقه بندی می شوند مثلا به این صورت که ۳ کلاس وجود دارد که ابتدا همه این ۳ کلاس را به عنوان یک کلاس در نظر می گیریم پس از دسته بندی داده های این کلاس ها در آخر یک test data اضافه می کنیم و با توجه به تصمیماتی که در نودها گرفته می شود بررسی می کنیم که این داده تست به کدام کلاس تعلق دارد و در کدام برگ قرار میگیرد:
در هر نود درخت یک سوال وجود دارد. و هر داده تستی که وارد شود آن نود سوال را می پرسد و با توجه به سوال تصمییم میگیرد داده به سمت چپ درخت برود یا به راست و به این ترتیب وارد یک نود دیگر می شود و در آنجا باز هم سوالی پرسیده می شود که برای محل قرار دادن داده تصمیم گیرنده است.
پس از داده های آموزشی برای ساخت درخت استفاده می کنیم و بعد از این که درخت ساخته شد با توجه به سوالاتی که در نود ها پرسیده می شود تصمیم می گیرد که داده تست کجا برود و در نهایت در هر برگی که قرار گرفت با توجه به کلاس نسبت داده شده به آن برگ داده دسته بندی می شود.

نحوه ساخت درخت تصمیم در R
ابتدا پکیج tree را دانلود و نصب می کنیم
library(“party”)
str(iris)

names(iris) = c(“sepal.length”, “sepal.width”, “petal.length”, “petal.width”,
“iris.type”)
attach(iris)

library(tree)

stree = tree(iris.type ~ ., data = iris)
stree
## node), split, n, deviance, yval, (yprob)
## * denotes terminal node
##
## ۱) root 150 300 Iris-setosa ( 0.33 0.33 0.33 )
## ۲) petal.length < 2.45 50 0 Iris-setosa ( 1.00 0.00 0.00 ) *
## ۳) petal.length > 2.45 100 100 Iris-versicolor ( 0.00 0.50 0.50 )
## ۶) petal.width < 1.75 54 30 Iris-versicolor ( 0.00 0.91 0.09 )
## ۱۲) petal.length < 4.95 48 10 Iris-versicolor ( 0.00 0.98 0.02 )
## ۲۴) sepal.length < 5.15 5 5 Iris-versicolor ( 0.00 0.80 0.20 ) *
## ۲۵) sepal.length > 5.15 43 0 Iris-versicolor ( 0.00 1.00 0.00 ) *
## ۱۳) petal.length > 4.95 6 8 Iris-virginica ( 0.00 0.33 0.67 ) *
## ۷) petal.width > 1.75 46 10 Iris-virginica ( 0.00 0.02 0.98 )
## ۱۴) petal.length < 4.95 6 5 Iris-virginica ( 0.00 0.17 0.83 ) *
## ۱۵) petal.length > 4.95 40 0 Iris-virginica ( 0.00 0.00 1.00 ) *

می توان درخت را ترسیم کرد. دومین دستور متن مناسب برای تصویر ایجاد می کند.
plot(stree)
text(stree)
تابع tree بصورت پیش فرض از آنتروپی و انحراف استفاده می کند:
stree = tree(iris.type ~ ., data = iris, split = “gini”)
stree

plot(stree)
text(stree)

می توان تنها با استفاده از دو متغیر یک درخت تصمیم را فیت کرد. با استفاده از این قابلیت می توان نواحی را به راحتی در مناطق دو بعدی ترسیم کرد.

stree = tree(iris.type ~ petal.width + petal.length, data = iris)
stree

## node), split, n, deviance, yval, (yprob)
## * denotes terminal node
##
## ۱) root 150 300 Iris-setosa ( 0.33 0.33 0.33 )
## ۲) petal.width < 0.8 50 0 Iris-setosa ( 1.00 0.00 0.00 ) *
## ۳) petal.width > 0.8 100 100 Iris-versicolor ( 0.00 0.50 0.50 )
## ۶) petal.width < 1.75 54 30 Iris-versicolor ( 0.00 0.91 0.09 )
## ۱۲) petal.length < 4.95 48 10 Iris-versicolor ( 0.00 0.98 0.02 ) *
## ۱۳) petal.length > 4.95 6 8 Iris-virginica ( 0.00 0.33 0.67 ) *
## ۷) petal.width > 1.75 46 10 Iris-virginica ( 0.00 0.02 0.98 )
## ۱۴) petal.length < 4.95 6 5 Iris-virginica ( 0.00 0.17 0.83 ) *
## ۱۵) petal.length > 4.95 40 0 Iris-virginica ( 0.00 0.00 1.00 ) *

plot(stree)
text(stree)

آموزش و خطای تست
در آخر مجموعه تستی به اندازه ۵۰ و مجموعه آموزشی به اندازه ۱۰۰ می سازیم. درخت را با داده های آموزشی ست می کنیم سپس نتایج روی داده های تست را ارزیابی می کنیم.
test_sample = sample(1:150, 50)
test_data = iris[test_sample, ] training_data = iris[-test_sample, ] fit_tree = tree(iris.type ~ ., data = training_data)
test_predictions = predict(fit_tree, test_data, type = “class”)
test_error = sum(test_predictions != test_data$iris.type)/nrow(test_data)
test_error
نتیجه:

training_error = sum(predict(fit_tree, type = “class”) != training_data$iris.type)/nrow(training_data)
نتیجه:

معمولا خطای تست کمی بیشتر از خطای آموزش است.
می توان به گونه دیگر و با کدی متفاوت درخت تصمیم را پیاده سازی کرد. در اجرای قطعه کد زیر نیاز به دانلود پکیج ggplot2 می باشد.
data(iris)
names(iris)
[۱] “Sepal.Length” “Sepal.Width” “Petal.Length” “Petal.Width” “Species”
table(iris$Species)

setosa versicolor virginica
۵۰ ۵۰ ۵۰
#install if necessary
install.packages(“ggplot2”)
library(ggplot2)
qplot(Petal.Width, Sepal.Width, data=iris, colour=Species, size=I(4))

گونه های مختلف مشخصه های طول و عرض گلبرگ و کاسبرگ مختلف دارند. ایده اصلی دسته بندی این است که ابتدا همه متغیر ها را در یک گروه در نظر بگیرد؛ سپس مشخصه ای را پیدا می کند که به بهترین نحو ممکن گروه ها را جدا می کند برای مثال اولین سوالی که می پرسد می تواند این باشد که عرض گلبرگ ها کمتر یا بیشتر از ۰٫۸ باشد. سپس این فرایند ادامه پیدا می کند تا پارتیشن ها به قدر کافی متجانس شوند یا خیلی کوچک شوند.
ساخت درخت تصمیم:
install.packages(“tree”)
library(tree)
tree1 <- tree(Species ~ Sepal.Width + Petal.Width, data = iris)
summary(tree1)
Classification tree:
tree(formula = Species ~ Sepal.Width + Petal.Width, data = iris)
Number of terminal nodes: 5
Residual mean deviance: 0.204 = 29.57 / 145
Misclassification error rate: 0.03333 = 5 / 150
plot(tree1)
text(tree1)

یک classification tree در ورودی هر نود یک مشخصه و در خروجی آن یک گونه را نشان می دهد.
plot(iris$Petal.Width,iris$Sepal.Width,pch=19,col=as.numeric(iris$Species))
partition.tree(tree1,label=”Species”,add=TRUE)
legend(1.75,4.5,legend=unique(iris$Species),col=unique(as.numeric(iris$Species)),pch=19)

پارتیشن ها توسط classification tree تعیین می شوند. مثلا اولین پارتیشن نودها نشان دهنده گونه هایی با عرض گلبرگ کمتر از ۰٫۸ است که setosa نام دارد. پارتیشن بعدی همه گونه ها با عرض کاسبرگی بیشتر از ۱٫۷۵ هستند که virginica می باشند و الی آخر.
graph <- qplot(Petal.Width, Sepal.Width, data=iris, colour=Species, size=I(4))
graph + geom_hline(aes(yintercept=2.65)) + geom_vline(aes(xintercept=0.8)) + geom_vline(aes(xintercept=1.75)) + geom_vline(aes(xintercept=1.35))

استفاده از متغیرهای بیشتر:
در بالا از دو متغیر عرض گلبرگ و کاسبرگ برای نمایش فرایند classification استفاده شد. در اینجا همه ۴ متغیر را اضافه می کنیم:

tree1 <- tree(Species ~ Sepal.Width + Sepal.Length + Petal.Length + Petal.Width, data = iris)
summary(tree1)

Classification tree:
tree(formula = Species ~ Sepal.Width + Sepal.Length + Petal.Length +
Petal.Width, data = iris)
Variables actually used in tree construction:
[۱] “Petal.Length” “Petal.Width” “Sepal.Length”
Number of terminal nodes: 6
Residual mean deviance: 0.1253 = 18.05 / 144
Misclassification error rate: 0.02667 = 4 / 150

با این کار misclassification error rate بسیار پایین تری (۰٫۰۲۶۶۷) داریم و درخت به شکل زیر است:

plot(tree1)
text(tree1)

 

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نخواهد شدعلامتدارها لازمند *

*

x

شاید بپسندید

DNA، یک فضای ذخیره سازی همیشگی برای بشر

یافته های جدید علمی در دنیای فناوری— در دوران فضا های ذخیره ...