Как установить значение для определенного порога в модели SVC и создать матрицу путаницы? - PullRequest
0 голосов
/ 24 октября 2019

Мне нужно установить значение для определенного порога и сгенерировать матрицу путаницы. Данные находятся в CSV-файле (11,1 МБ), эта ссылка для загрузки: https://drive.google.com/file/d/1cQFp7HteaaL37CefsbMNuHqPzkINCVzs/view?usp=sharing?

Сначала я получил сообщение об ошибке: «« AttributeError: Forex_proba недоступен, когда вероятность = ложь »«Поэтому я использовал это для исправления:

svc = SVC(C=1e9,gamma= 1e-07)
scv_calibrated = CalibratedClassifierCV(svc)
svc_model = scv_calibrated.fit(X_train, y_train) 

Я много видел в Интернете, и я не совсем понял, как происходит пероланализация определенного порогового значения. Звучит довольно сложно. Теперь я вижу неправильный вывод:

array([[   0,    0],
       [5359,   65]])

Я понятия не имею, что не так.

Мне нужна помощь, и я новичок в этом. спасибо

from sklearn.model_selection import train_test_split

df = pd.read_csv('fraud_data.csv')

X = df.iloc[:,:-1]
y = df.iloc[:,-1]

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)



def answer_four():
    from sklearn.metrics import confusion_matrix
    from sklearn.svm import SVC
    from sklearn.calibration import CalibratedClassifierCV
    from sklearn.model_selection import train_test_split


    svc = SVC(C=1e9,gamma= 1e-07)
    scv_calibrated = CalibratedClassifierCV(svc)
    svc_model = scv_calibrated.fit(X_train, y_train)

    # set threshold as -220
    y_pred = (svc_model.predict_proba(X_test)[:,1] >= -220) 

    conf_matrix = confusion_matrix(y_pred, svc_model.predict(X_test))

    return conf_matrix
answer_four()

Эта функция должна возвращать запутанную матрицу, массив 2x2 с 4 целыми числами.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Этот код производит ожидаемый результат, в дополнение к тому факту, что в предыдущем коде я неправильно использовал матрицу путаницы, я должен был также использовать решение_функции и получать выходные данные, фильтрующие порог 220.

def answer_four():
    from sklearn.metrics import confusion_matrix
    from sklearn.svm import SVC
    from sklearn.calibration import CalibratedClassifierCV
    from sklearn.model_selection import train_test_split

    #SVC without mencions of kernel, the default is rbf
    svc = SVC(C=1e9, gamma=1e-07).fit(X_train, y_train)

    #decision_function scores: Predict confidence scores for samples
    y_score = svc.decision_function(X_test)

    #Set a threshold -220
    y_score = np.where(y_score > -220, 1, 0)
    conf_matrix = confusion_matrix(y_test, y_score)

####threshold###
#input threshold in the model after trained this model
#threshold is a limiar of separation of class   

return conf_matrix

answer_four()
#output: 
array([[5320,   24],
       [  14,   66]])
1 голос
/ 25 октября 2019

Вы неправильно используете матрицу путаницы.

Идея матрицы путаницы состоит в том, чтобы получить представление о том, насколько хорошо наши прогнозы y_pred сравниваются с основополагающей правдой y_true,обычно в наборе test .

То, что вы на самом деле здесь делаете, это вычисление «матрицы путаницы» между вашими предсказаниями с пользовательским порогом -220 (y_pred) по сравнению с некоторыми другимипрогнозы с порогом по умолчанию (выходной сигнал svc_model.predict(X_test)), который не имеет никакого смысла.

Ваша основная истина для тестового набора - y_test;Итак, чтобы получить матрицу смешения с пороговым значением по умолчанию, вы должны использовать

confusion_matrix(y_test, svc_model.predict(X_test))

Чтобы получить матрицу смешения с вашим пользовательским порогом -220, вы должны использовать

confusion_matrix(y_test, y_pred)

См. документация для получения более подробной информации об использовании (которая является вашим лучшим другом, и всегда должна быть первой, на которую стоит обратить внимание при возникновении проблем или сомнений).

...