Като инженер по машинно обучение или практик трябва да сте участвали в състезания по машинно обучение. Понякога в Machine Learning Competition вашият алгоритъм се представя добре с данни за обучение и валидиране, но осигурява лоша производителност, когато изпратите своето решение. Една от причините за лошото представяне на модел върху невидяни данни е изтичането на данни.

Изтичането на данни е един от основните проблеми в предсказуемите модели за машинно обучение, особено за начинаещи. Изтичане на данни възниква, когато информация от тестови данни, за които трябва да предвидите изхода и да оцените производителността на модела; се използва при изграждането на модел.

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

Основна цел на всеки алгоритъм за машинно обучение е да се изгради добре обобщен модел, който работи точно върху нови, невиждани данни след монтиране на модел върху данни от влак. И така, как да разберете дали имате изтичане на данни или не? Лесен начин да разберете това е, когато вашият модел генерира прекалено висока точност.

Как да избегнем изтичане на данни?

Обикновено изтичането на данни се въвежда, докато се подготвят данни за изграждане на модел. Често подготовката на данни е основната фаза на машинното обучение. Данните с шумна, неуместна или излишна информация подвеждат резултата, като не научават желаните модели.

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

Изтичане на данни възниква, когато прилагаме тези методи за трансформация или предварителна обработка върху целия набор от данни, преди да оценим производителността на модела, където информацията за набора от данни за задържане присъства по време на обучението или монтирането на модел. Това може да доведе до подвеждащи оценки за правене на прогнози за нови невиждани данни.

Например, когато мащабираме данни с помощта на стандартния метод на мащабиране, който включва средната стойност и стандартното отклонение на данните. Когато приложите тази трансформация към целия набор от данни и след това разделите данните на обучение и тестово подмножество, информацията от тестовото подмножество ще повлияе на модела.
Тази средна стойност трябва да бъде средната стойност само на поднабора за обучение, а не на целия набор от данни.
Като позволява трансформация на целия набор от данни, моделът научава за глобалното разпределение на променливите, което води до подвеждащи оценки.

Ако се използват трансформации при обучение на модел, те също трябва да се използват върху тестови данни или данни в производствена система за ефективна производителност на модела. Но е важно тези трансформации да се научат само от данните за обучение. Тестовите данни никога не трябва да се използват за избор на модела.

Решението за избягване на изтичане на данни е да разделите данните, преди да приложите трансформации и никога да не извиквате fit върху тестовите данни. Можем да предотвратим изтичане на данни, като използваме train_test_split или методи за кръстосано потвърждение или тръбопровод за обучение на scikit.

Подходи за подготовка на данни

За да разберем правилно изтичането на данни, ще създадем набор от данни за синтетична двоична класификация с 2000 произволно генерирани проби от данни с 30 функции.

# Create a dataset
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=2000, n_features=30)

# Shape
print(X.shape, y.shape)

Този примерен код ще създаде набор от данни X от 2000 реда и 30 колони. Изходният етикет y също има 2000 реда примери с два класа 0 и 1 за всеки вход.

(2000, 30) (2000,)

След това ще оценим ефективността на модела на класификатора на k-най-близките съседи въз основа на двата подхода за разделяне на данни преди и след стъпките на предварителна обработка. Стъпките на предварителната обработка включват мащабиране на данни с помощта на стандартен скалер.

Грешен подход при изготвяне на данни

Общият подход за подготовка на данни включва

  • Обработете предварително целия набор от данни
  • Разделете данните на данни за обучение и тестове
  • Оценете ефективността на модела

И така, нека първо приложим методи за предварителна обработка, след това да разделим данните на набори от данни за обучение и тестване, преди да оценим модела.

# Importing required libraries
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

Нека стандартизираме данните с помощта на StandardScaler(), тук ще трансформираме всяка променлива на данните в диапазона от -3 и 3.

# Standardization
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

След това ще разделим данните на 70% набор от данни за обучение и 30% тестови данни, като използваме метода train_test_split.

# Split data into training and test subsets
X_train, X_test, y_train, y_test = train_test_split(X_scaled, 
                                                    y, 
                                                    test_size=0.3, 
                                                    random_state=0)

Сега ще съберем данните в алгоритъма KNeighborsClassifier с конфигурации по подразбиране.

# Fit the model
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)

След като напаснем данните в набора от данни за обучение, ние ще предвидим изхода и ще оценим ефективността на модела с помощта на accuracy_score.

# Predict the output
y_preds = knn.predict(X_test)

