Набор данных Хабермана:

https://www.kaggle.com/datasets/gilsousa/habermans-survival-data-set

Набор данных Хабермана — это набор медицинских данных, который содержит данные о пациентах с раком молочной железы, перенесших операцию в больнице Биллингса Чикагского университета в период с 1958 по 1970 год. Набор данных обычно используется в машинном обучении и статистическом анализе для прогнозирования выживания пациентов, перенесших операцию. хирургия рака молочной железы. Набор данных содержит четыре столбца, которые описаны ниже.

Столбцы:

Возраст: в этом столбце указан возраст пациента на момент операции. Это числовая переменная со значениями от 30 до 83.

Операционный год: В этом столбце указан год, в котором пациент перенес операцию. Это числовая переменная со значениями в диапазоне от 1958 до 1969 года.

Exil_nodes_det: этот столбец представляет количество положительных подмышечных узлов, обнаруженных у пациента. Это числовая переменная со значениями от 0 до 52.

выживания_состояние: этот столбец представляет статус выживания пациента через 5 лет. Это категориальная переменная с двумя значениями: 1 (пациент прожил 5 лет и более) и 2 (пациент не прожил 5 лет).

Цель в машинном обучении:

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

Отчет о проекте:

В этом проекте мы создадим модель машинного обучения, которая сможет прогнозировать выживаемость пациента через 5 лет в зависимости от его возраста, года операции и количества обнаруженных положительных подмышечных лимфоузлов. Это проблема бинарной классификации, когда модели необходимо классифицировать пациентов по одной из двух категорий на основе их характеристик. Мы будем использовать набор данных Хабермана, который содержит данные о больных раком молочной железы, перенесших операцию в больнице Биллингс Чикагского университета в период с 1958 по 1970 год.

Шаг 1: Импорт необходимых библиотек и загрузка набора данных

Мы начнем с импорта необходимых библиотек, таких как NumPy, Pandas, Matplotlib и Scikit-Learn. Затем мы загрузим набор данных Хабермана, используя функцию Pandas read_csv().

Шаг 2: Исследовательский анализ данных

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

Шаг 3: Разработка функций

На этом этапе мы предварительно обработаем набор данных, выполнив масштабирование функций, обработав пропущенные значения и кодируя категориальные переменные. Мы разделим набор данных на наборы для обучения и тестирования и применим масштабирование функций для нормализации данных. Мы также будем обрабатывать отсутствующие значения с помощью класса Imputer из Scikit-Learn и кодировать категориальную переменную с помощью One-Hot Encoding.

Шаг 4: Выбор модели

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

Шаг 5: Оценка модели

На этом этапе мы оценим производительность выбранной модели, используя различные показатели производительности, такие как точность, точность, полнота и оценка F1. Мы также визуализируем производительность модели, используя кривые ROC и матрицы путаницы.

Шаг 6: Заключение

На этом этапе мы подведем итоги проекта и сделаем выводы об эффективности выбранной модели. Мы обсудим ограничения модели и предложим области для будущих исследований.

Код модели:

import numpy as np
import pandas as pd
[121]
df = pd.read_csv('haberman.csv',header=None, names=['age','operational_year','exil_node','survival'])
[122]
df.head()
Six Questions
[123]
df.shape
(306, 4)
[124]
df.isnull().sum()
age                 0
operational_year    0
exil_node           0
survival            0
dtype: int64
[125]
df.duplicated().sum()
17
[128]
df.drop_duplicates(inplace=True)
[129]
df.duplicated().sum()
0
[130]
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 289 entries, 0 to 305
Data columns (total 4 columns):
 #   Column            Non-Null Count  Dtype
---  ------            --------------  -----
 0   age               289 non-null    int64
 1   operational_year  289 non-null    int64
 2   exil_node         289 non-null    int64
 3   survival          289 non-null    int64
