Інженерія ознак — це основа машинного навчання. Перетворення сирих даних у формат, який зрозуміють моделі, є критично важливим для створення ефективних і надійних систем. У цьому блозі ми розглянемо ключові аспекти інженерії ознак, зокрема роботу з відсутніми значеннями, обробку незбалансованих наборів даних та застосування технік кодування для перетворення даних.
Відсутні значення
Відсутні значення виникають, коли певна інформація не зберігається в наборі даних. Ефективна обробка таких значень є важливою для того, щоб продуктивність моделі не була знижена. Механізми відсутніх даних можна поділити на три типи:
1. Відсутні зовсім випадково (MCAR)
У випадку MCAR немає систематичної причини, чому дані відсутні. Відсутні значення рівномірно розподілені по набору даних.
Приклад: Дані, пропущені користувачами під час заповнення анкети. Вони можуть свідомо чи несвідомо пропускати певні поля, важливі для змінних моделі.
2. Відсутні випадково (MAR)
У випадку MAR ймовірність того, що значення відсутнє, залежить від спостережуваних даних, але не від самих відсутніх значень. Інакше кажучи, відсутні дані систематично пов'язані з наявними даними.
Приклад: У дослідженні доходів деякі учасники можуть не захотіти вказувати свої доходи. Якщо опитування спрямоване на визначення середнього доходу за віковими групами, відсутні дані про дохід будуть систематично пов'язані з віком.
3. Відсутні не випадково (MNAR)
У випадку MNAR ймовірність того, що значення відсутнє, залежить від ненаблюдаємого (не спостережуваного) даного. Відсутні дані не є випадковими і пов'язані з факторами, які не виміряні.
Приклад: Під час збору даних про задоволеність роботою і дохід, працівники, які менш задоволені, можуть навмисно уникати вказувати свій дохід. Відсутні дані залежать від їх рівня задоволення, який безпосередньо не вимірюється.
Обробка незбалансованих наборів даних
Незбалансовані набори даних часто зустрічаються в задачах класифікації, коли одна з класів значно перевищує інший. Наприклад, розглянемо набір даних із 1000 точок даних:
- 900 екземплярів - "так"
- 100 екземплярів - "ні"
Навчання моделі на таких даних ймовірно призведе до упередженої моделі, яка передбачатиме клас, що трапляється частіше. Для вирішення цієї проблеми використовуються два основних підходи:
1. Збільшення (Upsampling)
Збільшення кількості екземплярів у меншості шляхом дублювання або генерації синтетичних даних (наприклад, використовуючи SMOTE).
2. Зменшення (Downsampling)
Зменшення кількості екземплярів у більшості шляхом випадкового видалення даних для досягнення збалансованого розподілу.
## CREATE MY DATAFRAME WITH IMBALANCED DATASET
class_0 = pd.DataFrame({
'feature_1': np.random.normal(loc=0, scale=1, size=n_class_0),
'feature_2': np.random.normal(loc=0, scale=1, size=n_class_0),
'target': [0] * n_class_0
})
class_1 = pd.DataFrame({
'feature_1': np.random.normal(loc=2, scale=1, size=n_class_1),
'feature_2': np.random.normal(loc=2, scale=1, size=n_class_1),
'target': [1] * n_class_1
})
df=pd.concat([class_0,class_1]).reset_index(drop=True)
## upsampling
df_minority=df[df['target']==1]
df_majority=df[df['target']==0]
from sklearn.utils import resample
df_minority_upsampled=resample(df_minority,replace=True,
n_samples=len(df_majority),
random_state=42
)
df_upsampled=pd.concat([df_majority,df_minority_upsampled])
""" FOR CASE OF DOWN SAMPLING use df_majority with replace=False and n_samples of df_minority length """
SMOTE (Техніка синтетичного збільшення меншин)
SMOTE — це потужна техніка збільшення (upsampling). Замість дублювання існуючих даних, SMOTE генерує синтетичні екземпляри меншості шляхом інтерполяції між існуючими точками. Цей підхід гарантує, що модель вивчить збалансоване подання обох класів.
Кодування даних
Моделі машинного навчання в основному працюють з числовими даними, тому категоріальні дані повинні бути перетворені в числовий формат.
Методи кодування даних включають:
1. Номінальне кодування/One-Hot Encoding
One-hot кодування перетворює категоріальні дані в бінарні вектори. Воно підходить для номінальних даних, де категорії не мають внутрішнього порядку чи ранжування.
Приклад: Червоний: [1, 0, 0], Зелений: [0, 1, 0], Синій: [0, 0, 1]
from sklearn.preprocessing import OneHotEncoder
df = pd.DataFrame({'cars':['verna','city','baleno','swift','ciaz','kushaq']})
encoder = OneHotEncoder()
encoded = encoder.fit_transform(df[['cars']]).toarray()
df_encoded = pd.DataFrame(encoded,encoder.get_feature_names_out())
Переваги:
- Зберігає нейтральність даних, оскільки всі категорії представлені однаково.
Недоліки:
- Може призвести до перенавчання.
- Призводить до високої вимірності для наборів даних з великою кількістю унікальних категорій.
2. Кодування міток та порядкове кодування
Кодування міток (Label Encoding)
Присвоює унікальний ціле число кожній категорії. Найкраще підходить для номінальних даних, де немає внутрішнього порядку.
Приклад: Червоний: 0, Зелений: 1, Синій: 2
from sklearn.preprocessing import LabelEncoder
lbl_encoder=LabelEncoder()
lbl_encoder.fit_transform(df[['cars']])
lbl_encoder.transform([['ciaz']])
lbl_encoder.transform([['verna']])
Переваги:
- Легко реалізувати та ефективно використовувати пам'ять.
- Не збільшує вимірність.
Недоліки:
- Накладає штучний порядок, що може заплутати моделі, як-от Лінійна регресія.
Порядкове кодування (Ordinal Encoding)
Присвоює ціле число на основі природного порядку категорій. Найкраще підходить для порядкових даних.
Приклад: Малий: 0, Середній: 1, Великий: 2, XL: 3
from sklearn.preprocessing import OrdinalEncoder
df = pd.DataFrame({
'size': ['small', 'medium', 'large', 'medium', 'small', 'large']
})
encoder=OrdinalEncoder(categories=[['small','medium','large']])
encoder.fit_transform(df[['size']])
Переваги:
- Зберігає порядок.
- Ефективне використання пам'яті і добре працює для моделей, що вимагають порядкових зв'язків.
Недоліки:
- Припускає лінійний зв'язок між категоріями, що не завжди є правдою.
3. Кодування на основі таргету (Target Guided Ordinal Encoding)
Ця техніка присвоює порядкові значення категоріям на основі їхнього зв'язку з цільовою змінною. Категорії ранжуються згідно з тим, як вони впливають або корелюють з таргетом.
Приклад процесу:
- Обчислити середнє значення цільової змінної для кожної категорії.
- Ранжувати категорії на основі середнього значення.
- Призначити категоріям порядкові значення на основі їхнього рангу.
df = pd.DataFrame({
'city': ['New York', 'London', 'Paris', 'Tokyo', 'New York', 'Paris'],
'price': [200, 150, 300, 250, 180, 320]
})
# ОБЧИСЛИТИ СЕРЕДНЄ І РАНЖУВАТИ ЗА КАТЕГОРІЄЮ
mean_price=df.groupby('city')['price'].mean().to_dict()
# ПРИЗНАЧИТИ КОДИ
df['city_encoded']=df['city'].map(mean_price)
Переваги:
- Фіксує взаємозв'язок між ознаками та цільовою змінною.
Недоліки:
- Може призвести до перенавчання, якщо використовуються однакові дані для кодування та навчання.
Висновок
Інженерія ознак — це мистецтво, яке поєднує сирі дані з моделями машинного навчання. Від обробки відсутніх значень до балансування наборів даних і кодування категоріальних змінних — якість вашої інженерії ознак безпосередньо впливає на продуктивність моделі. Оволодіваючи цими техніками, ви можете розкрити весь потенціал своїх даних і побудувати надійні та ефективні системи машинного навчання.
Ресурси та зв'язок зі мною
Якщо ви хочете глибше ознайомитись з прикладами коду, згаданими в цьому блозі, ви можете переглянути весь код у моєму репозиторії на GitHub: CODE
Я буду радий поспілкуватися з вами і почути вашу думку! Слідкуйте за мною на Medium для більше матеріалів з інженерії даних та машинного навчання.
Соціальні мережі: LinkedIn | Twitter | GitHub | Hashnode
Перекладено з: Art of Feature Engineering