71704

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

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

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

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

Русский

2014-11-11

136.54 KB

3 чел.

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);

       }

   }

}


 

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

77849. Смоляне – защитники Отечества 132 KB
  В этом реферате будет говориться только о смолянах. Моя цель работы - рассказать вам все про смолян. Как они защищали нашу Родину, как они боролись, как они достойно погибали... И про то, как мы их не забудем никогда!
77850. Развитие политической мысли на Руси и в России 145.5 KB
  Особенность политической мысли России заключается в разработке следующих проблем: создании и развитии русской государственности выяснения специфики исторического пути России и составляющих ее народов поиск идеала общественного устройства...
77851. Сущность и функции рынка 124.5 KB
  Рынок как экономический механизм формировался на протяжении тысячелетий в течение которых менялось и содержание самого понятия. В общем виде понятие рынок это система экономических отношений складывающихся в процессе производства обращения и распределения товаров а также движения денежных средств.
77852. Основания и условия возникновения деликтных обязательств 27.5 KB
  Основания и условия возникновения деликтных обязательств Деликтные представляют собой обязательства которые возникают вследствие причинения вреда субъектами отношений из внедоговорных отношений и требуют полное возмещение за счет средств причинителя вреда или иных лиц на которых законом возложена обязанность возмещения вреда. отношения; возникают в нарушении прав которые носят абсолютный характер...
77853. Ответственность за вред, причиненный ИПО 27 KB
  Ответственность за вред причиненный ИПО К таковым относятся ТС механизмы электрическая энергия высокого напряжения атомная энергия взрывчатые вещества сильнодействующие яды. ИПО определенные предметы материального мира проявляющие в процессе деятельности по их использованию эксплуатации вредоносность не поддающуюся или не в полной мере поддающуюся контролю человека в результате чего они создают опасность для окружающих. Ответственность за вред несет владелец. Не признается владельцем и не несет ответственности за вред...
77854. Ответственность за вред, причиненный н/л 29 KB
  Ответственность за вред причиненный н л Причиненный до 14 возлагается на его родителей усыновителей или опекунов либо на соответствующее учреждение юридическое лицо если малолетний находился в нем или был под его надзором во время причинения вреда. Родители усыновители и опекуны отвечают за вред причиненный малолетними при наличии общих оснований деликтной ответственности: противоправность причинно-следственная связь вина. Причиненный от 14 до 18 самостоятельно несут ответственность за причиненный вред на общих основаниях. В...
77855. Особенности возмещения вреда при повреждении здоровья и причинения смерти гражданину 29 KB
  Однако результатом причиненного здоровью потерпевшего вреда может стать и стойкая или невосстановимая утрата им трудоспособности. Учитывается также грубая неосторожность самого потерпевшего содействовавшая возникновению или увеличению вреда. При этом размер возмещения уменьшается пропорционально степени вины потерпевшего. В случае смерти потерпевшего имущественные потери возникают у близких ему лиц которых он полностью или частично содержал при жизни будучи их кормильцем а также у лиц понесших расходы на его погребение.
77856. Компенсация морального вреда 23.5 KB
  Компенсация морального вреда Моральный вред физические или нравственные страдания испытываемые гражданином при нарушении его личных неимущественных или иных нематериальных благ. В случае причинения морального вреда по решению суда он подлежит денежной компенсации которая определяется с учетом...
77857. Неосновательное обогащение 30.5 KB
  Фактический состав порождающий обязательства из неосновательного обогащения или сбережения имущества состоит из следующих элементов: а одно лицо приобретает или сберегает имущество за счет другого; Приобретение означает увеличение объема имущества у одного лица и одновременное уменьшение его объема у другого. Это могут быть действия самого потерпевшего уплата чужого долга; действия 3 лиц ошибочная выдача груза железной дорогой не получателю указанному в накладной а другому лицу; действия самого приобретателя имущества...