Главная страница
Навигация по странице:

  • Использование пакета ‘ e 1071’ Функция naiveBayes

  • Аргументы: x

  • Обучающее множество

  • Пример 2. Обучающее множество: Данные о спаме

  • Пример 3. Обучающее множество

  • Титаник ( Titanic dataset )

  • Классы: survival Выжил (0 = No; 1 = Yes)Признаки

  • Наивный Байесовский классификатор Использование пакета e1071 Функция naiveBayes


    Скачать 28.44 Kb.
    НазваниеНаивный Байесовский классификатор Использование пакета e1071 Функция naiveBayes
    Дата23.12.2022
    Размер28.44 Kb.
    Формат файлаdocx
    Имя файлаNaiveBayesian.docx
    ТипДокументы
    #860461


    Наивный Байесовский классификатор

    Использование пакета ‘e1071’

    Функция naiveBayes вычисляет условные апостериорные вероятности категориальных переменных при условии независимости признаков с использованием правила Байеса.

    Использование:
    naiveBayes(formula, data, laplace = 0, subset, na.action = na.pass)

    naiveBayes(x, y, laplace = 0, ...)

    predict(object, newdata, type = c("class", "raw"), ...)
    Аргументы:

    x – числовая матрица или фрейм данных

    y – вектор значений меток классов

    formula – формула вида class

    x1 + x2 + ....

    data – фрейм данных

    laplace – положительный параметр сглаживания Лапласа (0 по умолчанию).

    subset – индексный вектор, индексирующий обучающую выборку

    na.action – функция, указывающая, что делать, если пропущенные данные имеют место

    object – объект класса "naiveBayes"

    newdataфрейм данных новых объектов для тестирования

    type – если "raw", то возвращаются условные апостериорные вероятности для каждого класса, иначе класс с максимальной вероятностью.
    Выходные значения:

    naiveBayes возвращает объект-список, включающий элементы:

    apriori – распределение классов

    tables – список таблиц по одной для каждой переменной, которые содержат условные вероятности переменных при условии класса.
    Пример 1.

    Обучающее множество: TicTacToe (крестики-нолики)

    "x" начинает первым. Цель: "победа x"

    Признаки (категориальные – 3 значения):

    1. top-left-square: {x,o,b} 
    2. top-middle-square: {x,o,b} 
    3. top-right-square: {x,o,b} 
    4. middle-left-square: {x,o,b} 
    5. middle-middle-square: {x,o,b} 
    6. middle-right-square: {x,o,b} 
    7. bottom-left-square: {x,o,b} 
    8. bottom-middle-square: {x,o,b} 
    9. bottom-right-square: {x,o,b} 

    3 класса: {positive,negative}
    #install.packages("e1071")

    library(e1071)

    ### Naive Bayesian (данные категориальные) #########################

    # 1 #############################################################

    # импортируем данные в R

    # установить параметр stringsAsFactors = TRUE,

    # так как все данные - категориальные

    A_raw <- read.table("Tic_tac_toe.txt", sep = ",", stringsAsFactors = TRUE)

    # число строк в базе

    n <- dim(A_raw)[1]

    # Создан фрейм, который можно просмотреть, используя str(A_raw).

    # Имеется 9 столбцов признаков V1-V9 и V10 (класс) и

    # все имеют один и тот же тип Factor.

    # 2 #############################################################

    # Создание обучающей и тестирующей выборки

    # Скажем, имеем n примеров в исходной выборке,

    # используем 80% для обучения и оставшиеся - для тестирования.

    # Устанавливаем базу генерации случайных чисел и рандомизируем выборку

    set.seed(12345)

    A_rand <- A_raw[ order(runif(n)), ]

    # разделим данные на обучающие и тестирующие

    nt <- as.integer(n*0.8)

    A_train <- A_rand[1:nt, ]

    A_test <- A_rand[(nt+1):n, ]

    # Можно убедиться, какой имеется процент каждого

    # класса V2 в обучающей и тестирующей выборке

    prop.table(table(A_train$V10))

    prop.table(table(A_test$V10))

    # 3 ############################################################

    # Используем Наивный Байесовский классификатор из пакета e1071

    # A_classifier <- naiveBayes(A_train[,-10], A_train$V10)

    # Другой вариант классификатора

    A_classifier <- naiveBayes(V10 ., data = A_train)

    # 4 ############################################################

    # Теперь оценим полученную модель:

    A_predicted <- predict(A_classifier, A_test)

    # Используем table для сравнения прогнозируемых значений с тем, что есть

    table(A_predicted, A_test$V10)
    Пример 2.

    Обучающее множество: Данные о спаме e-mail сообщений

    Данные собраны Hewlett-Packard Labs, которая классифицировала 4601 e-mail сообщений как спам или не спам. 57 признаков, содержащих частоты определенных слов, соответствующих названию признака и букв в сообщениях. Данные содержат 2788 e-mail сообщений, классифицируемых как "не спам" (0) and 1813 сообщений, классифицируемых как "спам" (1). Часть признаков – частоты определенных слов, соответствующих названию признака. Часть признаков связана с числом заглавных букв в письме.
    library(kernlab)

    library(e1071)

    data(spam)

    ## Посмотрим, какие признаки используются и их значения

    spam[0:1,]

    ## Случайным образом выбираем 20 сообщений для тестирования,

    ## точнее индексы 20-ти тестов

    idx <- sample(1:dim(spam)[1], 20)

    spamtrain <- spam[-idx, ]

    spamtest <- spam[idx, ]

    ## Обучаем классификатор

    model <- naiveBayes(type ., data = spamtrain)

    predict(model, spamtest)

    table(predict(model, spamtest), spamtest$type)

    predict(model, spamtest, type = "raw")
    Пример 3.

    Обучающее множество: Iris

    Признаки:

    1. длина чашелистика (sepal) в см

    2. ширина чашелистика (sepal) в см

    3. длина лепестка в см

    4. ширина лепестка в см

    Классы:

    -- Iris Setosa

    -- Iris Versicolour

    -- Iris Virginica

    #install.packages("e1071")

    library(e1071)

    data(iris) # load iris dataset

    pairs(iris[1:4], main="Iris Data (red=setosa,green=versicolor,blue=virginica)",

    pch=21, bg=c("red","green3","blue")[unclass(iris$Species)])

    head(iris,n=12)

    summary(iris)

    classifier<-naiveBayes(iris[,1:4], iris[,5])

    predicted.classes <- predict(classifier, iris[,-5])

    head(predicted.classes,n=12)

    table(predicted.classes, iris[,5], dnn=list('predicted','actual'))

    classifier$apriori / sum(classifier$apriori) # the prior distribution for the classes

    classifier$tables$Petal.Length

    plot(0:3, xlim=c(0.5,7), col="red", ylab="density",type="n", xlab="Petal Length",main="Petal length distribution for each species")

    curve(dnorm(x, classifier$tables$Petal.Length[1,1], classifier$tables$Petal.Length[1,2]), add=TRUE, col="red")

    curve(dnorm(x, classifier$tables$Petal.Length[2,1], classifier$tables$Petal.Length[2,2]), add=TRUE, col="blue")

    curve(dnorm(x, classifier$tables$Petal.Length[3,1], classifier$tables$Petal.Length[3,2]), add=TRUE, col ="green")

    legend("topright", c("setosa", "versicolor", "virginica"), col = c("red","blue","green"), lwd=1)

    observation <- data.frame(Sepal.Length = 5.0,

    Sepal.Width = 3.2,

    Petal.Length = 1.5,

    Petal.Width = 0.3) # this observation lies within Setosa cluster
    # type="raw" shows the probabilities

    predict(classifier, observation, type="raw")

    Задание
    1. Исследуйте, как объем обучающей выборки и количество тестовых данных, влияет на точность классификации или на вероятность ошибочной классификации в примере крестики-нолики и примере о спаме e-mail сообщений.

    2. Сгенерируйте 100 точек с двумя признаками X1 и X2 в соответствии с нормальным распределением так, что первые 50 точек (class -1) имеют параметры: мат. ожидание X1 равно 10, мат. ожидание X2 равно 14, среднеквадратические отклонения для обеих переменных равны 4. Вторые 50 точек (class +1) имеют параметры: мат. ожидание X1 равно 20, мат. ожидание X2 равно 18, среднеквадратические отклонения для обеих переменных равны 3. Построить соответствующие диаграммы, иллюстрирующие данные. Построить байесовский классификатор и оценить качество классификации.

    3. Разработать байесовский классификатор для данных Титаник (Titanic dataset) - https://www.kaggle.com/c/titanic

    Исходные обучающие данные для классификации – в файле Titanic_train.csv

    Данные для тестирования – в файле Titanic_test.csv

    Использовать функцию read.csv для чтения данных из csv-файлов.

    Классы:

    survival Выжил (0 = No; 1 = Yes)

    Признаки:

    pclass Класс каюты (1 = 1st; 2 = 2nd; 3 = 3rd)

    name Имя

    sex Пол

    age Возраст

    sibsp Число братьев-сестер/муж-жена на борту

    parch Число родителей/детей на борту

    ticket Номер билета

    fare Стоимость билета

    cabin Каюта

    embarked Порт посадки (C = Cherbourg; Q = Queenstown; S = Southampton)

    Специальные отметки:

    Pclass: 1st Верхний; 2nd Средний; 3rd Нижний

    Age – в годах; дробный, если возраст меньше одного года


    написать администратору сайта