نحوه استفاده از Sklearn’s train_test_split در پایتون (به همراه مثال)

در پایتون، train_test_split یک تابع در است model_selection ماژول کتابخانه محبوب یادگیری ماشینی scikit-learn. این تابع برای انجام مراحل تقسیم تست قطار استفاده می شود که یک مجموعه داده را به دو زیر مجموعه تقسیم می کند: یک مجموعه آموزشی و یک مجموعه تست.

train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)

در اینجا یک آموزش در مورد نحوه استفاده از train_test_split تابع.

train_test_split چیست

در Scikit-learn، train_test_split تابعی است که برای ایجاد داده های آموزشی و آزمایشی برای اندازه گیری عملکرد یک مدل استفاده می شود.

چرا از Train Test Split در یادگیری ماشین استفاده کنیم؟

در یادگیری ماشینی، ما اغلب مدل‌هایی را روی یک مجموعه داده می‌سازیم یا آموزش می‌دهیم. برای ارزیابی اینکه آیا یک مدل یادگیری ماشین مطابق انتظار عمل می کند، باید مدل را بر روی یک بخش از مجموعه داده آموزش دهیم و با دقت نقشه پیش بینی ها را با داده های دنیای واقعی مقایسه کنیم.

برای ارزیابی دقت مدل‌های یادگیری ماشین، دانشمندان داده باید مجموعه‌های داده را به دو بخش تقسیم کنند.

  • داده های آموزشی (آموزش مدل)
  • مجموعه تست (تست مدل)

آنها این کار را با استفاده از توابعی مانند تابع train_test_split از کتابخانه Scikit-learn انجام می دهند.

Train Test Split چگونه کار می کند؟

برای ارزیابی نحوه عملکرد یک مدل بر روی داده‌های دیده نشده، train_test_split داده‌ها را به یک مجموعه آموزشی و یک مجموعه آزمایشی جدا می‌کند. سپس یک مدل یادگیری ماشین (به عنوان مثال طبقه‌بندی‌کننده مانند KNN) روی مجموعه آموزشی آموزش داده می‌شود. پس از آن، یک پیش بینی بر روی مجموعه داده آموزش دیده انجام می شود. در نهایت، پیش‌بینی با داده‌های واقعی از مجموعه آزمون مقایسه می‌شود تا دقت پیش‌بینی‌ها محاسبه شود.

در اینجا نحوه استفاده از train_test_split توضیح داده شده است

نحوه استفاده از Train Test Split

  1. یک مجموعه داده را تقسیم کنید در یک مجموعه آموزشی و آزمایشی
  2. اندازه تست را ارائه دهید با پارامتر test_size
  3. یک مدل تربیت کنید در مجموعه آموزشی
  4. پیش بینی کنید در مجموعه آموزشی
  5. دقت را محاسبه کنید با معیارهایی مانند دقت یا accuracy_score

دقت در یادگیری ماشینی چیست؟

دقت معیاری است که اغلب در یادگیری ماشین برای ارزیابی عملکرد مدل استفاده می شود.

دقت نسبتی است از پیش بینی های صحیح تقسیم بر تعداد کل مشاهدات.

correct predictions / total observations

چگونه تقسیم تست قطار به محاسبه دقت کمک می کند

هنگام آموزش یادگیری ماشینی، نمی توانید دقت داده های آموزشی را ارزیابی کنید وگرنه دقت مدل خود را بیش از حد تخمین می زنید. برای ارزیابی صحیح دقت با train_test_split، مدل را به یک آموزش (به عنوان مثال 60٪) و مجموعه تست (مثلا 40٪) تقسیم می کنیم، مدل را روی زیرمجموعه اول آموزش می دهیم و عملکرد را در دومی ارزیابی می کنیم.

تقسیم تست قطار در پایتون

در پایتون، train_test_split تابعی از ماژول model_selection کتابخانه Scikit-learn است. برای تقسیم آرایه ها یا ماتریس ها به قطار تصادفی و تست زیر مجموعه استفاده می شود.