# Model evaluation
acc = accuracy_score(y_test, y_preds)
print("Accuracy:: %.3f" % (acc*100))

# Output: Accuracy:: 78.333

Този пример дава точност на модела от 78,333 процента. Тъй като има изтичане на данни, знаем, че моделът е грешен.

Правилният подход към подготовката на данните

За да избегнете изтичане на данни, трябва да разделите набора от данни на обучителни и тестови набори от данни, преди да приспособите трансформацията на данни към подмножества. Нормализирането на данни може да се извърши върху обучителния набор от данни, след което трансформацията може да се приложи както към обучаващи, така и към тестови подмножества.

Изтичането на данни не се ограничава до стандартния мащабер, но и до всички други трансформации от scikit learn. Не забравяйте, че fit или fit-transform се използват само за набора от данни за обучение. За да приложите трансформация върху тестови данни, трябва да използвате само метода transform.

Правилният подход за подготовка на данни включва

  • Разделете данните на данни за обучение и тестове
  • Предварително обработете данните за обучение и след това приложете трансформация върху набора от данни за обучение и тестване.
  • Оценете ефективността на модела

Следните кодови фрагменти показват правилния подход за извършване на подготовка на данни.

# Split the dataset into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

След това ще извършим нормализиране на данните за влака и след това ще ги приложим към тестови данни.

# Define scaler
scaler = StandardScaler()

# Fit transformation on train subset
scaler.fit(X_train)

# Apply transfromation on training dataset
X_train = scaler.transform(X_train)

# Apply transfromation on test dataset
X_test = scaler.transform(X_test)

Сега ще използваме класификатор, за да паснем на модела и да оценим неговото представяне на модела.

# Fit the model
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)

# Predict the output
y_preds = knn.predict(X_test)

# Model evaluation
acc = accuracy_score(y_test, y_preds)
print(“Accuracy:: %.3f” % (acc*100))

# Output: Accuracy:: 76.667

Горният пример с код генерира модел с точност от 76,667 процента, което е много по-ниско от подхода с изтичане на данни.

Точността на модела, използващ горния подход, е ниска в сравнение с модел с изтичане на данни. Но горният модел е много по-добър от високата точност на модела с изтичане на данни с грешни оценки на модела. Поради произволността на данните, изпълнението на горния код може да генерира различни резултати.

  • Тръбопровод

Тръбопроводът може да използва с разделяне на теста на влака, за да се избегне изтичане на данни. Тръбопроводът гарантира, че се използват само данни за обучение при извършване на приспособяване, а данните от теста се използват само за изчисляване на точността на модела.

Нека изградим горния knn модел, като използваме тръбопровода.

# Using pipeline
from sklearn.pipeline import make_pipeline

# Split the dataset into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# Make pipeline
pipeline = make_pipeline(StandardScaler(), KNeighborsClassifier())

# fit the model
pipeline.fit(X_train, y_train)
y_preds = pipeline.predict(X_test)

# Model evaluation
acc = accuracy_score(y_test, y_preds)
print(“Accuracy:: %.3f” % (acc*100))

Accuracy:: 76.667
  • K-кратно кръстосано валидиране

Функцията за кръстосано валидиране може да се използва с тръбопровод, за да се избегне изтичане на данни по време на модела за приспособяване. Следният пример на код оценява производителността на модела с помощта на конвейер от стандартен мащабер и класификатор, използвайки cross_val_scoreна метода за кръстосано валидиране с конфигурацията по подразбиране.

# Using cross-val-score
from sklearn.model_selection import cross_val_score

# Model evaluation using cross-validation
scores = cross_val_score(pipeline, X, y)
print(“Accuracy:: %.3f” % (scores.mean()*100))

Моделът за кръстосано валидиране има приблизителна точност от 71,500 процента. Точността на производителността на модела спада в сравнение с разделянето на теста за конвейер и влак.

Accuracy:: 71.500

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

Изтичането на данни може да бъде избегнато по време на предварителната обработка на данни чрез

  • Разделяне на данни в обучителни и тестови набори от данни преди подготовка на данни.
  • Никога не използвайте fit или fit-transform върху тестови данни.
  • Използване на scikit-learn тръбопровод за предотвратяване на изтичане на данни.

В тази статия научихте правилното прилагане на методите за подготовка на данни чрез извършване на подготовка върху данните за обучение, за да избегнете изтичане на данни. Надявам се тази статия да ви помогне да разберете изтичането на данни с неговите реализации в машинното обучение и как да го предотвратите чрез разделяне и правилно прилагане на трансформации на данни върху подмножества.

Благодарим ви, че прочетохте!