<jupyter_start><jupyter_text>Инструкция по выполнению    1. Загрузите файл classification.csv. В нем записаны истинные классы объектов выборки (колонка true) и ответы некоторого классификатора (колонка pred).    2. Заполните таблицу ошибок классификации: |Actual |Positive|	Actual| Negative|    | ------| ------ | ------ | ------- |    |Predicted| Positive|	TP|	FP|    |Predicted| Negative|	FN|	TN|     Для этого подсчитайте величины TP, FP, FN и TN согласно их определениям. Например, FP — это количество объектов, имеющих класс 0, но отнесенных алгоритмом к классу 1. Ответ в данном вопросе — четыре числа через пробел.    3. Посчитайте основные метрики качества классификатора:    Accuracy (доля верно угаданных) — sklearn.metrics.accuracy_score    Precision (точность) — sklearn.metrics.precision_score    Recall (полнота) — sklearn.metrics.recall_score    F-мера — sklearn.metrics.f1_score    В качестве ответа укажите эти четыре числа через пробел.    4. Имеется четыре обученных классификатора. В файле scores.csv записаны истинные классы и значения степени принадлежности положительному классу для каждого классификатора на некоторой выборке:    для логистической регрессии — вероятность положительного класса (колонка score_logreg),    для SVM — отступ от разделяющей поверхности (колонка score_svm),    для метрического алгоритма — взвешенная сумма классов соседей (колонка score_knn),    для решающего дерева — доля положительных объектов в листе (колонка score_tree).    Загрузите этот файл.    5. Посчитайте площадь под ROC-кривой для каждого классификатора. Какой классификатор имеет наибольшее значение метрики AUC-ROC (укажите название столбца)? Воспользуйтесь функцией sklearn.metrics.roc_auc_score.    6. Какой классификатор достигает наибольшей точности (Precision) при полноте (Recall) не менее 70% ?Чтобы получить ответ на этот вопрос, найдите все точки precision-recall-кривой с помощью функции sklearn.metrics.precision_recall_curve. Она возвращает три массива: precision, recall, thresholds. В них записаны точность и полнота при определенных порогах, указанных в массиве thresholds. Найдите максимальной значение точности среди тех записей, для которых полнота не меньше, чем 0.7.Если ответом является нецелое число, то целую и дробную часть необходимо разграничивать точкой, например, 0.42. При необходимости округляйте дробную часть до двух знаков.Ответ на каждое задание — текстовый файл, содержащий ответ в первой строчке. Обратите внимание, что отправляемые файлы не должны содержать перевод строки в конце. Данный нюанс является ограничением платформы Coursera. Мы работаем над тем, чтобы убрать это ограничение.<jupyter_code>import pandas as pd
from pathlib import Path
path = Path.cwd()
path = path.joinpath('../data/raw/HSE_ML_week3')

data = pd.read_csv(path.joinpath('classification.csv'))
data.head(10)
TP = data.apply(
        lambda row: row[0]==1 and row[0]==row[1],
        axis=1
    )
TP.value_counts()
TP = data.apply(
        lambda row: row[0]==0 and row[0]!=row[1],
        axis=1
    )
TP.value_counts()
TP = data.apply(
        lambda row: row[0]==1 and row[0]!=row[1],
        axis=1
    )
TP.value_counts()
TP = data.apply(
        lambda row: row[0]==0 and row[0]==row[1],
        axis=1
    )
TP.value_counts()
file = open('/home/topcoder2k/HSE_ML/HSE_ML_week3_answers/classification_errors.txt', 'w')
file.write('43 34 59 64')
file.close()
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

print(accuracy_score(data['true'], data['pred']))
print(precision_score(data['true'], data['pred']))
print(recall_score(data['true'], data['pred']))
print(f1_score(data['true'], data['pred']))
file = open('/home/topcoder2k/HSE_ML/HSE_ML_week3_answers/model_scores.txt', 'w')
file.write('0.54 0.56 0.42 0.48')
file.close()
data = pd.read_csv(path.joinpath('scores.csv'))
data.head(10)
from sklearn.metrics import roc_auc_score

print(roc_auc_score(data['true'], data['score_logreg']))
print(roc_auc_score(data['true'], data['score_svm']))
print(roc_auc_score(data['true'], data['score_knn']))
print(roc_auc_score(data['true'], data['score_tree']))
file = open('/home/topcoder2k/HSE_ML/HSE_ML_week3_answers/best_model_score.txt', 'w')
file.write('score_logreg')
file.close()
from sklearn.metrics import precision_recall_curve

precision, recall, thresholds = precision_recall_curve(
    data['true'],
    data['score_logreg']
)
precision, recall
recall_threshold = 0.7
def recall_threshold_pos(recall):
    pos = 0
    while recall[pos] >= 0.7:
        pos += 1
    
    return pos


print(precision[:recall_threshold_pos(recall)].max())

precision, recall, thresholds = precision_recall_curve(
    data['true'],
    data['score_svm']
)
print(precision[:recall_threshold_pos(recall)].max())

precision, recall, thresholds = precision_recall_curve(
    data['true'],
    data['score_knn']
)
print(precision[:recall_threshold_pos(recall)].max())

precision, recall, thresholds = precision_recall_curve(
    data['true'],
    data['score_tree']
)
print(precision[:recall_threshold_pos(recall)].max())
file = open('/home/topcoder2k/HSE_ML/HSE_ML_week3_answers/best_0.7_precision_score.txt', 'w')
file.write('score_tree')
file.close()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11459129106187929, 'fraction_numerical': 0.015087853323147441, 'mean_word_length': 5.153936545240893, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 6, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '595512', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 2015, 'n_tokens_neox': 2173, 'n_words': 466, 'path': 'notebooks/HSE_ML_course/HSE_ML_week3_task4.ipynb', 'repo_name': 'TopCoder2K/DS-introduction', 'size': '5236'}