<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Delta fare</title>
    <description>The latest articles on DEV Community by Delta fare (@farezaza).</description>
    <link>https://dev.to/farezaza</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1400604%2F4a4d7e20-3212-48a0-8241-e80b31a143e8.jpeg</url>
      <title>DEV Community: Delta fare</title>
      <link>https://dev.to/farezaza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/farezaza"/>
    <language>en</language>
    <item>
      <title>การตรวจจับข้อความสแปมใน SMS โดยใช้ TensorFlow</title>
      <dc:creator>Delta fare</dc:creator>
      <pubDate>Sun, 14 Apr 2024 06:49:39 +0000</pubDate>
      <link>https://dev.to/farezaza/kaartrwcchcchabkhkhwaamsaepmain-sms-odyaich-tensorflow-31n3</link>
      <guid>https://dev.to/farezaza/kaartrwcchcchabkhkhwaamsaepmain-sms-odyaich-tensorflow-31n3</guid>
      <description>&lt;p&gt;ในชีวิตประจำวันเราอยู่กับการใช้โทรศัพท์ติดต่อสื่อสารกัน แต่ในบางครั้งอาจจะมีมิจฉาชีพส่งข้อความเพื่อทำให้เรารำคาญ โดยเขียนข้อความหลอกให้เรากรอกข้อมูลส่วนตัวเราลงไปเช่น อีเมล์ เบอร์โทรศัพท์ หรือบัญชีธนาคาร ถ้าเราเผลอกรอกลงไปอาจจะทำให้ข้อมูลส่วนตัวรั่วไหลได้&lt;br&gt;
ในบทความนี้ เราจะนำพัฒนาระบบ Deep learning โดยใช้ TensorFlow ในการตรวจจับข้อความสแปมและวิเคราะห์ตัวชี้วัดประสิทธิภาพของโมเดล&lt;br&gt;
โดยจะใช้ dataset ที่มีข้อความ SMS และข้อความสแปมหรือ ham &lt;br&gt;
ดาวน์โหลด &lt;a href="https://www.kaggle.com/datasets/uciml/sms-spam-collection-dataset"&gt;ที่นี่&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนการทำ
&lt;/h2&gt;

&lt;p&gt;นำเข้า library ทั้งหมดเข้าไปใน Google Colab&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;โหลดชุดข้อมูลโดยใช้ฟังชั่น .read_csv() ของ pandas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;df = pd.read_csv("/content/spam.csv",encoding='latin-1')
df.head()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;โดยให้นำเข้าชุดข้อมูลที่ดาวน์โหลดไว้ อัปโหลดบน Google Colab&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwg0l90g394miwvnj3o9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwg0l90g394miwvnj3o9.png" alt="Image description" width="294" height="221"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxu8xsnfc23xk2j6tgpcn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxu8xsnfc23xk2j6tgpcn.png" alt="Image description" width="658" height="191"&gt;&lt;/a&gt;&lt;br&gt;
เมื่อโหลดข้อมูลและรันเรียบร้อย เราจะได้ตารางข้อมูลมา จะเห็นได้ว่าชุดข้อมูลประกอบด้วยคอลัมน์ที่ไม่มีชื่อ 3 คอลัมน์มีค่า null ดังนั้นเราจะลบคอลัมน์นั้นและเปลี่ยนชื่อคอลัมน์จาก v1 และ v2 เป็น label และ Text ตามลำดับ เนื่องจากตัวแปรเป้าหมายอยู่ในรูปแบบของข้อความ เราจะเข้ารหัสเป็นตัวเลขโดยใช้ฟังก์ชัน .map() ของ pandas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;df = df.drop(['Unnamed: 2','Unnamed: 3','Unnamed: 4'],axis=1)
df = df.rename(columns={'v1':'label','v2':'Text'})
df['label_enc'] = df['label'].map({'ham':0,'spam':1})
df.head()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ข้อมูลหลังจากเปลี่ยนตัวแปรแล้ว&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52h019gl213qma4azyoo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52h019gl213qma4azyoo.png" alt="Image description" width="472" height="185"&gt;&lt;/a&gt;&lt;br&gt;
ต่อไปมาดูการกระจายตัวข้อมูลทั้งสอง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sns.countplot(x=df['label'])
plt.show()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ข้อมูลประเภท ham มีจำนวนมากกว่า spam เป็นเรื่องปกติ โดยที่เรากำลังจะฝังข้อมูลในโมเดล deep learning เราไม่จำเป็นต้องสมดุลข้อมูล เราจะหาค่าเฉลี่ยของจำนวนคำในประโยคทั้งหมดในข้อมูล SMS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;avg_words_len=round(sum([len(i.split()) for i in df['Text']])/len(df['Text']))
print(avg_words_len)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์จาก code คือจำนวนคำเฉลี่ยใน SMS&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7xdfn2hocyzqk8aei6t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7xdfn2hocyzqk8aei6t.png" alt="Image description" width="41" height="26"&gt;&lt;/a&gt;&lt;br&gt;
ต่อไปหาคำที่ไม่ซ้ำทั้งหมดกัน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s = set()
for sent in df['Text']:
  for word in sent.split():
      s.add(word)
