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



Скачать 51.99 Kb.
Дата11.08.2016
Размер51.99 Kb.
Пример решения задачи классификации с помощью логистической регрессии.

Пусть у нас имеется файл с данными о клиентах банка – возраст, доход, (входные параметры), выдан ли кредит (выходной параметр). Эти данные были накоплены в течение некоторого периода работы банка. Мы хотим построить модель, предсказывающую, следует ли выдавать кредит новым клиентам, по известным данным о возрасте и доходе.



Читаем файл

> db=read.table("D:\\KEK\\DataMining\\R\\данные\\credit.csv",header=TRUE,sep=";")

Объявим переменные (при этом данные копируются из data.frame db в переменные age, income и solution).

> attach(db)


Выведем данные на экран:
age income solution

1 18 10000 n

2 40 20000 y

3 65 15000 n

4 78 25000 n

5 20 20000 n

6 35 30000 y

7 50 25000 y

8 66 12000 n

9 80 50000 n

10 33 40000 y

11 38 20000 y

12 80 10000 n

13 78 20000 y

14 55 20000 y

15 17 9000 n

16 25 12000 y

17 28 19000 y

18 20 25000 n

19 19 30000 n

20 27 25000 y

21 36 40000 y

22 44 33000 y

23 77 20000 n

24 62 50000 y
Построим логистическую модель: возраст и доход – входные данных, решение о выдаче кредита – прогнозируемые данные.
> mylogit=glm(solution~age+income, data=db, family="binomial")
Выполним предсказание, т.е., вычислим вектор с вероятностями выдачи кредита:

> S=predict(mylogit,type="response")


1 2 3 4

0.4573062 0.5088126 0.3215245 0.4083895

5 6 7 8

0.6016556 0.6793540 0.5392523 0.2784804

9 10 11 12

0.7585674 0.8037325 0.5182333 0.2074696

13 14 15 16

0.3359795 0.4384188 0.4465887 0.4553870

17 18 19 20

0.5496843 0.6732682 0.7412539 0.6435978

21 22 23 24

0.7946557 0.6829765 0.3401991 0.8152128
Распечатаем эти данные в единой таблице:

> data.frame(db,S)

age income solution S

1 18 10000 n 0.4573062

2 40 20000 y 0.5088126

3 65 15000 n 0.3215245

4 78 25000 n 0.4083895

5 20 20000 n 0.6016556

6 35 30000 y 0.6793540

7 50 25000 y 0.5392523

8 66 12000 n 0.2784804

9 80 50000 n 0.7585674

10 33 40000 y 0.8037325

11 38 20000 y 0.5182333

12 80 10000 n 0.2074696

13 78 20000 y 0.3359795

14 55 20000 y 0.4384188

15 17 9000 n 0.4465887

16 25 12000 y 0.4553870

17 28 19000 y 0.5496843

18 20 25000 n 0.6732682

19 19 30000 n 0.7412539

20 27 25000 y 0.6435978

21 36 40000 y 0.7946557

22 44 33000 y 0.6829765

23 77 20000 n 0.3401991

24 62 50000 y 0.8152128
Зададим порог отсечения и оценим качество модели – подсчитаем количество ошибок первого и второго рода

> threshold = 0.5


> roc.confusion=function(s){

Ps=(S>s)*1

print(table(Observed=solution,Predicted=Ps))}
> roc.confusion(threshold)
Predicted

Observed 0 1

n 7 4

y 3 10

Пока слишком много ошибок. Предсказание плохое.

Посмотрим на данные. У нас всего 3 столбца, так что можем нарисовать картинку:

> plot(db$age,db$income,

bg=c("red","green")[db$solution],

pch=c(21,22)[db$solution])
По осям откладываются возраст и доход, а цвет и тип точек указывает положительное или отрицательное решение о выдаче кредита:

Мы можем заметить, что кредиты не выдавались слишком молодым и слишком старым

клиентам, т.е., здесь можно рассматривать не абсолютное значение возраста, а отклонение возраста от среднего.

Преобразуем столбец Возраст:


> m=mean(db[,1])
> m

