71704

Решение задачи классификация и регрессии с помощью деревьев решений

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы: изучение алгоритмов построения деревьев решений; создание и исследование классификационных и регрессионных моделей с помощью деревьев решений Индивидуальное задание: seeds Data Set Attribute Information: To construct the data, seven geometric parameters of wheat...

Русский

2014-11-11

136.54 KB

2 чел.

8

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

ДВНЗ «ДОНЕЦЬКИЙ НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ»

Кафедра АСУ

Звіт

з лабораторної роботи № 1

з дисципліни «МЕТОДИ ІНТЕЛЕКТУАЛЬНОЇ ОБРОБКИ

ДАНИХ»

з теми: «Решение задачи классификация и регрессии с помощью

деревьев решений»

Варіант №14

                                             Виконала:

ст. гр. ІУС-10Б

Носенко О.О.

                                               Перевірили:

                                                                                                Васяєва Т. О.

   Смирницький Г. О.

Донецьк 2013

Лабораторная работа №1

Тема: решение задачи классификация и регрессии с помощью

деревьев решений.

Цель работы: изучение алгоритмов построения деревьев решений;

создание и исследование классификационных и регрессионных моделей с помощью деревьев решений

Индивидуальное задание:

seeds Data Set

Attribute Information:

To construct the data, seven geometric parameters of wheat kernels were measured:

1. area A,

2. perimeter P,

3. compactness C = 4*pi*A/P^2,

4. length of kernel,

5. width of kernel,

6. asymmetry coefficient

7. length of kernel groove.

All of these parameters were real-valued continuous.

CART

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

namespace laba1

{

   class CART

   {

       private static int regressioncount = 5;//максимальное число разбиений регрессионного параметра

       private static int maxdeep = 30;//максимальная глубина дерева

       private static SortedSet<IComparable> FounsClassValues(List<Element> elements)

       {

           SortedSet<IComparable> set = new SortedSet<IComparable>();

           foreach (Element e in elements)

           {

               set.Add(e[-1]);

           }

           return set;

       }

       private static double CountQ(List<Element> elements, Uslovie uslovie, SortedSet<IComparable> classvalues)

       {

           int classcount = classvalues.Count;

           int[] left=new int[classcount];

           int[] right = new int[classcount];

           int leftsum=0;

           int rightsum=0;

           int i;

           double Q=0;

           foreach (Element e in elements)

           {

               i = 0;

               while (!e[-1].Equals(classvalues.ElementAt(i))) i++;

               if (uslovie.CheckElement(e) == true) left[i]++;

               else right[i]++;

           }

           for (i = 0; i < classcount; i++)

           {

               Q += Math.Abs((left[i] - right[i]) / (double)(left[i] + right[i]));

               leftsum += left[i];

               rightsum += right[i];

           }

           Q = (leftsum * rightsum * 2 * Q) / (elements.Count * elements.Count);

           return Q;

       }

       private static void CreateNodes(MyNode node, List<Element> elements, BitArray attributetypes, int deep)

       {

           int attributecounts = elements[0].GetAttributeCount();

           int i, j,col;

           Uslovie bestuslovie=null;

           double bestQ=-1;

           double dx;

           double Q;

           Uslovie[] uslovies;

           List<Element> left = new List<Element>();

           List<Element> right = new List<Element>();

           SortedSet<IComparable> classvalues = FounsClassValues(elements);

           //если все элементы в множестве принадлежат одному классу дальнейшее разбиение не целесообразно

           if (classvalues.Count == 1)

           {

               node.SetClass(classvalues.ElementAt(0));

               return;

           }

           //если мы достигли максимальной глубины, то текущий узел обозначается листом.

           //Класс определяеся по максимальному числу элементов

           if (deep >= maxdeep)

           {

               ChooseClass(node, elements, classvalues);

               return;

           }

           for (i = 0; i < attributecounts; i++)

           {

               IComparable[] set = Uslovie.GetValuesInfo(elements, i);

               if (attributetypes[i] == true)//задача классификации

               {

                   uslovies=new Uslovie[set.Length];

                   for(j=0;j<set.Length;j++)

                   {

                       uslovies[j]=new Classification(i,set[j]);

                   }

               }

               else//задача регрессии

               {

                   col = Math.Min(regressioncount, set.Length);

                   uslovies=new Uslovie[col];

                   dx = set.Length / (double)col;

                   for (j = 0; j < col; j++)

                   {

                       uslovies[j]=new Regression(i,set[(int)(dx * j)]);

                   }

               }

               //если аттрибут не меняет свое значение в выборке - нет смысла производить по нему разбиение

               if (uslovies.Count() == 1) continue;

               foreach(Uslovie uslovie in uslovies)

               {

                   Q = CountQ(elements, uslovie,classvalues);

                   if (Q > bestQ)

                   {

                       bestQ = Q;

                       bestuslovie = uslovie;

                   }

               }

           }

           //если в выборке у всех элементов одинаковые значения аттрибутов, но разные значения классов

           if (bestuslovie == null)

           {

               ChooseClass(node, elements, classvalues);

               return;

           }

           foreach (Element e in elements)

           {

               if (bestuslovie.CheckElement(e) == true)

               {

                   left.Add(e);

               }

               else

               {

                   right.Add(e);

               }

           }

           MyNode leftnode = new MyNode(bestuslovie);

           node.Nodes.Add(leftnode);

           CreateNodes(leftnode, left, attributetypes,deep+1);

           MyNode rightnode = new MyNode(bestuslovie.CreateInverse());

           node.Nodes.Add(rightnode);

           CreateNodes(rightnode, right, attributetypes,deep + 1);

       }