total_words_length=len(s)
print(total_words_length)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;คำที่ไม่ซ้ำมีทั้งหมด&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbpfkzcaqzemp2dp76ir.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbpfkzcaqzemp2dp76ir.png" alt="Image description" width="65" height="19"&gt;&lt;/a&gt;&lt;br&gt;
ต่อไป แบ่งข้อมูลเป็นส่วนฝึกและทดสอบโดยใช้ฟังชั่น train_test_split()&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from sklearn.model_selection import train_test_split

X, y = np.asanyarray(df['Text']), np.asanyarray(df['label_enc'])
new_df = pd.DataFrame({'Text': X, 'label': y})
X_train, X_test, y_train, y_test = train_test_split(
    new_df['Text'], new_df['label'], test_size=0.2, random_state=42)
X_train.shape, y_train.shape, X_test.shape, y_test.shape
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ข้อมูลสำหรับการฝึกและทดสอบ&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lpn2fiquux3lt1c9rr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lpn2fiquux3lt1c9rr3.png" alt="Image description" width="297" height="18"&gt;&lt;/a&gt;&lt;br&gt;
ต่อไปเราจะเริ่มสร้างโมเดลพื้นฐานก่อน จากนั้นจะเพิ่มประสิทธิภาพของโมเดลโดยใช้โมเดล deep learning เช่น การฝังข้อมูล (embeddings) และ LSTM&lt;/p&gt;

&lt;p&gt;เราจะใช้ MultinomialNB() ในการแยกข้อความที่มีลักษณะไม่ต่อเนื่องเหมือนคำพูดหรือคำในเวกเตอร์ tf-idf โดยค่า if-idf หาว่าคำนั้นเกี่ยวข้องกับเนื้อหาเราไหม&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report,accuracy_score

tfidf_vec = TfidfVectorizer().fit(X_train)
X_train_vec,X_test_vec = tfidf_vec.transform(X_train),tfidf_vec.transform(X_test)

baseline_model = MultinomialNB()
baseline_model.fit(X_train_vec,y_train)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ประสิทธิภาพของโมเดลพื้นฐาน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nb_accuracy = accuracy_score(y_test,baseline_model.predict(X_test_vec))
print(nb_accuracy)
print(classification_report(y_test, baseline_model.predict(X_test_vec)))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft64ms6t6ttkk9600ymes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft64ms6t6ttkk9600ymes.png" alt="Image description" width="432" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;การสร้างชั้นการเวกเตอร์ข้อความแบบกำหนดเอง
การสร้างชั้นการเวกเตอร์ข้อความเป็นการทำให้ข้อมูลถูกถอดรหัสเป็นตัวเลข เช่น ความถี่ของคำ Binary Term เป็นต้น
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from tensorflow.keras.layers import TextVectorization

MAXTOKENS=total_words_length
OUTPUTLEN=avg_words_len

