📌 Почему нельзя использовать дерево, если переменная непредобработана?



💬 Спрашивают в 14% собеседований



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



1️⃣ Пропущенные значения (Missing Values):



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



Пример:

import pandas as pd

from sklearn.tree import DecisionTreeClassifier



# Пример данных с пропущенными значениями

data = {'Feature1': [1, 2, None, 4], 'Target': [0, 1, 0, 1]}

df = pd.DataFrame(data)



# Это вызовет ошибку

model = DecisionTreeClassifier()

model.fit(df[['Feature1']], df['Target'])


Решение:



Пропущенные значения можно заменить средним, медианой, модой или специальным значением.

df['Feature1'].fillna(df['Feature1'].mean(), inplace=True)

model.fit(df[['Feature1']], df['Target'])




2️⃣ Категориальные признаки (Categorical Features):



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



Пример:

data = {'Feature1': ['A', 'B', 'A', 'C'], 'Target': [0, 1, 0, 1]}

df = pd.DataFrame(data)



# Это вызовет ошибку

model = DecisionTreeClassifier()

model.fit(df[['Feature1']], df['Target'])


Решение: Преобразование категориальных признаков.

df = pd.get_dummies(df, columns=['Feature1'])

model.fit(df[['Feature1_A', 'Feature1_B', 'Feature1_C']], df['Target'])




3️⃣ Масштабирование признаков (Feature Scaling):



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



Решение: Масштабирование признаков с помощью стандартного скейлера.

from sklearn.preprocessing import StandardScaler



scaler = StandardScaler()

scaled_features = scaler.fit_transform(df[['Feature1', 'Feature2']])




4️⃣ Выбросы (Outliers):



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



Решение:



Обнаружение и обработка выбросов.

# Пример простого обнаружения выбросов с использованием межквартильного диапазона (IQR)

Q1 = df['Feature1'].quantile(0.25)

Q3 = df['Feature1'].quantile(0.75)

IQR = Q3 - Q1

df = df[~((df['Feature1'] < (Q1 - 1.5 * IQR)) | (df['Feature1'] > (Q3 + 1.5 * IQR)))]




🤔Пример полного цикла предобработки данных для дерева решений:

import pandas as pd

from sklearn.tree import DecisionTreeClassifier

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler



# Пример данных

data = {'Feature1': [1, 2, None, 4], 'Feature2': ['A', 'B', 'A', 'C'], 'Target': [0, 1, 0, 1]}

df = pd.DataFrame(data)



# Обработка пропущенных значений

df['Feature1'].fillna(df['Feature1'].mean(), inplace=True)



# Преобразование категориальных признаков

df = pd.get_dummies(df, columns=['Feature2'])



# Масштабирование признаков

scaler = StandardScaler()

scaled_features = scaler.fit_transform(df[['Feature1', 'Feature2_A', 'Feature2_B', 'Feature2_C']])



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

X_train, X_test, y_train, y_test = train_test_split(scaled_features, df['Target'], test_size=0.2, random_state=42)



# Обучение модели

model = DecisionTreeClassifier()

model.fit(X_train, y_train)



# Предсказание и оценка

predictions = model.predict(X_test)




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



🔥 ТОП ВОПРОСОВ С СОБЕСОВ



🔒 База собесов | 🔒 База тестовых