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

       }

   }

}


 

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

60589. Диагностика зависания и неисправностей компьютера 2.75 MB
  Если контакты погнуты аккуратно разогните их; проверьте правильно ли установлена видеоплата и снова включите дисплей а затем ПК; если дисплей работает нормально в течение процедуры самотестирования POST а при загрузке операционной системы Windows...
60590. Дидактические игры и упражнения на уроке математике для обучающихся с нарушениями интеллекта 78.5 KB
  Включенные в урок дидактические игры удовлетворяют требованиям обучения и воспитания сближают новую познавательную деятельность обучающегося с уже привычной для него игровой облегчая переход от игры к серьезной умственной работе.
60591. ВИКОРИСТАННЯ СОЦІАЛЬНИХ МЕРЕЖ У НАВЧАЛЬНО-ВИХОВНОМУ ПРОЦЕСІ В ЗАГАЛЬНО-ОСВІТНІХ НАВЧАЛЬНИХ ЗАЙЛАДАХ 1.68 MB
  Соціальні мережі дають можливість безпосередньо підводити вихованців до тих чи інших дій. Корисного аналізу того чи іншого питання у неформальні обстановці. Соціальні мережі в певній мірі дають можливість оцінити особисте життя вихованців. Часто розміщені фото, окремі альбоми дозволяють встановити напрямки розвитку уподобань і схильностей учнів.
60592. Особенности развития речи у детей раннего возраста 316 KB
  Овладение речью как средством общения возможно лишь на основе достаточно развитого фонематического слуха, который осуществляет определенный анализ, отделяя высоту звуков от их фонематических особенностей, и тонкое дифференцирование самих фонематических различий.
60593. Игровые моменты и опорные конспекты на уроках истории 1.8 MB
  О первостепенном значении игры для естественного развития ребёнка свидетельствует тот факт что ООН провозгласила игру универсальным и неотъемлемым правом ребёнка. Включаясь в процесс игры дети научаются жить в нашем символическом...
60594. Побудова діаграм і графіків в електронних таблицях MS Excel 1.39 MB
  Пізнавальна мета уроку: закріпити навички роботи з ЕТ Excel; поглибити знання учнів по темі Діаграми; навчити учнів будувати різноманітні типи діаграм графіків у електронній таблиці...
60597. Освітньо-кваліфікаційна характеристика випускника професійно-технічного навчального закладу 284 KB
  Повинен уміти: виконувати операції з базами даних на комп’ютерному устаткуванні введення опрацювання накопичення систематизація та виведення інформації відповідно до затверджених процедур та інструкцій з використанням периферійного обладнання систем передавання приймання даних; готувати до роботи устаткування: магнітні диски стрічки картки папір; працювати в текстовому редакторі з введенням тексту та його редагуванням; оперувати з файлами записувати текст на дискету або переносити на папір за допомогою друкувальних пристроїв;...