Данные о диабете, которые мы попытаемся провести для исследовательского анализа данных и прогнозов, я получил от Kaggle.

Набор данных состоит из 9 столбцов и 768 строк, объяснение всех особенностей:

  1. Беременности: количество беременностей каждой пациентки.
  2. Глюкоза: число содержания сахара в крови.
  3. BloodPressure: число артериального давления указывает на низкое или высокое кровяное давление.
  4. SkinThickness: толщина кожи.
  5. Инсулин: количество гормонов, регулирующих уровень сахара в крови.
  6. ИМТ: номер идеальной весовой категории.
  7. DiabetesPredigreeFuction: числовой индикатор семейного анамнеза диабета.
  8. Результат: укажите, есть ли у пациента диабет или нет, в формате 1 (верно) и 0 (ложно).

ПРИМЕЧАНИЯ › в наборе данных есть столбец "Беременности", это означает, что данные берутся только у пациенток женского пола

Очистка данных

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

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

  1. Глюкоза
  2. Артериальное давление
  3. Толщина кожи
  4. инсулин
  5. ИМТ

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

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

new_df = df.copy(deep = True)
new_df[['Glucose','BloodPressure','SkinThickness','Insulin','BMI']] = new_df[['Glucose','BloodPressure','SkinThickness','Insulin','BMI']].replace(0,np.NaN)
print(new_df.isnull().sum())

Сначала я создаю новые данные, копируя старые данные с аргументом «deep = True», поэтому все связанные объекты будут скопированы на большую глубину, гарантируя, что полученные новые данные не будут ссылаться на исходные данные. Затем я сделал 0 значений в параметрах Глюкоза, Кровяное давление, Толщина кожи, Инсулин, столбец ИМТ становится нулевым.

После этого мы можем заменить нулевое значение в строке на значение 0, которое мы изменили на нулевое.

# Replacing NaN values with upper quartiles (Q3)
new_df['Glucose'].fillna(df['Glucose'].quantile(0.75), inplace=True)
new_df['BloodPressure'].fillna(df['BloodPressure'].quantile(0.75), inplace=True)
new_df['SkinThickness'].fillna(df['SkinThickness'].quantile(0.75), inplace=True)
new_df['Insulin'].fillna(df['Insulin'].quantile(0.75), inplace=True)
new_df['BMI'].fillna(df['BMI'].quantile(0.75), inplace=True)

В этом примере замените нулевые значения в новых данных на процентиль (0,75). Это означает замену значений NaN значениями верхнего процентиля (значения, которые делят данные на верхние 75% и нижние 25%).

ПОЧЕМУ причина использования верхних квантилей заключается в том, чтобы избежать влияния выбросов на распределение данных. Выбросы — это значения, которые очень далеки от большинства данных. Если вместо этого использовать среднее значение, выбросы могут сильно повлиять на среднее значение, что приведет к нереалистичным значениям.

Наконец, у нас больше нет нулевых значений в некоторых столбцах, которые раньше имели нулевые значения, это хорошая новость!

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

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

new_df.hist(bins=10, figsize=(10,10))
plt.show()

На основе визуализации, которую мы создаем для каждого столбца, мы получаем некоторую информацию:

  1. Большинство пациенток ранее никогда не были беременны и были беременны от 1 до 5 раз.
  2. У большинства пациентов нормальный уровень глюкозы составляет менее 140.
  3. Большинство пациентов имеют нормальное кровяное давление с цифрами от 90 и выше, но многие также имеют низкое кровяное давление с цифрами ниже 90.
  4. У большинства людей нормальная толщина кожи в 30 лет, если перевести в миллиметры до 3 мм.
  5. У большинства пациентов нормальный уровень инсулина колеблется от 70 до 100 единиц.
  6. Большинство пациентов имеют избыточный вес, поскольку это показывает, что многие пациенты имеют ИМТ выше 30.
  7. Большинство пациентов не имеют в анамнезе диабета в семье.
  8. большинство пациентов указали, что в этих данных все еще было много пациентов, которые все еще были молодыми взрослыми.

Из приведенных выше данных можно сделать вывод, что из 768 данных 500 пациентов не имеют диабета, а остальные 268 пациентов имеют диабет.

В каком возрасте у пациента диабет, а не диабет?

Чтобы ответить на поставленные выше вопросы, мы визуализируем «результаты», связанные с «возрастом».

