64 KiB
64 KiB
Бизнес-цели для набора данных онлайн обучения
- определение уровня образования
- определение It-направления
In [1]:
import pandas as pd
# загрузка данных
df = pd.read_csv("data/students_education.csv")
# Вывод распределения количества наблюдений по меткам (классам)
from src.utils import split_stratified_into_train_val_test
display(df.Age.value_counts())
display()
data = df[["Age", "Device", "Education Level"]].copy()
df_train, df_val, df_test, y_train, y_val, y_test = split_stratified_into_train_val_test(
data, stratify_colname="Age", frac_train=0.60, frac_val=0.20, frac_test=0.20
)
display("Обучающая выборка: ", df_train.shape)
display(df_train.Age.value_counts())
display("Контрольная выборка: ", df_val.shape)
display(df_val.Age.value_counts())
display("Тестовая выборка: ", df_test.shape)
display(df_test.Age.value_counts())
In [3]:
# Применение one-hot encoding
df_encoded = pd.get_dummies(df, columns=['Education Level'], prefix='education')
# Результат
df_encoded
Out[3]:
In [5]:
# Дискретизация признака 'age'
bins = [0, 18, 23, 28]
labels = ['10-18', '19-23', '24-28']
df_encoded['age_group'] = pd.cut(df['Age'], bins=bins, labels=labels)
# Результат
df_encoded
Out[5]:
In [9]:
# Создание нового признака 'internet'
df_encoded['internet'] = df_encoded['Internet Type'] + '_' + df_encoded['Network Type']
df_encoded
Out[9]:
In [15]:
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# Создаем экземпляры масштабировщиков
minmax_scaler = MinMaxScaler()
standard_scaler = StandardScaler()
# Нормировка
df_encoded['age_normalized'] = minmax_scaler.fit_transform(df_encoded[['Age']])
# Стандартизация
df_encoded['age_standardized'] = standard_scaler.fit_transform(df_encoded[['Age']])
df_encoded
Out[15]:
In [39]:
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# Преобразование категориальных переменных в числовые
label_encoder = LabelEncoder()
df_encoded['education_College'] = label_encoder.fit_transform(df_encoded['education_College'])
df_encoded
Out[39]:
In [42]:
import pandas as pd
import numpy as np
from time import time
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.feature_selection import mutual_info_classif
# Определение данных
X = df_encoded.drop('IT Student', axis=1) # Набор признаков
y = df_encoded['IT Student'] # Целевая переменная
# Предсказательная способность
start_time = time()
model = RandomForestClassifier()
scores = cross_val_score(model, X, y, cv=5)
end_time = time()
# Надежность
bootstrap_scores = []
for _ in range(100):
sample = df_encoded.sample(frac=1, replace=True)
sample_X = sample.drop('IT Student', axis=1)
sample_y = sample['IT Student']
bootstrap_score = accuracy_score(sample_y, model.fit(sample_X, sample_y).predict(sample_X))
bootstrap_scores.append(bootstrap_score)
# Корреляция
correlations = mutual_info_classif(X, y, discrete_features='auto')
# Цельность
null_percent = df.isnull().mean() * 100
# Сборка всех метрик
quality_metrics = {
'Предсказательная способность': scores.mean(),
'Скорость вычисления (с):': end_time - start_time,
'Надежность': np.std(bootstrap_scores),
'Корреляция': correlations,
'Цельность (%)': null_percent
}
quality_metrics
Out[42]: