Обнаружение выбросов в опросе с помощью Pythons Scikit-Learn lib - PullRequest
0 голосов
/ 26 октября 2019

Я сделал фиктивный набор данных опроса '. Опрос состоит из 5 вопросов, и каждый вопрос имеет 5 разных ответов (1,2,3,4,5). Моя цель - определить, дал ли кто-нибудь случайный ответ в опросе (ответ не задумываясь). Я пытался определить эти выбросы с помощью некоторых алгоритмов в «scikit-learn», но мне не нравятся мои результаты, они очень случайные. Это мой набор данных:

https://www.sendspace.com/file/8gjqf6

Набор данных имеет 5 столбцов для вопросов, 1 столбец, который представляет время в секундах, которое кто-то потратил на ответы на все 5 вопросов, и столбец result. Столбец «Результат» сделан вручную / мной (вы увидите, что я поставил BOT рядом с ответами, которые даны менее чем за 7 секунд, и которые все одинаковы).

Есть 58 строк, каждая строка представляет одного человека, который провел опрос и дал ответ на 5 вопросов. Моя цель - найти человека / строку, которые не воспринимают опрос всерьез. Это означает, что он / она даже не прочитал вопрос, а просто поставил случайные ответы (или ответил на каждый вопрос 1,1,1,1,1 или на любое другое число, или сделал 1,2,3,4, 5 ...).

Функция def calc(col): предназначена для проверки точности.

Что я могу сделать, чтобы улучшить этот код?

import pandas as pd

from sklearn.ensemble import IsolationForest
from sklearn.covariance import EllipticEnvelope
from sklearn.svm import OneClassSVM
from sklearn.neighbors import LocalOutlierFactor

# I put the 'result' my hand

df = pd.read_csv('pitanja.csv')
#print(df)


x = df.iloc[:,:-1]

out_cls = [['SVM rbf', OneClassSVM(kernel='rbf', gamma='scale')],
           ['SVM lin', OneClassSVM(kernel='linear', gamma='scale')],
           ['SVM sigm', OneClassSVM(kernel='sigmoid', gamma='scale')],
            ['SVM poly2', OneClassSVM(kernel='poly', gamma='scale',degree=2)],
            ['SVM poly3', OneClassSVM(kernel='poly', gamma='scale', degree=3)],
            ['Isol For', IsolationForest(contamination = 'auto', behaviour = 'new')],
            ['Ell Env', EllipticEnvelope(store_precision=True, assume_centered=False)]]

r = df
for out in out_cls:

    cls = out[1]
    model = cls.fit(x)
    prediction = model.predict(x)

    result = []
    for i in prediction:
        if i == -1:
            result.append('BOT')

        else:
            result.append('good')

    r[out[0]] = result

result = r[['result','SVM rbf','SVM lin','SVM sigm','SVM poly2','SVM poly3','Isol For','Ell Env']]
print(result)

# to determinate % of matching (accuracy)
def calc(col):

    lenght = len(result)

    num = 0
    for i,j in zip(result['result'], result[col]):

        if i == j:
            num+=1

    res = 'Matching wiht ' + col + ': ' +str(round((num/lenght)*100,2)) + '%'

    return res

print(calc('SVM rbf'))
print(calc('SVM lin'))
print(calc('SVM sigm'))
print(calc('SVM poly2'))
print(calc('SVM poly3'))
print(calc('Isol For'))
print(calc('Ell Env'))
...