train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)

در ادامه این مقاله پارامترهای Scikit-learn train_test_split را توضیح خواهیم داد.

Scikit-Learn را نصب کنید

برای استفاده از train_test_split، اگر قبلاً آن را ندارید، باید scikit-learn را نصب کنید.

می توانید آن را با باز کردن ترمینال و استفاده از موارد زیر نصب کنید:

 $ pip install scikit-learn

واردات train_test_split

در مرحله بعد، باید آن را وارد کنید train_test_split تابع از model_selection مدول. می توانید این کار را با افزودن خط کد زیر در بالای اسکریپت خود انجام دهید:

from sklearn.model_selection import train_test_split

مجموعه داده خود را بارگیری کنید

مجموعه داده خود را با استفاده از Scikit-learn بارگیری کنید datasets ماژول و تقسیم ویژگی ها و متغیرهای هدف.

import pandas as pd
from sklearn import datasets

# Load Dataset
dataset = datasets.load_breast_cancer()
df = pd.DataFrame(dataset.data,columns=dataset.feature_names)
df['target'] = pd.Series(dataset.target)

# Define independent (features) and dependent (targets) variables
X = dataset['data']
y = dataset['target']

تقسیم تست قطار بر روی یک دیتافریم پاندا

Scikit-learn’s train_test_split ساختارهای آرایه مانند را به عنوان پارامتر می گیرد، به این معنی که یک Pandas DataFrame باید به سری pandas تبدیل شود تا به تابع منتقل شود. از این رو چرا ما گذشت dataset['data'] و dataset['target'] سری به متغیرهای X و y که هر دو دارای این ساختار آرایه مانند هستند.

به مجموعه های آموزشی و آزمایشی تقسیم می شود

استفاده کنید train_test_split برای تقسیم مجموعه داده ها به مجموعه های آموزشی و آزمایشی. ویژگی ها و اهداف X و y را به تابع و همچنین اندازه تست 30 درصدی خود منتقل کنید. Stratify برای حفظ نسبت های مشابه با مجموعه داده اولیه استفاده می شود. حالت تصادفی برای فعال کردن نتایج قابل تکرار استفاده می شود.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)

نسبت بهینه Train_test_split چیست؟

نسبت تقسیم بهینه آزمون قطار به عوامل مختلفی از جمله اندازه مجموعه داده، پیچیدگی مسئله و در دسترس بودن داده ها بستگی دارد.

اگر مجموعه داده بزرگی دارید، می توانید نسبت بیشتری را برای آزمایش بدون کاهش بیش از حد داده های آموزشی اختصاص دهید. یک گزینه رایج استفاده از تقسیم 70/30 یا 80/20 در نسبت آموزش / تست است. حتی بهتر از آن، از اعتبارسنجی متقاطع استفاده کنید.

اگر داده‌های محدودی دارید، بهتر است بخش بزرگ‌تری را به مجموعه آموزشی اختصاص دهید تا مدل بهتر یاد بگیرد. یک تقسیم 90/10 ممکن است بهتر باشد تا مطمئن شوید که داده های آموزشی کافی دارید.

یک طبقه‌بندی کننده یادگیری ماشینی را در مجموعه آموزشی آموزش دهید

یک طبقه بندی را با نصب (آموزش) KNearestNeighborsClassifier در مجموعه آموزشی انجام دهید. از متد fit() روی شی استفاده کنید و داده های X_train و y_train را به عنوان آرگومان ارسال کنید.

from sklearn.neighbors import KNeighborsClassifier

# train the model
knn = KNeighborsClassifier(n_neighbors=8)
knn.fit(X_train, y_train)

روی داده های آموزش دیده پیش بینی کنید

از متد ()predict روی شی knn استفاده کنید و داده های آرایه مانند X_test را به عنوان آرگومان به متد ارسال کنید. متد ()predict برچسب های کلاس را برای نمونه داده X_test ارائه شده پیش بینی می کند.

# Make prediction
y_pred = knn.predict(X_test)