[1] 45.45833


> db[,1]=abs(db[,1]-m)

> db


age income solution

1 27.458333 10000 n

2 5.458333 20000 y

3 19.541667 15000 n

4 32.541667 25000 n

5 25.458333 20000 n

6 10.458333 30000 y

7 4.541667 25000 y

8 20.541667 12000 n

9 34.541667 50000 n

10 12.458333 40000 y

11 7.458333 20000 y

12 34.541667 10000 n

13 32.541667 20000 y

14 9.541667 20000 y

15 28.458333 9000 n

16 20.458333 12000 y

17 17.458333 19000 y

18 25.458333 25000 n

19 26.458333 30000 n

20 18.458333 25000 y

21 9.458333 40000 y

22 1.458333 33000 y

23 31.541667 20000 n

24 16.541667 50000 y
Снова выведем картинку:
> plot(db$age,db$income,

bg=c("red","green")[db$solution],

pch=c(21,22)[db$solution])







Снова построим модель и выполним предсказание:
Predicted

Observed 0 1

n 10 1

y 2 11
Результаты гораздо лучше.
Построим ROC-кривую
>roc.curve=function(s){

Ps=(S>s)*1

FP=sum((Ps==1)*(solution=='n'))/sum(solution == 'n')

TP=sum((Ps==1)*(solution=='y'))/sum(solution == 'y')

vect=c(FP,TP)

names(vect)=c("FPR","TPR")

return(vect)

}
> roc.curve(threshold)
FPR TPR

0.09090909 0.84615385
> ROC.curve=Vectorize(roc.curve)
> M.ROC=ROC.curve(seq(0,1,by=.01))
> sum(0.01*M.ROC[2,]) ######## area under curve

[1] 0.8323077

> plot(M.ROC[1,],M.ROC[2,],col="grey",lwd=2,type="l", sub=sum(0.01*M.ROC[2,]))


___________________________________________________________________________________



С точки зрения здравого смысла, разумно задать два порога отсечения – например 0.3 и 0.7. Для клиентов, имеющих значение прогноза менее 0.3, принимается отрицательное решение о выдаче кредита, для клиентов, имеющих прогноз более 0.7 – положительное. Клиенты со значениями прогноза от 0.3 до 0.7 требуют более тщательной обработки или принятия решения специалистом.

age income solution S

1 27.458333 10000 n 0.09936155

2 5.458333 20000 y 0.98732242

3 19.541667 15000 n 0.55677485

4 32.541667 25000 n 0.05568551

5 25.458333 20000 n 0.24213263

6 10.458333 30000 y 0.97053983

7 4.541667 25000 y 0.99233897

8 20.541667 12000 n 0.44995923

9 34.541667 50000 n 0.10947510

10 12.458333 40000 y 0.96949522

11 7.458333 20000 y 0.97823706

12 34.541667 10000 n 0.01550595

13 32.541667 20000 y 0.04362215

14 9.541667 20000 y 0.96205829

15 28.458333 9000 n 0.07374628

16 20.458333 12000 y 0.45563334

17 17.458333 19000 y 0.73225255

18 25.458333 25000 n 0.29231357

19 26.458333 30000 n 0.28861206

20 18.458333 25000 y 0.73875170

21 9.458333 40000 y 0.98639098

22 1.458333 33000 y 0.99781119

23 31.541667 20000 n 0.05663752

24 16.541667 50000 y 0.94534205
Каталог: EOS -> DataMining
EOS -> Практическая работа 1 Вопросы для обсуждения Основы теории переходной экономики
EOS -> Менеджмент в системе бизнеса Тема Система эффективного управления в бизнесе Цель и задачи темы
EOS -> Тема Сезонные и параметрические модели временных рядов
EOS -> Практическая работа по теме Модульное программирование 1 Задание Создание и инициализация массивов 1
DataMining -> Respiratory diseases of schoolchildren Заболевания дыхательных путей у школьников


Поделитесь с Вашими друзьями:


База данных защищена авторским правом ©uverenniy.ru 2019
обратиться к администрации

    Главная страница