       //установка для узла дерева значения класса с максимальным количество элементов в выборке

       private static void ChooseClass(MyNode node, List<Element> elements, SortedSet<IComparable> classvalues)

       {

           int i;

           int[] counts = new int[classvalues.Count];

           foreach (Element e in elements)

           {

               i = 0;

               while (!e[-1].Equals(classvalues.ElementAt(i))) i++;

               counts[i]++;

           }

           int imax = 0;

           for (i = 1; i < classvalues.Count; i++)

           {

               if (counts[i] > counts[imax]) imax = i;

           }

           node.SetClass(classvalues.ElementAt(imax));

       }

       public static MyNode RunAlgorithm(List<Element> elements, BitArray attributetypes)

       {

           MyNode node=new MyNode(null);

           CART.CreateNodes(node, elements,attributetypes,0);

           return node;

       }

   }

}

ELEMENT

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace laba1

{

   class Element

   {

       private IComparable[] attributes;//аттрибуты

       private IComparable classvaue;//имя класса

       //доступ по индексу к значению аттрибута

       //если индекс за границами - возвращает имя класса

       public IComparable this[int i]

       {

           get

           {

               if (attributes == null || classvaue == null) throw new Exception("Элемент не инициализирован!");

               if (i < 0 || i >= attributes.Length) return classvaue;

               else return attributes[i];

           }

       }

       //инициализирующий конструктор

       public Element(IComparable[] _attributes, IComparable _classvalue)

       {

           attributes = _attributes;

           classvaue = _classvalue;

       }

       public int GetAttributeCount()

       {

           if (attributes == null) throw new Exception("Элемент не инициализирован!");

           return attributes.Length;

       }

   }

}

Form1

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.Collections;

namespace laba1

{

   public partial class Form1 : Form

   {

       public Form1()

       {

           InitializeComponent();

       }

       private void button1_Click(object sender, EventArgs e)

       {

           StreamReader sr = new StreamReader(new FileStream("seeds_dataset.txt", FileMode.Open));

           string line;

           int i = 0;

           List<Element> train = new List<Element>();

           List<Element> test = new List<Element>();

           Random r = new Random();

           int count = 0;

           line=sr.ReadLine();

           while(line!=null && line.Length>0)

           {

               String[] parts = line.Split(new char[] { '\t' });

               count = parts.Count() - 1;

               IComparable[] objects = new IComparable[count];

               for (int j = 0; j < count; j++)

               {

                   objects[j] = parts[j];

               }

               test.Add(new Element(objects,parts[count]));

               line = sr.ReadLine();

           }

           for (i = 0; i < 120; i++)

           {

               int j = r.Next(test.Count);

               train.Add(test[j]);

               test.RemoveAt(j);

           }

           treeView1.Nodes.Clear();

           MyNode root = CART.RunAlgorithm(train, new BitArray(count,false));

           root.Text = "корневой узел";

           treeView1.Nodes.Add(root);

           sr.Close();

           int right = 0;

           int wrong = 0;

           foreach (Element el in train)

           {

               if (el[-1].Equals(root.GetClass(el))) right++;

               else wrong++;

           }

           textBox1.Text = String.Format("Точность классификации на обучаещем множестве

равна:{0}\r\n" +

           "Ошибка классификации на обучаещем множестве равна:{1}\r\n", right /

(double)train.Count, wrong / (double)train.Count);

           right = 0;

           wrong = 0;

           foreach (Element el in test)

           {

               if (el[-1].Equals(root.GetClass(el))) right++;

               else wrong++;

           }

           textBox1.Text += String.Format("Точность классификации на проверяющем множестве

равна:{0}\r\nОшибка классификации на проверяющем множестве равна:{1}\r\n", right /

(double)test.Count, wrong / (double)test.Count);

       }

   }

}

Uslovie

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace laba1

