مشاهده در TensorFlow.org | در Google Colab اجرا شود | مشاهده منبع در GitHub | دانلود دفترچه یادداشت |
این آموزش نحوه طبقه بندی داده های ساخت یافته را نشان می دهد (به عنوان مثال داده های جدولی در یک CSV). ما از Keras برای تعریف مدل و tf.feature_column
به عنوان پلی برای نگاشت از ستونها در CSV به ویژگیهای مورد استفاده برای آموزش مدل استفاده خواهیم کرد. این آموزش حاوی کد کاملی است برای:
- یک فایل CSV را با استفاده از Pandas بارگیری کنید.
- یک خط لوله ورودی بسازید تا ردیف ها را با استفاده از tf.data دسته بندی کرده و به هم بزنید.
- از ستونها در CSV به ویژگیهای مورد استفاده برای آموزش مدل با استفاده از ستونهای ویژگی نقشه برداری کنید.
- با استفاده از Keras یک مدل بسازید، آموزش دهید و ارزیابی کنید.
مجموعه داده
ما از نسخه ساده شده مجموعه داده PetFinder استفاده خواهیم کرد. چندین هزار ردیف در CSV وجود دارد. هر ردیف یک حیوان خانگی را توصیف می کند و هر ستون یک ویژگی را توصیف می کند. ما از این اطلاعات برای پیش بینی سرعت پذیرش حیوان خانگی استفاده خواهیم کرد.
در ادامه توضیحاتی درباره این مجموعه داده ارائه شده است. توجه داشته باشید که هر دو ستون عددی و دسته بندی وجود دارد. یک ستون متن آزاد وجود دارد که در این آموزش از آن استفاده نمی کنیم.
ستون | شرح | نوع ویژگی | نوع داده |
---|---|---|---|
تایپ کنید | نوع حیوان (سگ، گربه) | دسته بندی | رشته |
سن | سن حیوان خانگی | عددی | عدد صحیح |
نژاد 1 | نژاد اولیه حیوان خانگی | دسته بندی | رشته |
رنگ 1 | رنگ 1 حیوان خانگی | دسته بندی | رشته |
رنگ 2 | رنگ 2 حیوان خانگی | دسته بندی | رشته |
MaturitySize | اندازه در بلوغ | دسته بندی | رشته |
FurLength | طول خز | دسته بندی | رشته |
واکسینه شده | حیوان خانگی واکسینه شده است | دسته بندی | رشته |
استریل شده | حیوان خانگی عقیم شده است | دسته بندی | رشته |
سلامتی | وضعیت سلامتی | دسته بندی | رشته |
هزینه | هزینه پذیرش | عددی | عدد صحیح |
شرح | نوشتن مشخصات این حیوان خانگی | متن | رشته |
PhotoAmt | مجموع عکس های آپلود شده برای این حیوان خانگی | عددی | عدد صحیح |
سرعت پذیرش | سرعت پذیرش | طبقه بندی | عدد صحیح |
TensorFlow و کتابخانه های دیگر را وارد کنید
pip install sklearn
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import feature_column
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split
از پانداها برای ایجاد یک دیتافریم استفاده کنید
Pandas یک کتابخانه پایتون با ابزارهای مفید بسیاری برای بارگیری و کار با داده های ساخت یافته است. ما از Pandas برای دانلود مجموعه داده از یک URL، و بارگذاری آن در یک دیتافریم استفاده خواهیم کرد.
import pathlib
dataset_url = 'http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip'
csv_file = 'datasets/petfinder-mini/petfinder-mini.csv'
tf.keras.utils.get_file('petfinder_mini.zip', dataset_url,
extract=True, cache_dir='.')
dataframe = pd.read_csv(csv_file)
Downloading data from http://storage.googleapis.com/download.tensorflow.org/data/petfinder-mini.zip 1671168/1668792 [==============================] - 0s 0us/step 1679360/1668792 [==============================] - 0s 0us/step
dataframe.head()
ایجاد متغیر هدف
وظیفه در مجموعه داده اصلی پیش بینی سرعت پذیرش حیوان خانگی است (به عنوان مثال، در هفته اول، ماه اول، سه ماه اول و غیره). بیایید این را برای آموزش خود ساده کنیم. در اینجا، ما این مسئله را به یک مشکل طبقهبندی باینری تبدیل میکنیم و به سادگی پیشبینی میکنیم که آیا حیوان خانگی پذیرفته شده است یا خیر.
پس از اصلاح ستون برچسب، 0 نشان می دهد که حیوان خانگی پذیرفته نشده است، و 1 نشان می دهد که حیوان خانگی پذیرفته نشده است.
# In the original dataset "4" indicates the pet was not adopted.
dataframe['target'] = np.where(dataframe['AdoptionSpeed']==4, 0, 1)
# Drop un-used columns.
dataframe = dataframe.drop(columns=['AdoptionSpeed', 'Description'])
چارچوب داده را به قطار، اعتبارسنجی و تست تقسیم کنید
مجموعه داده ای که دانلود کردیم یک فایل CSV بود. ما این را به مجموعههای قطار، اعتبارسنجی و آزمایش تقسیم میکنیم.
train, test = train_test_split(dataframe, test_size=0.2)
train, val = train_test_split(train, test_size=0.2)
print(len(train), 'train examples')
print(len(val), 'validation examples')
print(len(test), 'test examples')
7383 train examples 1846 validation examples 2308 test examples
با استفاده از tf.data یک خط لوله ورودی ایجاد کنید
در مرحله بعد، دیتافریم ها را با tf.data قرار می دهیم. این ما را قادر میسازد تا از ستونهای ویژگی بهعنوان پلی برای نگاشت از ستونها در چارچوب داده پاندا به ویژگیهای مورد استفاده برای آموزش مدل استفاده کنیم. اگر با یک فایل CSV بسیار بزرگ کار می کردیم (بقدری بزرگ که در حافظه جا نمی شود)، از tf.data برای خواندن مستقیم آن از دیسک استفاده می کردیم. که در این آموزش پوشش داده نشده است.
# A utility method to create a tf.data dataset from a Pandas Dataframe
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
dataframe = dataframe.copy()
labels = dataframe.pop('target')
ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
if shuffle:
ds = ds.shuffle(buffer_size=len(dataframe))
ds = ds.batch(batch_size)
return ds
batch_size = 5 # A small batch sized is used for demonstration purposes
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)
خط لوله ورودی را درک کنید
اکنون که خط لوله ورودی را ایجاد کرده ایم، بیایید آن را فراخوانی کنیم تا فرمت داده هایی را که برمی گرداند ببینیم. ما از یک اندازه دسته کوچک برای خوانا نگه داشتن خروجی استفاده کرده ایم.
for feature_batch, label_batch in train_ds.take(1):
print('Every feature:', list(feature_batch.keys()))
print('A batch of ages:', feature_batch['Age'])
print('A batch of targets:', label_batch )
Every feature: ['Type', 'Age', 'Breed1', 'Gender', 'Color1', 'Color2', 'MaturitySize', 'FurLength', 'Vaccinated', 'Sterilized', 'Health', 'Fee', 'PhotoAmt'] A batch of ages: tf.Tensor([ 6 2 36 2 2], shape=(5,), dtype=int64) A batch of targets: tf.Tensor([1 1 1 1 1], shape=(5,), dtype=int64)
میتوانیم ببینیم که مجموعه داده یک فرهنگ لغت از نام ستونها (از قاب داده) را برمیگرداند که مقادیر ستونها را از ردیفهایی در قاب داده نشان میدهد.
چندین نوع ستون ویژگی را نشان دهید
TensorFlow انواع مختلفی از ستون های ویژگی را ارائه می دهد. در این بخش، انواع مختلفی از ستونهای ویژگی ایجاد میکنیم و نشان میدهیم که چگونه یک ستون را از چارچوب داده تغییر میدهند.
# We will use this batch to demonstrate several types of feature columns
example_batch = next(iter(train_ds))[0]
# A utility method to create a feature column
# and to transform a batch of data
def demo(feature_column):
feature_layer = layers.DenseFeatures(feature_column)
print(feature_layer(example_batch).numpy())
ستون های عددی
خروجی یک ستون ویژگی به ورودی مدل تبدیل می شود (با استفاده از تابع نمایشی که در بالا تعریف شده است، می توانیم دقیقاً ببینیم که هر ستون از چارچوب داده چگونه تبدیل می شود). ستون عددی ساده ترین نوع ستون است. برای نشان دادن ویژگی های با ارزش واقعی استفاده می شود. هنگام استفاده از این ستون، مدل شما مقدار ستون را بدون تغییر از چارچوب داده دریافت می کند.
photo_count = feature_column.numeric_column('PhotoAmt')
demo(photo_count)
[[2.] [4.] [4.] [1.] [2.]]
در مجموعه داده PetFinder، بیشتر ستونهای چارچوب داده طبقهبندی میشوند.
ستون های سطلی
اغلب، شما نمی خواهید یک عدد را مستقیماً به مدل وارد کنید، بلکه مقدار آن را بر اساس محدوده های عددی به دسته های مختلف تقسیم کنید. داده های خامی را در نظر بگیرید که نشان دهنده سن افراد است. به جای نمایش سن به عنوان یک ستون عددی، میتوانیم با استفاده از یک ستون سطلی ، سن را به چند سطل تقسیم کنیم. به مقادیر تک داغ زیر توجه کنید که هر ردیف با کدام محدوده سنی مطابقت دارد.
age = feature_column.numeric_column('Age')
age_buckets = feature_column.bucketized_column(age, boundaries=[1, 3, 5])
demo(age_buckets)
[[0. 0. 0. 1.] [0. 1. 0. 0.] [0. 0. 0. 1.] [0. 0. 1. 0.] [0. 1. 0. 0.]]
ستون های طبقه بندی شده
در این مجموعه داده، Type به عنوان یک رشته نمایش داده می شود (به عنوان مثال 'سگ'، یا 'گربه'). ما نمی توانیم رشته ها را مستقیماً به یک مدل تغذیه کنیم. در عوض، ابتدا باید آنها را به مقادیر عددی نگاشت کنیم. ستونهای واژگان طبقهبندی راهی برای نمایش رشتهها بهعنوان یک بردار یکطرف ارائه میکنند (مثلاً مانند آنچه در بالا با سطلهای سنی دیدهاید). واژگان را می توان به عنوان یک لیست با استفاده از categorical_column_with_vocabulary_list منتقل کرد، یا از یک فایل با استفاده از categorical_column_with_vocabulary_file بارگیری کرد.
animal_type = feature_column.categorical_column_with_vocabulary_list(
'Type', ['Cat', 'Dog'])
animal_type_one_hot = feature_column.indicator_column(animal_type)
demo(animal_type_one_hot)
[[1. 0.] [1. 0.] [1. 0.] [1. 0.] [0. 1.]]
تعبیه ستون ها
فرض کنید به جای داشتن چند رشته ممکن، هزاران (یا بیشتر) مقدار در هر دسته داریم. بنا به دلایلی، با افزایش تعداد دستهها، آموزش شبکه عصبی با استفاده از رمزگذاریهای تک داغ غیرممکن میشود. برای غلبه بر این محدودیت می توانیم از یک ستون جاسازی استفاده کنیم. به جای نمایش دادهها بهعنوان یک بردار یکجانبه با ابعاد مختلف، یک ستون تعبیهشده آن دادهها را بهعنوان یک بردار کمبعد و متراکم نشان میدهد که در آن هر سلول میتواند شامل هر عددی باشد، نه فقط 0 یا 1. اندازه جاسازی ( 8، در مثال زیر) پارامتری است که باید تنظیم شود.
# Notice the input to the embedding column is the categorical column
# we previously created
breed1 = feature_column.categorical_column_with_vocabulary_list(
'Breed1', dataframe.Breed1.unique())
breed1_embedding = feature_column.embedding_column(breed1, dimension=8)
demo(breed1_embedding)
[[-0.22380038 -0.09379731 0.21349265 0.33451992 -0.49730566 0.05174963 0.2668497 0.27391028] [-0.5484653 -0.03492585 0.05648395 -0.09792244 0.02530896 -0.15477926 -0.10695003 -0.45474145] [-0.22380038 -0.09379731 0.21349265 0.33451992 -0.49730566 0.05174963 0.2668497 0.27391028] [ 0.10050306 0.43513173 0.375823 0.5652766 0.40925583 -0.03928828 0.4901914 0.20637617] [-0.2319875 -0.21874283 0.12272807 0.33345345 -0.4563055 0.21609035 -0.2410521 0.4736915 ]]
ستون های ویژگی هش شده
راه دیگر برای نشان دادن یک ستون دسته بندی با تعداد زیادی مقادیر، استفاده از categorical_column_with_hash_bucket است. این ستون ویژگی یک مقدار هش ورودی را محاسبه می کند، سپس یکی از سطل های hash_bucket_size
را برای رمزگذاری رشته انتخاب می کند. هنگام استفاده از این ستون، نیازی به ارائه واژگان ندارید، و می توانید برای صرفه جویی در فضا، تعداد hash_buckets را به میزان قابل توجهی از تعداد دسته های واقعی کوچکتر کنید.
breed1_hashed = feature_column.categorical_column_with_hash_bucket(
'Breed1', hash_bucket_size=10)
demo(feature_column.indicator_column(breed1_hashed))
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.] [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.] [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]]
ستون های ویژگی متقاطع
ترکیب ویژگیها در یک ویژگی واحد، که بیشتر به عنوان تلاقی ویژگیها شناخته میشود، یک مدل را قادر میسازد تا وزنهای جداگانه برای هر ترکیبی از ویژگیها را یاد بگیرد. در اینجا، ما یک ویژگی جدید ایجاد خواهیم کرد که متقاطع سن و نوع است. توجه داشته باشید که crossed_column
جدول کامل همه ترکیبهای ممکن را (که میتواند بسیار بزرگ باشد) نمیسازد. در عوض، توسط یک hashed_column
، بنابراین میتوانید انتخاب کنید که جدول چقدر بزرگ باشد.
crossed_feature = feature_column.crossed_column([age_buckets, animal_type], hash_bucket_size=10)
demo(feature_column.indicator_column(crossed_feature))
[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]
انتخاب کنید از کدام ستون استفاده کنید
ما نحوه استفاده از چندین نوع ستون ویژگی را دیده ایم. اکنون از آنها برای آموزش یک مدل استفاده خواهیم کرد. هدف از این آموزش این است که کد کامل (مثلاً مکانیک) مورد نیاز برای کار با ستون های ویژگی را به شما نشان دهد. ما چند ستون را برای آموزش مدل خود در زیر به صورت دلخواه انتخاب کرده ایم.
feature_columns = []
# numeric cols
for header in ['PhotoAmt', 'Fee', 'Age']:
feature_columns.append(feature_column.numeric_column(header))
# bucketized cols
age = feature_column.numeric_column('Age')
age_buckets = feature_column.bucketized_column(age, boundaries=[1, 2, 3, 4, 5])
feature_columns.append(age_buckets)
# indicator_columns
indicator_column_names = ['Type', 'Color1', 'Color2', 'Gender', 'MaturitySize',
'FurLength', 'Vaccinated', 'Sterilized', 'Health']
for col_name in indicator_column_names:
categorical_column = feature_column.categorical_column_with_vocabulary_list(
col_name, dataframe[col_name].unique())
indicator_column = feature_column.indicator_column(categorical_column)
feature_columns.append(indicator_column)
# embedding columns
breed1 = feature_column.categorical_column_with_vocabulary_list(
'Breed1', dataframe.Breed1.unique())
breed1_embedding = feature_column.embedding_column(breed1, dimension=8)
feature_columns.append(breed1_embedding)
# crossed columns
age_type_feature = feature_column.crossed_column([age_buckets, animal_type], hash_bucket_size=100)
feature_columns.append(feature_column.indicator_column(age_type_feature))
یک لایه ویژگی ایجاد کنید
اکنون که ستون های ویژگی خود را تعریف کرده ایم، از یک لایه DenseFeatures برای وارد کردن آنها به مدل Keras خود استفاده می کنیم.
feature_layer = tf.keras.layers.DenseFeatures(feature_columns)
پیش از این، ما از یک اندازه دسته کوچک برای نشان دادن نحوه عملکرد ستون های ویژگی استفاده می کردیم. ما یک خط لوله ورودی جدید با اندازه دسته بزرگتر ایجاد می کنیم.
batch_size = 32
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)
مدل را ایجاد، کامپایل و آموزش دهید
model = tf.keras.Sequential([
feature_layer,
layers.Dense(128, activation='relu'),
layers.Dense(128, activation='relu'),
layers.Dropout(.1),
layers.Dense(1)
])
model.compile(optimizer='adam',
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(train_ds,
validation_data=val_ds,
epochs=10)
Epoch 1/10 WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor. Received: inputs={'Type': <tf.Tensor 'IteratorGetNext:11' shape=(None,) dtype=string>, 'Age': <tf.Tensor 'IteratorGetNext:0' shape=(None,) dtype=int64>, 'Breed1': <tf.Tensor 'IteratorGetNext:1' shape=(None,) dtype=string>, 'Gender': <tf.Tensor 'IteratorGetNext:6' shape=(None,) dtype=string>, 'Color1': <tf.Tensor 'IteratorGetNext:2' shape=(None,) dtype=string>, 'Color2': <tf.Tensor 'IteratorGetNext:3' shape=(None,) dtype=string>, 'MaturitySize': <tf.Tensor 'IteratorGetNext:8' shape=(None,) dtype=string>, 'FurLength': <tf.Tensor 'IteratorGetNext:5' shape=(None,) dtype=string>, 'Vaccinated': <tf.Tensor 'IteratorGetNext:12' shape=(None,) dtype=string>, 'Sterilized': <tf.Tensor 'IteratorGetNext:10' shape=(None,) dtype=string>, 'Health': <tf.Tensor 'IteratorGetNext:7' shape=(None,) dtype=string>, 'Fee': <tf.Tensor 'IteratorGetNext:4' shape=(None,) dtype=int64>, 'PhotoAmt': <tf.Tensor 'IteratorGetNext:9' shape=(None,) dtype=int64>}. Consider rewriting this model with the Functional API. WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor. Received: inputs={'Type': <tf.Tensor 'IteratorGetNext:11' shape=(None,) dtype=string>, 'Age': <tf.Tensor 'IteratorGetNext:0' shape=(None,) dtype=int64>, 'Breed1': <tf.Tensor 'IteratorGetNext:1' shape=(None,) dtype=string>, 'Gender': <tf.Tensor 'IteratorGetNext:6' shape=(None,) dtype=string>, 'Color1': <tf.Tensor 'IteratorGetNext:2' shape=(None,) dtype=string>, 'Color2': <tf.Tensor 'IteratorGetNext:3' shape=(None,) dtype=string>, 'MaturitySize': <tf.Tensor 'IteratorGetNext:8' shape=(None,) dtype=string>, 'FurLength': <tf.Tensor 'IteratorGetNext:5' shape=(None,) dtype=string>, 'Vaccinated': <tf.Tensor 'IteratorGetNext:12' shape=(None,) dtype=string>, 'Sterilized': <tf.Tensor 'IteratorGetNext:10' shape=(None,) dtype=string>, 'Health': <tf.Tensor 'IteratorGetNext:7' shape=(None,) dtype=string>, 'Fee': <tf.Tensor 'IteratorGetNext:4' shape=(None,) dtype=int64>, 'PhotoAmt': <tf.Tensor 'IteratorGetNext:9' shape=(None,) dtype=int64>}. Consider rewriting this model with the Functional API. 231/231 [==============================] - ETA: 0s - loss: 0.6759 - accuracy: 0.6802WARNING:tensorflow:Layers in a Sequential model should only have a single input tensor. Received: inputs={'Type': <tf.Tensor 'IteratorGetNext:11' shape=(None,) dtype=string>, 'Age': <tf.Tensor 'IteratorGetNext:0' shape=(None,) dtype=int64>, 'Breed1': <tf.Tensor 'IteratorGetNext:1' shape=(None,) dtype=string>, 'Gender': <tf.Tensor 'IteratorGetNext:6' shape=(None,) dtype=string>, 'Color1': <tf.Tensor 'IteratorGetNext:2' shape=(None,) dtype=string>, 'Color2': <tf.Tensor 'IteratorGetNext:3' shape=(None,) dtype=string>, 'MaturitySize': <tf.Tensor 'IteratorGetNext:8' shape=(None,) dtype=string>, 'FurLength': <tf.Tensor 'IteratorGetNext:5' shape=(None,) dtype=string>, 'Vaccinated': <tf.Tensor 'IteratorGetNext:12' shape=(None,) dtype=string>, 'Sterilized': <tf.Tensor 'IteratorGetNext:10' shape=(None,) dtype=string>, 'Health': <tf.Tensor 'IteratorGetNext:7' shape=(None,) dtype=string>, 'Fee': <tf.Tensor 'IteratorGetNext:4' shape=(None,) dtype=int64>, 'PhotoAmt': <tf.Tensor 'IteratorGetNext:9' shape=(None,) dtype=int64>}. Consider rewriting this model with the Functional API. 231/231 [==============================] - 4s 10ms/step - loss: 0.6759 - accuracy: 0.6802 - val_loss: 0.5361 - val_accuracy: 0.7351 Epoch 2/10 231/231 [==============================] - 2s 9ms/step - loss: 0.5742 - accuracy: 0.7054 - val_loss: 0.5178 - val_accuracy: 0.7411 Epoch 3/10 231/231 [==============================] - 2s 9ms/step - loss: 0.5369 - accuracy: 0.7231 - val_loss: 0.5031 - val_accuracy: 0.7438 Epoch 4/10 231/231 [==============================] - 2s 9ms/step - loss: 0.5161 - accuracy: 0.7214 - val_loss: 0.5115 - val_accuracy: 0.7259 Epoch 5/10 231/231 [==============================] - 2s 9ms/step - loss: 0.5034 - accuracy: 0.7296 - val_loss: 0.5173 - val_accuracy: 0.7237 Epoch 6/10 231/231 [==============================] - 2s 8ms/step - loss: 0.4983 - accuracy: 0.7301 - val_loss: 0.5153 - val_accuracy: 0.7254 Epoch 7/10 231/231 [==============================] - 2s 9ms/step - loss: 0.4912 - accuracy: 0.7412 - val_loss: 0.5258 - val_accuracy: 0.7010 Epoch 8/10 231/231 [==============================] - 2s 9ms/step - loss: 0.4890 - accuracy: 0.7360 - val_loss: 0.5066 - val_accuracy: 0.7221 Epoch 9/10 231/231 [==============================] - 2s 9ms/step - loss: 0.4824 - accuracy: 0.7443 - val_loss: 0.5091 - val_accuracy: 0.7481 Epoch 10/10 231/231 [==============================] - 2s 9ms/step - loss: 0.4758 - accuracy: 0.7466 - val_loss: 0.5159 - val_accuracy: 0.7492 <keras.callbacks.History at 0x7f06b52a1810>
loss, accuracy = model.evaluate(test_ds)
print("Accuracy", accuracy)
73/73 [==============================] - 0s 6ms/step - loss: 0.4812 - accuracy: 0.7543 Accuracy 0.7543327808380127
مراحل بعدی
بهترین راه برای کسب اطلاعات بیشتر در مورد طبقه بندی داده های ساخت یافته این است که خودتان آن را امتحان کنید. پیشنهاد می کنیم مجموعه داده دیگری را برای کار با آن پیدا کنید و مدلی را برای طبقه بندی آن با استفاده از کدهایی شبیه به موارد بالا آموزش دهید. برای بهبود دقت، به دقت فکر کنید که کدام ویژگیها را در مدل خود بگنجانید و چگونه باید نمایش داده شوند.