использование дерева решений sql server 2008 для составления прогнозов на C#

#c# #sql-server-2008 #ssas #decision-tree

#c# #sql-server-2008 #ssas #дерево решений

Вопрос:

Я создаю приложение на C #. Я объясню, чего я хочу, приведя простой пример:

рассмотрим эту таблицу:

 name   age     reply   choice 
------ ------- ------- -------
John   10-20   yes     apple
Kate   20-30   yes     orange
Sam    10-20   yes     apple
Peter  10-20   no      ----
Tom    20-30   no      ----
Mike   10-20   yes     orange
  

Я хотел бы составить дерево решений с прогнозируемым «возрастом» для всех ответивших пользователей. а затем спрогнозируйте выбор тех, кто не ответил.

Таблица сохраняется в базе данных SQL Server 2008. И в SQL Server 2008 есть функция, которая позволяет это делать. Я искал на веб-сайте справки Microsoft, но не нашел никакого четкого руководства о том, как его использовать.

Как я могу использовать это в своем коде на C #, у кого-нибудь есть пошаговое руководство по этому поводу?

Комментарии:

1. Не могли бы вы рассказать, может быть, какая функция 2008 есть именно для этого, потому что мне это ничего не говорит .. также, каков ожидаемый результат для этого примера? Яблоко для Питера и апельсин для Тома? Вы могли бы сделать это с помощью относительно простого запроса. Нужно немного больше, чтобы иметь возможность помочь здесь.

2. Здравствуйте, спасибо за ваш ответ. Да, результатом будет apple для Питера (потому что большинство «10-20» хотели яблоко и апельсин для Тома). Функция, о которой я говорил, описана по этой ссылке msdn.microsoft.com/en-us/library/ms175312.aspx . Также, если это можно сделать с помощью запроса, можете ли вы помочь мне с этим? Мне все равно, что я использую, мне просто нужны результаты. Большое вам спасибо

Ответ №1:

Это помогло бы:

 -- create table
    declare @t table (name varchar(50), age varchar(50), reply varchar(3), answer varchar(50))
    insert @t (name, age, reply, answer)
    values ('John', '10-20', 'yes', 'apple'),
    ('Kate', '20-30', 'yes', 'orange'),
    ('Sam', '10-20', 'yes', 'apple'),
    ('Peter', '10-20', 'no', '----'),
    ('Tom', '20-30', 'no', '----'),
    ('Mike', '10-20', 'yes', 'orange')

-- get answer
    select  t.name, t.age, t.reply, case t.reply when 'yes' then t.answer else w.answer end answer
    from    @t t
            left join (
                select age, answer
                from (
                    select  age, answer, count(*) cnt, row_number() over (partition by age order by count(*) desc) rnk
                    from    @t
                    where   reply = 'yes' 
                    group by age, answer
                ) s
                where rnk = 1
            ) w on t.age = w.age 
  

Просто выясните, какой ответ был предоставлен чаще всего для каждого возраста, а затем выберите этот ответ, если его не было дано.

Когда есть связь между двумя ответами, он просто выбирает один. Я думаю, что тот, который приходит первым, но нет никаких гарантий, что он всегда будет это делать.

Имейте в виду, что если у вас есть группа, в которой ответы A: B = 55%: 45%, то все люди, у которых нет ответа, получают ответ A, поэтому вы изменили бы средние значения населения, сделав это. Просто чтобы вы знали.