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

       }

   }

}


 

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

79429. Процессы проектирования. Проектирование инфраструктуры 42.3 KB
  В последнее время чаще начинают использовать стороннюю инфраструктуру облачные сервисы etc. Это выгодно с точки зрения цены не покупаем оборудование а платим деньги только за аренду однако если вмешивается безопасность или очень критично производительность то приходится тратить деньги на свою инфраструктуру. Следует различать инфраструктуру ИС и инфраструктуру проекта по созданию ИС. в этом билете имеется в виду инфраструктура ИС про инфраструктуру проекта можно читать в билете 11.
79430. Процессы проектирования. Проектирование интерфейсов 46.72 KB
  Проектирование интерфейсов Интерфейс определяет совокупность средств и методов взаимодействия между элементами системы. С другой стороны набор правил или процедур для взаимодействия между компонентами программы между компонентами программы в целом а также между информационными системами и оборудованием программный интерфейс. Программный интерфейс формален полный и непротиворечивый формализован. Физическая реализация интерфейса USB COM port.
79431. Жизненный цикл информационной системы 46.7 KB
  Жизненный цикл информационной системы совокупность взаимосвязанных процессов создания и последующие состояния ИС от формирования исходных требований до утилизации. Процесс создания совокупность работ от формирования исходных требований до ввода в действие. Процесс создания состоит из: Анализ требований к ИС; Проектирование; Разработка; Тестирование; Другой способ деления стадий создания основан на последовательности операций операция по анализу входной информации об объекте проектирования; операция проектирования объектов данных на...
79432. Модели жизненного цикла информационной системы 46.2 KB
  ГОСТ 15 271 Каскадная модель Каскадная модель реализует принцип однократного выполнения каждого из вида деятельности определение требований проектирование разработка интеграция тестирование использование. ГОСТ 15 271 Информационная технология. Руководство по применению ГОСТ Р ИСО МЭК 12207 Процессы жизненного цикла программных средств. В стандарте основное внимание уделено особенностям подлежащим учету при прикладном применении ГОСТ Р ИСО МЭК 12207 в условиях реальных проектов создания программных средств.
79433. Методологии проектирования. Каноническое проектирование 41.03 KB
  Формирование требований к ИС формирование модели объекта автоматизации и формирование верхнеуровневых требований; Разработка концепта ИС детальное исследование бизнеспроекта выбор вариантов создания ИС формулирование требований заказчика; Создание Технического Задания оно же ТЗ описание функций связей etc.; Эскизный проект реализация проекта проработка на системном уровне концепции; Технический проект; стадия создания...
79434. Методологии проектирования. Типовое проектирование 37.76 KB
  Содержит следующие пункты: Формулирование требований к ИС осталось без изменений; Поиск платформы прототипа на чем будем реализовывать нужно постараться минимизировать изменения прототипа; Техническое задание описание ТЗ прототипа и наших изменений в нём или изменений в объекте автоматизации чаще и то и другое; Эскизный проект схлопывается с ТЗ ибо задается прототипом; Технический проект программируем наши изменения в прототипе; Рабочая документация упрощается ибо в прототипе есть своя документация фиксируем свои...
79435. Процессы жизненного цикла информационной системы 45.88 KB
  Процессы планирования; Процессы разработки; Интегральные процессы. Процессы планирования определяют и координируют действия процессов разработки и интегральных процессов. В ходе выполнения процессов разработки создаются программные средства для ИС. Виды процессов: Определений требований к ИС; Проектирование;...
79436. Процессы жизненного цикла информационной системы. Процессы планирования 48.33 KB
  Цели процесса планирования ПО: Определить конкретные виды работ процессов разработки и интегральных процессов жизненного цикла которые позволят реализовать системные требования и создать ПО требуемого уровня; Определить модели жизненного цикла ПО включающие в себя описание взаимосвязей между процессами последовательность их выполнения механизмы обратной связи и критерии перехода; Выбрать среду поддержки жизненного цикла включающую в себя методы и инструментальные средства которые нужно использовать для выполнения работ в каждом...
79437. Процессы жизненного цикла информационной системы. Процессы определений требований к ИС 48.08 KB
  Цели данного процесса состоят в том чтобы: Разработать требования верхнего уровня; Оценить производные требования верхнего уровня с точки зрения безопасности системы. Процесс определения требований к ПО должен обеспечить следующее: Анализ функциональных системных требований и требований к интерфейсам которые предназначены для программной реализации на отсутствие противоречий несоответствий и неопределенностей; Регистрацию для последующего уточнения или исправления и передачи в качестве входной информации...