В эту цифровую эпоху технологические достижения позволяют нам применять искусственный интеллект в различных областях, включая здравоохранение. Одним из таких примеров является использование машинного обучения для прогнозирования риска развития диабета у отдельных лиц. В этом исследовании я провел анализ с использованием данных, полученных от Kaggle, для разработки точной модели прогнозирования диабета. Первые шаги включали импорт данных в фрейм данных Pandas и выполнение визуализации данных, чтобы получить представление о его характеристиках.
import pandas as pd import numpy as np df = pd.read_csv("diabetes_prediction_dataset.csv") df
df.isna().sum()
это мой счастливый день :)
Данные визуализации
в этих данных 1 означает наличие диабета, а 0 означает отсутствие диабета.
import matplotlib.pyplot as plt # Menghitung jumlah data dengan nilai 1 dan 0 pada kolom "diabetes" diabetes_counts = df['diabetes'].value_counts() # Membuat pie chart plt.figure(figsize=(3, 3)) plt.pie(diabetes_counts, labels=diabetes_counts.index, autopct='%1.1f%%', startangle=90, colors=['blue', 'orange']) plt.title('Persentase Data dengan Nilai 1 dan 0 pada Kolom "Diabetes"') plt.show()
из 100 000 данных люди, страдающие сахарным диабетом, составляют 8,5%
import matplotlib.pyplot as plt import seaborn as sns # Filter data dengan nilai 1 pada kolom "diabetes" age_diabetes_1 = df[df['diabetes'] == 1] # Menghitung jumlah "age" dengan nilai 1 pada kolom "diabetes" dan mengambil 10 "age" teratas age_counts = age_diabetes_1['age'].value_counts().sort_values(ascending=False).head(10) # Membuat diagram batang plt.figure(figsize=(8, 4)) sns.barplot(x=age_counts.index, y=age_counts.values, color='blue') plt.title('10 Age Teratas dengan Nilai 1 pada Kolom "Diabetes"') plt.xlabel('Usia (age)') plt.ylabel('Jumlah') plt.show()
Данные показывают первые 10 возрастов, у которых есть диабет.
# Menghitung jumlah data dalam setiap kategori "smoking_history" smoking_counts = df['smoking_history'].value_counts() # Membuat diagram pie plt.figure(figsize=(6, 6)) plt.pie(smoking_counts, labels=smoking_counts.index, autopct='%1.1f%%', startangle=90) plt.title('Proporsi Kategori pada Kolom "Smoking History"') plt.show()
Это показывает данные о курильщиках в наборе данных, довольно много неизвестных данных.
Сахарный диабет – это заболевание, которое становится все более распространенным во всем мире. Понимание факторов, которые могут повлиять на риск развития диабета, имеет решающее значение для предотвращения и лечения этого состояния. В этом исследовании я использовал подход машинного обучения для выявления признаков, связанных с риском развития диабета. Есть надежда, что, поняв эти важные факторы, мы сможем уделить больше внимания лицам с высоким риском и принять необходимые превентивные меры.
После визуализации данных следующим шагом была классификация данных, чтобы подготовить их для машинного понимания. Однако, прежде чем двигаться дальше, я провел отбор признаков, используя несколько методов. Одним из них было рекурсивное устранение признаков (RFE), которое итеративно устраняет признаки с наименьшим влиянием на прогноз диабета. Метод RFE продемонстрировал высокую точность выбора признаков, что сделало его основным методом, выбранным для этого исследования.
В дополнение к RFE я также использовал метод SelectKBest, чтобы выбрать лучшие k функций на основе рассчитанных статистических оценок. Кроме того, я реализовал алгоритм классификатора случайного леса, который может определить наиболее важные особенности прогнозирования диабета. Среди этих трех методов я выбрал функции, выбранные методом RFE, для обучения моей модели прогнозирования.
Классификация данных
классификация направлена на облегчение обработки данных с помощью машинного обучения
# Membuat klasifikasi pada kolom "gender" df['gender'] = df['gender'].replace({'Male': 1, 'Female': 2}) df['diabetes'] = df['diabetes'].replace({'False': 0, 'True': 1}) # Membuat klasifikasi pada kolom "smoking_history" smoking_classification = { 'No Info': 0, 'ever': 1, 'not current': 2, 'current': 3, 'former': 4, 'never': 5 } df['smoking_history'] = df['smoking_history'].replace(smoking_classification)
Определить функции
from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression from sklearn.feature_selection import SelectKBest, chi2 # Memisahkan fitur (X) dan target (y) X = df.drop('diabetes', axis=1) y = df['diabetes'] #RFE # Inisialisasi model pengklasifikasi model = LogisticRegression() # Inisialisasi objek RFE dengan model pengklasifikasi dan jumlah fitur yang ingin dipilih rfe = RFE(estimator=model, n_features_to_select=5) # Melakukan seleksi fitur dengan RFE X_selected = rfe.fit_transform(X, y) # Mendapatkan subset fitur yang terpilih selected_features_rfe = X.columns[rfe.support_].tolist() #SelectKBest: k = 5 # Jumlah fitur terbaik yang ingin dipilih selector = SelectKBest(score_func=chi2, k=k) X_new = selector.fit_transform(X, y) # Mendapatkan fitur terbaik yang dipilih selected_features_skbest = X.columns[selector.get_support()] # Menampilkan fitur-fitur yang terpilih print("Fitur yang terpilih(RFE):") print(selected_features_rfe) # Menampilkan fitur terbaik yang dipilih print("Fitur terbaik yang dipilih selectKBest:") print(selected_features_skbest)
это напряженный момент, определение признаков такое же, как и определение успешности модели, я здесь, чтобы сделать 2 метода выбора признаков для сравнения
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report # Memilih subset fitur yang relevan selected_features = ['age', 'hypertension', 'bmi', 'HbA1c_level', 'blood_glucose_level'] X = df[selected_features] y = df['diabetes'] # Membagi data menjadi data pelatihan dan data pengujian X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Membangun model Random Forest rf = RandomForestClassifier() # Melatih model menggunakan data pelatihan rf.fit(X_train, y_train) # Memprediksi target menggunakan data pengujian y_pred = rf.predict(X_test) # Menampilkan laporan klasifikasi print(classification_report(y_test, y_pred))
здесь я использую возможности метода RFE, он дает 0,97. это более чем достаточно точно для прогнозирования, в то время как 2-й признак дает 0,94, у него есть разрыв, который довольно далек от метода RFE.
Используя оптимально подобранные функции, я обучил модель классификатора случайного леса прогнозировать риск диабета. Полученная модель достигла высокой точности, что указывает на то, что признаки, выбранные с помощью метода RFE, играют важную роль в прогнозировании этого заболевания. В этом исследовании я рассматривал выбор признаков только как начальный шаг в разработке модели прогнозирования диабета. Для обеспечения точности и обобщения этой модели требуются дальнейшие проверки и испытания.
Помимо использования существующих данных, я также хотел протестировать созданную мной модель с новыми данными. Вот новые данные, которые я использовал:
new_data = pd.DataFrame({ 'age': [45, 65, 30, 50], 'hypertension': [0, 1, 1, 0], 'bmi': [25, 30, 35, 28], 'HbA1c_level': [6.0, 7.5, 5.8, 6.2], 'blood_glucose_level': [120, 180, 100, 140] }) predictions = rf.predict(new_data) print(predictions) [0 1 0 0]
После запуска модели прогнозирования результаты показали следующие классификации: [0 1 0 0]. Число 0 указывает на то, что у людей низкий риск развития диабета, а число 1 указывает на высокий риск.
В этом исследовании я описал этапы разработки модели прогнозирования диабета с использованием подхода машинного обучения. Начальные шаги включали импорт данных, визуализацию и выбор признаков с использованием методов RFE, SelectKBest и Random Forest Classifier. Результаты показали, что метод RFE успешно идентифицировал наиболее значимые признаки для прогнозирования диабета. Понимая эти факторы риска, мы можем более эффективно предотвращать и лечить сахарный диабет в будущем. Кроме того, благодаря тестированию новых данных созданная мной модель показала хорошие возможности прогнозирования риска диабета у новых людей.