Введение

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

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

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

Обзор данных

Учитывая Ген, Варианты и Текст как функции, нам необходимо предсказать класс переменной Класс ( целевая переменная). Это проблема многоклассовой классификации, и мы будем измерять эффективность нашей модели с помощью метрики многоклассовой потери журнала.

Впереди план

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

Chaliye Shuru Karte (Давайте начнем кодить !!)

import pandas as pd
import matplotlib.pyplot as plt
import re
import warnings
import numpy as np
from nltk.corpus import stopwords
from sklearn.preprocessing import normalize
from sklearn.feature_extraction.text import CountVectorizer
import seaborn as sns
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix,accuracy_score,log_loss 
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import SGDClassifier,LogisticRegression
from scipy.sparse import hstack
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import SVC
from collections import Counter, defaultdict
from sklearn.calibration import CalibratedClassifierCV
from sklearn.naive_bayes import MultinomialNB, GaussianNB
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.metrics import normalized_mutual_info_score
from sklearn.ensemble import RandomForestClassifier
warnings.filterwarnings("ignore")
from mlxtend.classifier import StackingClassifier

Итак, мы начинаем с импорта различных библиотек pandas, numpy для обработки данных, matplotlib и seaborn для построения графиков и Пакет sklearn используется для построения модели.

Чтение данных

Наши данные представлены в двух разных файлах с разными разделителями, поэтому мы будем читать каждый файл отдельно, а затем объединить оба файла, используя столбец «ID».

Предварительная обработка текста и разработка функций

После чтения данных мы выполним предварительную обработку текста, которая включает в себя очистку текста, например удаление стоп-слова, удаление специальных символов, если они есть, нормализацию текста и преобразование всего слова в нижнем регистре. В ходе этого процесса мы обнаружили, что в некоторых строках нет текста, поэтому мы заменим значения NaN на Gene. + Вариация значений.

Разделение данных на обучение, тестирование и перекрестную проверку

Теперь мы разделим наши данные на данные для обучения, тестирования и перекрестной проверки, чтобы проверить, одинаково ли распределение наших целевых значений во всех трех данных или нет.

Почему распределение должно быть таким же? Распределение нашего целевого значения должно быть таким же, чтобы во время обучения наша модель встретила все значения классов, присутствующие в нашем наборе данных.

Обучение

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

Как выполнить потерю журнала для случайной модели в настройке с несколькими классами? Мы будем случайным образом генерировать числа, равные нашему количеству классов (10 в нашей задаче) для каждой точки в наших тестах и ​​перекрестной проверке данные, а затем нормализовать их, чтобы суммировать их к единице.

test_data_len = test_df.shape[0]
cv_data_len = cv_df.shape[0]
# we create a output array that has exactly same size as the CV data
cv_predicted_y = np.zeros((cv_data_len,9))
#for every value in our CV data we create a array of all zeros with #size 9
for i in range(cv_data_len):#iterating to each value in cv data(row)
    rand_probs = np.random.rand(1,9) #generating randoms form 1 to 9
    cv_predicted_y[i] = ((rand_probs/sum(sum(rand_probs)))[0]) #normalizing to sum to 1
print("Log loss on Cross Validation Data using Random Model",log_loss(y_cv,cv_predicted_y, eps=1e-15))
# Test-Set error.
#we create a output array that has exactly same as the test data
test_predicted_y = np.zeros((test_data_len,9))
for i in range(test_data_len):
    rand_probs = np.random.rand(1,9)
    test_predicted_y[i] = ((rand_probs/sum(sum(rand_probs)))[0])
print("Log loss on Test Data using Random Model",log_loss(y_test,test_predicted_y, eps=1e-15))
predicted_y =np.argmax(test_predicted_y, axis=1)
plot_confusion_matrix(y_test, predicted_y+1)

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

Мы видим, что наша случайная модель имеет логарифмическую потерю 2,4 для перекрестной проверки и тестовых данных, поэтому нам нужно, чтобы наши модели работали лучше, чем это, давайте проверим точность и запоминаемость для этой модели.

Как интерпретировать приведенную выше матрицу точного отзыва?

Точность
1. На примере ячейки (1x1) она имеет значение 0,127; в нем говорится, что из всех точек, которые, по прогнозам, относятся к классу 1, только значения 12,7% на самом деле относятся к классу 1.

2. Для исходного класса 4 и предсказанного класса 2 мы можем сказать, что из значений, которые наша модель предсказала для класса 2 , 23,6% значения на самом деле принадлежат классу 4

Напомнить

1. Проверьте ячейку (1X1), она имеет значение 0,079, что означает, что для всех точек, которые фактически относятся к классу 1, наша модель предсказала, что только 7% значений будут классом 1.

2. Для исходных значений класса 8 и прогнозируемого класса 5 это 0,250 означает все значения, которые на самом деле относятся к классу 8 являются прогнозируемыми 25% значениями модели, которые соответствуют классу 5

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

Логистическая регрессия

Машина опорных векторов

Сравнение всех моделей

Мы видим, что машина логистической регрессии и опорных векторов работает лучше других с точки зрения как лог-потерь, так и процента неправильно классифицированных точек.

Вы можете проверить мой GitHub для получения полного кода и данных.

Не стесняйтесь связываться со мной на любой из платформ.

Ознакомьтесь также с другими моими статьями