age_sorted = new_df.copy(deep = True)
age_sorted.sort_values('Age')
age_sorted['count'] = 1

summed_age_df = age_sorted.groupby(['Age','Outcome']).sum().reset_index()

summed_age_df.set_index('Age', inplace=True)
summed_age_df.groupby('Outcome')['count'].plot(legend=True)

Здесь я объясню, что я сделал метод выше

  1. 'age = new_df.copy(deep=True)' : кадр данных new_df копируется в переменную 'age' с помощью copy(). с аргументом deep=True. Это делается для того, чтобы новый старый фрейм данных был объектом с разделителями памяти, поэтому изменения в старом фрейме данных не повлияют на new_df.
  2. 'age_sorted = age.sort_values('Возраст')' :'Возраст' во фрейме данных сортируется по Столбец 'Возраст' с помощью метода sort_values(). Это сохранит новый DataFrame в 'age_sorted' , отсортировав данные в порядке возрастания 'Age' .
  3. 'age_sorted['count'] = 1': новый столбец 'count ' добавляется в 'age_sorted' DataFrame и инициализируется значением 1 для каждой строки. Цель состоит в том, чтобы подсчитать количество вхождений каждого значения ‘Age’ во фрейме данных.
  4. 'summed_age_df = age_sorted.groupby(['age', 'Outcome']).sum().reset_index()':
    ' age_sorted' DataFrame группируется по столбцам 'Age'и 'Outcome' с помощью метода groupby(). Затем используйте метод sum(), чтобы добавить значения столбца count для каждой группы. Результаты сохраняются в 'summed_age_df', где каждая строка представляет уникальную комбинацию значений 'Age' и 'Outcome', а также 'count' содержит количество вхождений.
  5. 'summed_age_df.set_index('age', inplace=True)': это команда для изменения столбца 'Age' на индекс кадра данных summed_age_df. Установив этот столбец в качестве индекса, мы можем легко группировать и визуализировать на основе этой группы.
  6. 'summed_age_df.groupby('Outcome')['count'].plot(legend=True)':
    Этот код группирует данные в summed_age_df на основе столбца "Результат" и выбирает столбец "count" для визуализации. Предполагается, что Результат — это столбец, содержащий категории или группы, отображаемые на диаграмме.'groupby('Результат')': группа данные по уникальным значениям в столбце 'Результат'. Это отобразит несколько групп данных отдельно. '['count']': выберите столбец 'count' для каждой группы, которую я хочу использовать в своей визуализации.' (легенда = истина)': нарисуйте диаграмму на основе кластеров, созданных на предыдущем шаге. legend=True используется для отображения легенды на диаграмме, чтобы каждая группа данных могла быть выдающийся.

Таким образом, код создает график, показывающий распределение "счетчиков" на основе групп "Результатов" для каждой возрастной категории (Возраст) в кадр данных summed_age_df.

Выбор функций

Выбор функций — один из первых и наиболее важных шагов в выполнении любой задачи машинного обучения. Функции в случае записей просто означают столбцы. Не все столбцы (признаки) обязательно влияют на выходную переменную при извлечении набора данных. Добавление этих нерелевантных функций в модель сделает ее только хуже (мусор в мусор). По этой причине необходимо сделать выбор характеристик.

plt.figure(figsize=(7,6))
p = sns.heatmap(new_df.corr(), annot=True,cmap ='coolwarm')
plt.title('Correlation All Features')

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

y = new_df.Outcome
feature_columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction','Age']
X = new_df[feature_columns]

Масштабирование

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

from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
Scalling = new_df[['Pregnancies', 
'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']] = scaler.fit_transform(new_df[['Pregnancies', 
'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']])

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

Прогноз

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

Построение модели

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

так как мы получаем значение 0 при средней абсолютной ошибке, мы сразу попытаемся увидеть результаты значений из модели, которую я сделал с помощью регрессора дерева решений

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

def get_mae(max_leaf_nodes, train_X, test_X, train_y, test_y):
    model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
    model.fit(train_X, train_y)
    preds_val = model.predict(test_X)
    mae = mean_absolute_error(test_y, preds_val)
    return(mae)

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

Как и раньше, я буду делать 3 дела одновременно

Мы видим, что модель, которую я сделал, получает среднюю абсолютную ошибку, которая довольно мала, тогда как насчет оценки точности?

получается, что при использовании модели Random Forest мы получаем более высокий показатель точности по сравнению с использованием модели Decision Tree

Заключение

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

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

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