dtypes: int64(4)
memory usage: 11.3 KB
[131]
df.describe()
EDA
[133]
corr = df.corr()
[138]
import seaborn
sns.heatmap(corr,annot=True, cbar=True,cmap='plasma')
<AxesSubplot:>

Univariate analysis
Histogram and Distibution plot
A histogram is a graphical representation of the distribution of a numerical dataset. Seaborn's displot() function can be used to draw histograms.
[141]
sns.distplot(df['operational_year'])

[146]
sns.histplot(df['age'])
<AxesSubplot:xlabel='age', ylabel='Count'>

Relation
[148]
sns.scatterplot(x=df['age'],y=df['survival'])
<AxesSubplot:xlabel='age', ylabel='survival'>

train test split
[149]
X = df.drop("survival",axis=1)
y = df['survival']
[150]
X.shape
(289, 3)
[151]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2)
[152]
X_train.shape
(126, 3)
[153]
X_test.shape
(32, 3)
[154]
y_train.shape
(126,)
[156]
y_test.shape
(32,)
Standarization
[166]
from sklearn.preprocessing import StandardScaler
sclr = StandardScaler()
[167]
sclr.fit(X_train)
X_train = sclr.transform(X_train)
X_test = sclr.transform(X_test)
Training models
[169]
df['survival'].value_counts()
1    210
2     79
Name: survival, dtype: int64
selecting model
[172]
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
[173]
models = {
    'lg':LogisticRegression(),
    'dtc':DecisionTreeClassifier(),
    'gnb':GaussianNB()
}


for name, mod in models.items():
    mod.fit(X_train,y_train)
    y_pred = mod.predict(X_test)
    
    print(f"{name} with accuracy : {accuracy_score(y_test,y_pred)}")
    
lg with accuracy : 0.625
dtc with accuracy : 0.6875
gnb with accuracy : 0.65625
[174]
dtc = DecisionTreeClassifier()
dtc.fit(X_train,y_train)
dtc.predict(X_test)
array([1, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,
       2, 1, 1, 2, 1, 2, 2, 1, 2, 1], dtype=int64)
Prediction system
[177]
def pred(age,oy,en):
    features = np.array([[age,oy,en]])
    features = sclr.fit_transform(features)
    pred = dtc.predict(features).reshape(1,-1)
    return pred[0]


age = 50
oy = 61
en = 2

res = pred(age,oy,en)

Код фляги:

from flask import Flask, request, render_template
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
sclr = StandardScaler()
import pickle

# laoding model
model = pickle.load(open('model.pkl','rb'))
# flask app
app = Flask(__name__)

# paths
@app.route('/')
def index():
    return render_template('index.html')
@app.route('/predict',methods=['POST'])
def predict():
   age  = request.form['age']
   operational_year     = request.form['operational_year']
   exil_node = request.form['exil_node']

   features = np.array([[age,operational_year,exil_node]])
   features = sclr.fit_transform(features)
   pred = model.predict(features).reshape(1,-1)

   return render_template('index.html', output = pred[0])

# python main
if __name__ == "__main__":
    app.run(debug=True)

HTML-код:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
  </head>
  <body style="background:black;color:white;">

  <div class="container my-3 my-3">
    <h1 class="text-center">Patient Survival Prediction</h1>

    <form action="/predict" method="post">


      <div class="form-group">
        <label for="age">age</label>
        <input type="number" class="form-control" id="age" name="age">
      </div>
      <div class="form-group">
        <label for="operational_year">operational_year</label>
        <input type="number" class="form-control" id="operational_year" name="operational_year">
      </div>
      <div class="form-group">
        <label for="exil_node">exil_node</label>
        <input type="number" class="form-control" id="exil_node" name="exil_node">
      </div>

      <button type="submit" class="btn btn-primary btn-lg">prediction</button>
    </form>

    {% for i in output %}
    {% if i == 1 %}
    <p>The Patient Has Survived</p>
    {% else %}
    <p>The patient has Died</p>
    {% endif %}
    {% endfor %}
  </div>


    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
  </body>
</html>