text_vec = TextVectorization(
    max_tokens=MAXTOKENS,
    standardize='lower_and_strip_punctuation',
    output_mode='int',
    output_sequence_length=OUTPUTLEN
)
text_vec.adapt(X_train)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;โดย MAXTOKEN คือขนาดมากทุกสุดของพจนานุกรม (vocabulary)&lt;br&gt;
และ OUTPUTLEN คือความยาวที่ประโยคควรจะถูกเติมความยาว (padding) ไม่ว่าความยาวของประโยคจะเป็นอย่างไร&lt;br&gt;
ตัวอย่างประโยค โดยใช้การสร้างชั้นเวกเตอร์ข้อความ&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6l4r8c5rb4sxwbxxdb9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6l4r8c5rb4sxwbxxdb9.png" alt="Image description" width="569" height="129"&gt;&lt;/a&gt;&lt;br&gt;
ต่อไปสร้างเลเยอร์สำหรับฝังข้อมูล&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;embedding_layer = layers.Embedding(
    input_dim=MAXTOKENS,
    output_dim=128,
    embeddings_initializer='uniform',
    input_length=OUTPUTLEN
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;input_dim คือขนาดของพจนานุกรม (vocabulary)&lt;br&gt;
output_dim ขนาดของเวกเตอร์ที่คำจะถูกฝังลงไป&lt;br&gt;
input_length คือความยาวของลำดับของข้อมูลนำเข้า&lt;br&gt;
สร้างและทดสอบโมเดลแรก&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input_layer = layers.Input(shape=(1,), dtype=tf.string)
vec_layer = text_vec(input_layer)
embedding_layer_model = embedding_layer(vec_layer)
x = layers.GlobalAveragePooling1D()(embedding_layer_model)
x = layers.Flatten()(x)
x = layers.Dense(32, activation='relu')(x)
output_layer = layers.Dense(1, activation='sigmoid')(x)
model_1 = keras.Model(input_layer, output_layer)

model_1.compile(optimizer='adam', loss=keras.losses.BinaryCrossentropy(
    label_smoothing=0.5), metrics=['accuracy'])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ข้อสรุปของโมเดลแรก&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0k2f6o5mcpsiyd97unc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0k2f6o5mcpsiyd97unc.png" alt="Image description" width="547" height="493"&gt;&lt;/a&gt;&lt;br&gt;
การทดสอบโมเดลแรก&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flzmzbncjlwsvkl2bjwjb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flzmzbncjlwsvkl2bjwjb.png" alt="Image description" width="800" height="179"&gt;&lt;/a&gt;&lt;br&gt;
ตารางประวัติการทำงานโมเดลแรก&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqlg5cw9aoo2hbocsr4a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faqlg5cw9aoo2hbocsr4a.png" alt="Image description" width="540" height="472"&gt;&lt;/a&gt;&lt;br&gt;
ต่อไปสร้างฟังก์ชันช่วยสำหรับคอมไพล์, การฝึกและประเมินประสิทธิภาพของโมเดล&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from sklearn.metrics import precision_score, recall_score, f1_score

def compile_model(model):
    '''
    simply compile the model with adam optimzer
    '''
    model.compile(optimizer=keras.optimizers.Adam(),
                loss=keras.losses.BinaryCrossentropy(),
                metrics=['accuracy'])

def fit_model(model, epochs, X_train=X_train, y_train=y_train,
            X_test=X_test, y_test=y_test):
    '''
    fit the model with given epochs, train 
    and test data
    '''
    history = model.fit(X_train,
                        y_train,
                        epochs=epochs,
                        validation_data=(X_test, y_test),
                        validation_steps=int(0.2*len(X_test)))
    return history

def evaluate_model(model, X, y):
    '''
    evaluate the model and returns accuracy, 
    precision, recall and f1-score 
    '''
    y_preds = np.round(model.predict(X))
    accuracy = accuracy_score(y, y_preds)
    precision = precision_score(y, y_preds)
    recall = recall_score(y, y_preds)
    f1 = f1_score(y, y_preds)

    model_results_dict = {'accuracy': accuracy,
                        'precision': precision,
                        'recall': recall,
                        'f1-score': f1}

    return model_results_dict
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Bidirectional LSTM 
Bidirectional LSTM (Long short-term memory) ประกอบด้วย LSTMs สองตัว โดยมีหนึ่งตัวรับข้อมูลในทิศทางหนึ่งและอีกตัวหนึ่งในทิศทางอื่น โดย BiLSTMs เพิ่มประสิทธิภาพของข้อมูลที่สามารถเข้าถึงได้ให้กับเครือข่าย เพิ่มความเข้าใจของข้อความสำหรับอัลกอริทึม
สร้างโมเดลตัวที่สอง
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input_layer = layers.Input(shape=(1,), dtype=tf.string)
vec_layer = text_vec(input_layer)
embedding_layer_model = embedding_layer(vec_layer)
bi_lstm = layers.Bidirectional(layers.LSTM(
    64, activation='tanh', return_sequences=True))(embedding_layer_model)
lstm = layers.Bidirectional(layers.LSTM(64))(bi_lstm)
flatten = layers.Flatten()(lstm)
dropout = layers.Dropout(.1)(flatten)
x = layers.Dense(32, activation='relu')(dropout)
output_layer = layers.Dense(1, activation='sigmoid')(x)
model_2 = keras.Model(input_layer, output_layer)

compile_model(model_2) # compile the model
history_2 = fit_model(model_2, epochs=5) # fit the model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลทดสอบโมเดลตัวที่สอง&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp52iy4hb0ww5p7bhter.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp52iy4hb0ww5p7bhter.png" alt="Image description" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Transfer Learning ด้วย USE Encoder
Transfer learning คือการนำโมเดลอื่นมาใช้งานร่วมกับโมเดลที่เราใช้อยู่
Universal Sentence Encoder คือการแปลงข้อความเป็นเวกเตอร์ในการจำแนกประเภท ความหมาย และการประยุกต์คำ
USE สามารถโหลดได้จาก tensorflow_hub และสามารถใช้เป็นชั้นได้โดยใช้ฟังก์ชัน .kerasLayer()
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import tensorflow_hub as hub

# model with Sequential api
model_3 = keras.Sequential()

# universal-sentence-encoder layer
# directly from tfhub
use_layer = hub.KerasLayer("https://tfhub.dev/google/universal-sentence-encoder/4",
                        trainable=False,
                        input_shape=[],
                        dtype=tf.string,
                        name='USE')
model_3.add(use_layer)
model_3.add(layers.Dropout(0.2))
model_3.add(layers.Dense(64, activation=keras.activations.relu))
model_3.add(layers.Dense(1, activation=keras.activations.sigmoid))

compile_model(model_3)

history_3 = fit_model(model_3, epochs=5)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;ผลการทดสอบโมเดลที่สาม&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffxl7x148tla45jf2l0uu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffxl7x148tla45jf2l0uu.png" alt="Image description" width="800" height="220"&gt;&lt;/a&gt;&lt;br&gt;
ต่อไปทำการวิเคราะห์ประสิทธิภาพของโมเดลทั้งหมด&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;baseline_model_results = evaluate_model(baseline_model, X_test_vec, y_test)
model_1_results = evaluate_model(model_1, X_test, y_test)
model_2_results = evaluate_model(model_2, X_test, y_test)
model_3_results = evaluate_model(model_3, X_test, y_test)

total_results = pd.DataFrame({'MultinomialNB Model':baseline_model_results,
                            'Custom-Vec-Embedding Model':model_1_results,
                            'Bidirectional-LSTM Model':model_2_results,
                            'USE-Transfer learning Model':model_3_results}).transpose()

total_results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjbjd86lasixadralo4a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjbjd86lasixadralo4a.png" alt="Image description" width="523" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81v8eycdw89cwk3nkl7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F81v8eycdw89cwk3nkl7n.png" alt="Image description" width="637" height="410"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;สรุปผล&lt;/strong&gt;&lt;br&gt;
หลักจากการทดสอบโมเดลทั้งสี่แบบแล้วพบว่ามีความแม่นยำมากกว่า 96% ทั้งนี้อาจจะสังเกตยาก เนื่องจากมีความแม่นยำที่สูงและไม่มีความแตกต่าง แต่มี metric ที่มีความสำคัญที่ทำให้เราสามารถคำนวนหาประสิทธิภาพโมเดลได้ดีก็คือ f1-score เราจึงสามารถระบุได้แล้วว่าโมเดล USE-Transfer Learning มีความแม่นยำและประสิทธิภาพที่ดีสุด โดยมี f1-score ที่มากที่สุด&lt;/p&gt;

&lt;p&gt;โดยในที่นี่เป็นเพียงชุดข้อมูลเพียงชุดเดียว หากมีชุดข้อมูลที่มากหรือละเอียดกว่านี้ก็จะช่วยให้ได้ผลที่แยกอย่างได้ชัดแน่นอน :)&lt;/p&gt;

&lt;p&gt;ชุดข้อมูล&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.geeksforgeeks.org/sms-spam-detection-using-tensorflow-in-python/"&gt;https://www.geeksforgeeks.org/sms-spam-detection-using-tensorflow-in-python/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/datasets/uciml/sms-spam-collection-dataset"&gt;https://www.kaggle.com/datasets/uciml/sms-spam-collection-dataset&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>tensorflow</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