{

   //класс, проверяющий принадлежность элемента некоторому условию

   abstract class Uslovie

   {

       protected int i;//номер аттрибута

       protected bool direction;

       protected IComparable etalon;

       //проверка элемента

       public abstract bool CheckElement(Element e);

       //создание клона

       public abstract Uslovie Clone();

       //создание инверсного условия

       public Uslovie CreateInverse()

       {

           Uslovie copy = this.Clone();

           copy.direction = !copy.direction;

           return copy;

       }

       public Uslovie(int _i, IComparable _etalon)

       {

           i = _i;

           etalon = _etalon;

           direction = true;

       }

       //информация о возможных значениях определенного аттрибута выборки

       public static IComparable[] GetValuesInfo(List<Element> elements, int i)

       {

           SortedSet<IComparable> set = new SortedSet<IComparable>();

           foreach (Element e in elements)

           {

               set.Add(e[i]);

           }

           return set.ToArray();

       }

   }

   //класс для задач классификации

   class Classification : Uslovie

   {

       public Classification(int _i, IComparable _etalon)

           : base(_i,_etalon){}

       public override bool CheckElement(Element e)

       {

           return (e[i].CompareTo(etalon) == 0) == direction;

       }

       public override Uslovie Clone()

       {

           return new Classification(i, etalon);

       }

       

       public override string ToString()

       {

           return String.Format("x[{0}]{1}{2}",i,direction?"=":"<>",etalon);

       }

   }

   //класс для задач регрессии

   class Regression: Uslovie

   {

       public Regression(int _i, IComparable _etalon)

           : base(_i,_etalon){}

       public override bool CheckElement(Element e)

       {

           return (e[i].CompareTo(etalon) <1) == direction;

       }

       public override Uslovie Clone()

       {

           return new Regression(i, etalon);

       }

       public override string ToString()

       {

           return String.Format("x[{0}]{1}{2}", i, direction ? "<=" : ">", etalon);

       }

   }

}


 

А также другие работы, которые могут Вас заинтересовать

33952. Относительные показатели 12.11 KB
  Относительные величины используемые в статистической практике: относительная величина структуры; относительная величина координации; относительная величина планового задания; относительная величина выполнения плана; относительная величина динамики; относительная величина сравнения; относительная величина интенсивности.
33953. Определение и формы выражения относительных показателей 11.17 KB
  Определение и формы выражения относительных показателей Относительные показатели представляют собой результат деления одного абсолютного показателя на другой и выражают соотношение между количественными характеристиками соц. Поэтому по отношению к абсолютным показателям относительные показатели являются производными вторичными. составляют относительные величины интенсивности.
33954. ДИВЕРТИКУЛ МЕККЕЛЯ 22 KB
  его стенка содержит все слои кишки. Клиническая картина В 95 случаев протекает бессимптомно Клиническая картина возникает при присоединении осложнений У детей возникает пептическое изъязвление близлежащей слизистой оболочки подвздошной кишки что нередко является причиной массивного кишечного кровотечения У взрослых Острый дивертикулит. Если в ходе операции обнаружен интактный червеобразный отросток необходима ревизия подвздошной кишки примерно на протяжении 100 см от илеоцекального угла Непроходимость кишечника вследствие...
33956. Механическая кишечная непроходимость. Классификация. Этиология. Патогенез. Клиника. Дифдиагноз и лечение. Причины смерти при механической непроходимости 46.5 KB
  Причины смерти при механической непроходимости. К сочетанной механической непроходимости кишечника относят инвагинацию внедрение одной кишки в другую. При этом подчеркивается только этиологический момент возникновения непроходимости наличие спаек в брюшной полости которые могут быть результатом хирургических вмешательств или воспалительных заболеваний органов брюшной полости. При острой обтурационной непроходимости в кишках выше места препятствия начинают скапливаться...
33957. АБСЦЕСС ПОДДИАФРАГМАЛЬНЫЙ 23.5 KB
  При расположении абсцесса близко к передней брюшной стенке болевой синдром более выражен Тошнота икота Вынужденное положение больного на спине на боку или полусидя Температурная кривая носит гектический характер Озноб потливость При длительном течении пастозность кожи выбухание межрёберных промежутков в зоне локализации абсцесса обычно IXXI справа Тахикардия Одышка При пальпации ригидность мышц верхних отделов брюшной стенки и болезненность по ходу межрёберных промежутков Симптомы раздражения брюшины как правило...
33958. Организация труда исследователя 58.5 KB
  Правильная организация труда исследователя является одним из важнейших условий эффективности НИР и успешно завершения предпринятого исследования. Научное творчество - это своеобразный и очень сложный вид человеческой деятельности. Немало специальных исследований и книг посвящены вопросам организации труда исследователя.