اندازه گیری عملکرد مدل Train_test_split (دقت)

از روش score() برای برگرداندن میانگین دقت داده های تست ارائه شده و برچسب های پیش بینی شده استفاده کنید. عبور کنید X_test و y_test داده ها به روش به طوری که مدل آموزش دیده با پیش بینی X_test و مقایسه آنها با y_test داده های واقعی.

# compute accuracy of the model
knn.score(X_test, y_test)
0.9298245614035088

ماتریس سردرگمی را محاسبه کنید

در آخر، ماتریس سردرگمی را محاسبه کنید تا تعداد مثبت‌های واقعی، منفی‌های درست، مثبت‌های کاذب و منفی‌های کاذب را تجسم کنید و بینش‌هایی در مورد دقت مدل به دست آورید. از Seaborn و Matplotlib برای رسم ماتریس سردرگمی به عنوان یک نقشه حرارتی استفاده کنید.

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# Create confusion matrix
cm = confusion_matrix(y_test, y_pred)

# Visualize confusion matrix
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, cmap="Blues", fmt="d", xticklabels=dataset.target_names, yticklabels=dataset.target_names)
plt.title("Confusion Matrix")
plt.xlabel("Predicted")
plt.ylabel("True")
plt.show()

Train_test_split مثال پایتون

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix

# Load Dataset
dataset = datasets.load_breast_cancer()
df = pd.DataFrame(dataset.data, columns=dataset.feature_names)
df['target'] = pd.Series(dataset.target)

# Define independent (features) and dependent (targets) variables
X = dataset['data']
y = dataset['target']

# Split training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)

# Train the model
knn = KNeighborsClassifier(n_neighbors=8)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)

# Compute accuracy of the model
accuracy = knn.score(X_test, y_test)
print("Accuracy:", accuracy)

# Create confusion matrix
cm = confusion_matrix(y_test, y_pred)

# Visualize confusion matrix
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, cmap="Blues", fmt="d", xticklabels=dataset.target_names, yticklabels=dataset.target_names)
plt.title("Confusion Matrix")
plt.xlabel("Predicted")
plt.ylabel("True")
plt.show()

پارامترهای Train_Test_Split

تابع train_test_split را می توان با 5 پارامتر test_size، train_size، random_state، shuffle و stratify استفاده کرد.

پارامترهای train_test_split شرح گزینه ها / ارزش ها پیش فرض
اندازه_تست اندازه زیر مجموعه تست شناور (0.0 تا 1.0) یا int 0.25
اندازه_ قطار اندازه زیر مجموعه آموزشی شناور (0.0 تا 1.0) یا int هیچ یک
حالت_تصادفی بذر تصادفی برای تکرارپذیری نمونه int یا RandomState هیچ یک
بر زدن این که آیا داده‌ها قبل از تقسیم‌بندی به هم ریخته شوند یا خیر بوول درست است، واقعی
طبقه بندی کردن آرایه مانند یا هیچ. اگر نه هیچ، داده ها را به صورت طبقه بندی شده تقسیم کنید آرایه مانند یا هیچ هیچ یک

*آرایه ها در train_test_split

دنباله ای از شاخص های با طول / شکل یکسان[0].

ورودی‌های مجاز فهرست‌ها، آرایه‌های numpy، ماتریس‌های scipy-spars یا فریم‌های داده پاندا هستند.

test_size در train_test_split

که در train_test_split()، پارامتر test_size درصدی از مجموعه داده کامل را که باید به عنوان مجموعه آزمایشی استفاده شود را مشخص می کند.

float or int, default=None

اگر شناور باشد، باید بین 0.0 و 1.0 باشد و نشان دهنده نسبت مجموعه داده در تقسیم آزمایشی باشد. اگر int تعداد مطلق نمونه های آزمایشی را نشان می دهد. اگر هیچ، مقدار به مکمل اندازه قطار تنظیم می شود. اگر train_size همچنین None است، روی 0.25 تنظیم می شود.

train_size در train_test_split

