EDA или исследовательский анализ данных — это основной шаг для решения любой задачи машинного обучения, когда у вас есть данные в текстовом формате, например в формате .csv или .xlxs, или, возможно, даже когда вы извлекаете такие данные из SQL или Базы данных NoSQL. Чтобы понять суть данных, мы должны провести исследовательский анализ данных, чтобы продвинуться вперед в любом проекте машинного обучения, прежде чем обучать модель.

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

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

Давайте поговорим: если я скажу вам, что вся ваша работа для EDA будет выполняться в 2–3 строчках кода, вы мне поверите? Давайте сделаем это, используя мощную библиотеку под названием Pandas Profiling.

Итак, как использовать профилирование панд?

Первый шаг — установить его с помощью этой команды:

pip install pandas-profiling

Затем мы генерируем отчет с помощью этих команд:

from pandas_profiling import ProfileReport #call pandas profling after instal
prof = ProfileReport(df)
prof.to_file(output_file='output.html') #your report will be generated in output file

На этом ваша работа с EDA почти ЗАВЕРШЕНА!! Вам просто нужно просмотреть отчет и собрать информацию в соответствии с вашими потребностями. Сгенерированный отчет будет содержать все виды информации, необходимой для продолжения разработки функций, масштабирования и очистки данных.

Что теперь делать?

После создания отчета о профилировании и получения основных сведений о данных переходите к изучению данных.

Выполните проверки следующих вещей в ваших данных:

  1. Есть ли нулевые или отсутствующие значения? Как с этим справиться?

Таким образом, в постановке задачи обнаружения щитовидной железы данные не имеют значения NULL, но значения NULL заменены на «?», поэтому вам всегда нужно сначала четко проверять свои данные, прежде чем двигаться дальше. Если в столбцах отсутствуют значения, вы заменяете их многими методами, о которых мы поговорим дальше. В этом сценарии мы можем заменить их с помощью функции NumPy .nan, как показано ниже:

import numpy as np
for column in data.columns:
    count = data[column][data[column]=='?'].count()
    if count!=0:
        data[column] = data[column].replace('?',np.nan)

Большой !! теперь вы можете иметь все значения как значения NaN

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

Каким должен быть ваш идеальный подход, когда вы видите категориальные и числовые данные в своем наборе данных?

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

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

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

from sklearn.preprocessing import LabelEncoder
lblEn = LabelEncoder()
data['Class'] =lblEn.fit_transform(data['Class'])

Это завершит все кодирование для категориальных значений.

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

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

from sklearn.impute import KNNImputer
imputer=KNNImputer(n_neighbors=3, weights='uniform',missing_values=np.nan)
new_array=imputer.fit_transform(data) # impute the missing values
# converting the nd-array returned in the step above to a Dataframe
new_data=pd.DataFrame(data=np.round(new_array), columns=data.columns)

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

new_data.isna().sum()

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

2. Проверка распределения в вашем наборе данных

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

Прежде чем выполнять преобразование журнала, чтобы преобразовать ваши данные, вы должны добавить 1 к каждому значению в столбце, чтобы обрабатывать исключения, когда мы пытаемся найти журнал «0». Вы можете сделать это просто, как показано ниже:

columns = ['age','TSH','T3','TT4','T4U','FTI'] #select the columns
plot.figure(figsize=(10,15),facecolor='white')
plotnumber = 1
for column in columns:
    new_data[column]+=1 #adding one to pevent log 0
    ax = plot.subplot(3,2,plotnumber)
    sns.distplot(np.log(new_data[column]))
    plot.xlabel(column,fontsize=10)
    plotnumber+=1
plot.show()

После преобразования журнала остальные столбцы в наборе данных выглядят нормально, но «ТТГ» имеет странную тенденцию. это просто столбец в наборе данных, поэтому, если есть какая-то странная тенденция, мы можем удалить этот столбец, прежде чем двигаться дальше, потому что он не будет предоставлять много информации.

3. Проверьте данные баланса и балансировки в своем наборе данных

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

Так как же сделать несбалансированный набор данных сбалансированным?

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

from imblearn.over_sampling import RandomOverSampler
x = new_data.drop(['Class'],axis=1)
y = new_data['Class']
rdsmple = RandomOverSampler()
x_sampled,y_sampled  = rdsmple.fit_resample(x,y)

4. Проверка оценки VIF на мультиколлинеарность

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

def vif_score(x):
    scaler = StandardScaler() # performing scaling on data without output class 
    arr = scaler.fit_transform(x)
    return pd.DataFrame([[x.columns[i], variance_inflation_factor(arr,i)] for i in range(arr.shape[1])], columns=["FEATURE", "VIF_SCORE"])
vif_score(x_sampled)

Мы можем видеть, что данные имеют мультиколлинеарность функций, которые отображают следующие: referral_source_STMW, referral_source_SVHC, referral_source_SVHD referral_source_SVI, referral_source_other, TT4 и FTI, поэтому первые четыре referral_source_STMW, referral_source_SVHC, referral_source_SVHD referral_source_SVI, TT4 и FTI для предотвращения мультиколлинеарности.

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

Доступ к полному блокноту Нажмите здесь

Для просмотра полного сквозного проекта Нажмите здесь

Найдите меня на GitHub, ResearchGate, Tableau и LinkedIn, чтобы узнать о других интересных проектах и ​​о том, как обращаться с новыми данными, которые вы получаете.