که در train_test_split()، پارامتر train_size درصدی از مجموعه داده کامل را که باید به عنوان مجموعه آموزشی استفاده شود را مشخص می کند.

float or int, default=None

اگر float، باید بین 0.0 و 1.0 باشد و نشان دهنده نسبت مجموعه داده در تقسیم قطار باشد. اگر int، تعداد مطلق نمونه های قطار را نشان می دهد. اگر None،

حالت_تصادفی در train_test_split

که در train_test_split()، random_state پارامتر قبل از اعمال تقسیم، درهم‌آمیزی اعمال شده روی داده‌ها را کنترل می‌کند. عبور می کند int برای خروجی قابل تکرار در فراخوانی های چند تابع استفاده می شود.

int, RandomState instance or None, default=None

زدن در train_test_split

که در train_test_split()، shuffle پارامتر برای تعیین اینکه آیا داده ها قبل از تقسیم کردن به هم ریخته شوند یا نه استفاده می شود.

bool, default=True

اگر shuffle=False، سپس طبقه بندی باید باشد None.

طبقه بندی در train_test_split

که در train_test_split()، stratify پارامتر مجموعه داده را به گونه ای تقسیم می کند که نسبت مقادیر در نمونه با نسبت ارائه شده با این پارامتر یکسان باشد.

array-like, default=None

مزایا و معایب Train_test_split

مزایای train_test_split این است که هست ساده، اجازه می دهد تا ارزیابی میزان تعمیم یک مدل به داده های دیده نشده و اجازه می دهد تا به سرعت عملکرد مدل را تکرار و ارزیابی کنید با مقایسه نتایج در مجموعه های مختلف تست.

معایب train_test_split این است که یک خطر تطبیق بیش از حد مدل به مجموعه تست، آن را داده های موجود را برای آموزش مدل محدود می کند همانطور که برای آزمایش و تنوع را معرفی می کند در عملکرد بسته به نحوه تقسیم داده ها به مجموعه های آموزشی و آزمایشی (مثلاً درهم ریختن متفاوت = نتایج متفاوت).

جایگزینی برای تقسیم تست قطار

جایگزینی برای train_test_split تابع از اعتبارسنجی متقاطع (مانند K-Fold یا Stratified Cross-Validation) استفاده می کند. اعتبار سنجی متقابل شامل تقسیم مجموعه داده به زیر مجموعه های متعدد و تکرار بر روی هر زیر مجموعه به عنوان یک مجموعه آموزشی و آزمایشی است. با استفاده از کل مجموعه داده برای آموزش و آزمایش، ارزیابی قوی‌تری از عملکرد مدل ارائه می‌کند.

چگونه بدون Scikit-learn به مجموعه های آموزشی و آزمایشی تقسیم شویم

تقسیم داده ها به مجموعه های آموزشی و آزمایشی بدون استفاده از تابع train_test_split Scikit-learn، اما در عوض از Numpy امکان پذیر است.

import numpy as np

# Assuming your data is stored in X (features) and y (labels) arrays

# Set a random seed for reproducibility
np.random.seed(42)

# Shuffle the indices of the data
indices = np.arange(len(X))
np.random.shuffle(indices)

# Define the ratio or number of samples for the testing set
test_ratio = 0.2  # For example, using 20% of the data for testing

# Calculate the number of samples for the testing set
test_size = int(len(X) * test_ratio)

# Split the indices into training and testing sets
train_indices = indices[:-test_size]
test_indices = indices[-test_size:]

# Split the data into training and testing sets based on the indices
X_train, y_train = X[train_indices], y[train_indices]
X_test, y_test = X[test_indices], y[test_indices]

نتیجه

ما اکنون نحوه استفاده از train_test_split را در ارزیابی عملکرد مدل یادگیری ماشین پوشش داده‌ایم و پارامترهای اصلی تابع را پوشش داده‌ایم و در نهایت یک مثال پایتون با استفاده از train_test_split برای جا دادن یک مدل بر روی مجموعه داده‌های آموزشی و محاسبه دقت یک مدل ساخته‌ایم.