<?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: 3-048-ณัฏฐ์พล-ทิมปทุม</title>
    <description>The latest articles on DEV Community by 3-048-ณัฏฐ์พล-ทิมปทุม (@3048_fbd).</description>
    <link>https://dev.to/3048_fbd</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%2F3029129%2Fd319645b-b719-48f9-9283-1cd1a3d9cdba.png</url>
      <title>DEV Community: 3-048-ณัฏฐ์พล-ทิมปทุม</title>
      <link>https://dev.to/3048_fbd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/3048_fbd"/>
    <language>en</language>
    <item>
      <title>Spam Mail Detection ด้วย TF-IDF และ Logistic Regression</title>
      <dc:creator>3-048-ณัฏฐ์พล-ทิมปทุม</dc:creator>
      <pubDate>Tue, 08 Apr 2025 14:49:35 +0000</pubDate>
      <link>https://dev.to/3048_fbd/spam-mail-detection-dwy-tf-idf-aela-logistic-regression-80e</link>
      <guid>https://dev.to/3048_fbd/spam-mail-detection-dwy-tf-idf-aela-logistic-regression-80e</guid>
      <description>&lt;p&gt;ในยุคสมัยที่การส่งMailเป็นอีกหนึ่งวิธีที่สำคัญในการติดต่อสื่อสาร Mail นั้นนอกจากMailที่เราควรจะได้รับจริงๆ ก็ยังมี Mail ที่เป็น Spam ซึ่งเราอาจจะไม่ต้องการได้รับด้วย ดังนั้นจาก Mail จำนวนมาก ผมจึงได้พบว่าการใช้ TF-IDF และ Logistic Regression สามารถช่วยเราจำแนกMailเหล่านั้นว่าเป็น Spam(ไม่อยากได้รับ) หรือ Ham(อยากได้รับ)ได้&lt;/p&gt;

&lt;p&gt;บทความนี้ผมจึงจะพามาดู การใช้ TF-IDF และ Logistic Regression ใน Python โดยรันผ่าน Visual Studio Code กัน ซึ่งผมได้เนื้อหา การใช้งานโค้ด และ Datasetจาก Github &lt;a href="https://github.com/Ananya01Agrawal/Spam-Mail-Detection-using-TF-IDF" rel="noopener noreferrer"&gt;Spam-Mail-Detection-using-TF-IDF&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ก่อนจะเริ่มกันผมอยากขออธิบาย TF-IDF และ Logistic Regression กันก่อน &lt;br&gt;
TF-IDF หรือ Term Frequency - Inverse Document Frequency&lt;br&gt;
เป็นเทคนิคที่ใช้ ให้ค่าน้ำหนัก กับคำแต่ละคำในเอกสาร โดยพิจารณาว่าคำนั้น&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;พบในเอกสารหนึ่งบ่อยแค่ไหน (TF - Term Frequency)&lt;/li&gt;
&lt;li&gt;พบในเอกสารทั้งหมดบ่อยแค่ไหน (IDF - Inverse Document Frequency)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;หาด้วยสูตร TF-IDF = TF × IDF&lt;br&gt;
​TF = จำนวนคำทั้งหมดในเอกสาร/จำนวนครั้งที่คำปรากฏ&lt;br&gt;
IDF = log(จำนวนเอกสารที่มีคำนั้น/จำนวนเอกสารทั้งหมด)&lt;br&gt;
ตัวอย่างเช่น คำว่า "ฟรี" มีTF(ความถี่ในการใช้) = 0.05 มีIDF(สำคัญแค่ไหน) = 0.3 ก็จะได้ TF-IDF อยู่ที่ 0.15&lt;/p&gt;

&lt;p&gt;Logistic Regression เป็น Supervised Learning Algorithm ที่ใช้สำหรับ Binary Classification (เช่น Spam vs. Not Spam) โดยทำนายค่า ความน่าจะเป็น (probability) ของแต่ละคลาส เช่น&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ความน่าจะเป็น &amp;gt; 0.5 → โมเดลทำนายว่าเป็น Spam&lt;/li&gt;
&lt;li&gt;ความน่าจะเป็น &amp;lt; 0.5 → โมเดลทำนายว่าเป็น Not Spam&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dataset ที่ผมจะนำมาใช้มาจากGithubที่กล่าวถึงไปก่อนหน้า โดยใน Dataset จะประกอบด้วย 5572 แถว แต่ละแถวประกอบด้วย 2 คอลัมน์ ดังนี้&lt;br&gt;
[, 1] &lt;strong&gt;Category&lt;/strong&gt; ประเภทของMailว่าเป็น Spamหรือไม่(Spam or Ham) &lt;br&gt;
[, 2] &lt;strong&gt;Message&lt;/strong&gt; เนื้อหาข้อความในMail&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 1: นำเข้า library ที่จำเป็น
&lt;/h2&gt;

&lt;p&gt;ตัวอย่างการนำเข้าlibrary สามารถ นำเข้าได้ตามนี้เลย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ขั้นตอนที่ 2: นำเข้าข้อมูล mail_data
&lt;/h2&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;df = pd.read_csv("mail_data.csv")
df.head()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8cqdgrpy8blnc1a9nit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8cqdgrpy8blnc1a9nit.png" alt="Image description" width="513" height="215"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 3: จัดการข้อมูล
&lt;/h2&gt;

&lt;p&gt;เริ่มจากแทนที่ข้อมูลที่เป็น null ให้เป็น null string ก่อนแล้วสร้างคอลัมน์ใหม่ category ที่เปลี่ยนข้อมูลจากคอลัมน์ที่มีอยู่ Category ที่เป็นคำอย่างSpam,Ham ให้เป็น0,1ตามลำดับ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data = df.where((pd.notnull(df)),'')
data['category'] = data['Category'].apply(lambda x: 1 if x == 'ham' else 0)
print(data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbs6p5aickm7hvsi7pi20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbs6p5aickm7hvsi7pi20.png" alt="Image description" width="742" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ลบคอลัมน์ Category เดิมที่เป็นคำออกเพื่อใช้เฉพาะคอลัมน์ใหม่ที่เป็นตัวเลขแทน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data.drop(columns=['Category'])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F38p2pmnv8w3807jrl8u9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F38p2pmnv8w3807jrl8u9.png" alt="Image description" width="543" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;แบ่งข้อมูลออกเป็นสำหรับ train และ test โดยใช้ train_test_split จาก scikit-learn&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X = data['Message']
y = data['category']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ขั้นตอนที่ 4: แปลงข้อความเป็นเวกเตอร์ TF-IDF
&lt;/h2&gt;

&lt;p&gt;ทำการเปลี่ยนข้อความใน Message ให้เป็นเวกเตอร์เพื่อใช้คำนวนหาคะแนนของ TF-IDF ของแต่ละคำ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#Transorm data into feature vectors
# Creating a TfidfVectorizer for feature extraction
feature_extraction = TfidfVectorizer(min_df=1, stop_words='english', lowercase=True)

# Transforming the training data into TF-IDF feature matrix
X_train_feature = feature_extraction.fit_transform(X_train)

# Transforming the test data using the same vectorizer as used for training data
X_test_feature = feature_extraction.transform(X_test)

# Converting the data type of training labels to integer
y_train = y_train.astype('int')

# Converting the data type of test labels to integer
y_test = y_test.astype('int')

print(X_train_feature) # each message gets score by Tfidvectorixer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F232ucwwd8dew47ixp9rr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F232ucwwd8dew47ixp9rr.png" alt="Image description" width="784" height="767"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 5: Train Model โดยใช้ Logistic Regression
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#creating the model
model = LogisticRegression()
model.fit(X_train_feature, y_train)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 6: การประเมิน
&lt;/h2&gt;

&lt;p&gt;ทำการประเมินความแม่นยำของ Model ทั้งจากข้อมูลสำหรับ train และ test&lt;/p&gt;

&lt;p&gt;การประเมินความแม่นยำจากข้อมูลสำหรับ train&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Predicting labels on the training data using the trained model
pred_on_training_data = model.predict(X_train_feature)

# Calculating accuracy on the training data by comparing predicted labels with actual labels
acc_on_training_data = accuracy_score(y_train, pred_on_training_data)

print("Accuracy on training data:",acc_on_training_data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4q2on8on4sohw1z5o7ye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4q2on8on4sohw1z5o7ye.png" alt="Image description" width="473" height="61"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;การประเมินความแม่นยำจากข้อมูลสำหรับ test&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pred_on_test_data = model.predict(X_test_feature)
acc_on_test_data = accuracy_score(y_test, pred_on_test_data)

print("Accuracy on test data:",acc_on_test_data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1tkek4jlylkkr74prt0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1tkek4jlylkkr74prt0.png" alt="Image description" width="425" height="48"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 7: ลองให้ทำนายดู
&lt;/h2&gt;

&lt;p&gt;ให้ Model ลองทำนายว่า Mailที่ใส่ไปจะเป็น Spamหรือไม่&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input_your_mail = ["Hi frnd, which is best way to avoid missunderstding wit our beloved one's?"]
input_data_features = feature_extraction.transform(input_your_mail)
prediction = model.predict(input_data_features)

if(prediction[0] == 1):
  print("Ham mail")
else:
  print("Spam mail")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zgsevf6y16kxxgqziqk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zgsevf6y16kxxgqziqk.png" alt="Image description" width="104" height="40"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ผลออกมาว่าเป็น Ham mailแสดงว่า ผลทำนายคือไม่ใช่Spam mail หรือก็คือเป็นMailที่สำคัญ&lt;/p&gt;
&lt;h2&gt;
  
  
  ตัวอย่างเพิ่มเติม
&lt;/h2&gt;

&lt;p&gt;ทีนี้ผมจะลองเปลี่ยนข้อมูลในDataset ให้เป็นภาษาไทยดู โดยในDataset จะมีทั้งหมด 245 แถวแต่ละแถวประกอบด้วย 2 คอลัมน์ ดังนี้&lt;br&gt;
[, 1] &lt;strong&gt;Category&lt;/strong&gt; ประเภทของMailว่าเป็น Spamหรือไม่(Spam or Ham) &lt;br&gt;
[, 2] &lt;strong&gt;Message&lt;/strong&gt; เนื้อหาข้อความในMailเป็นภาษาไทย&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 1: นำเข้า library ที่จำเป็น
&lt;/h2&gt;

&lt;p&gt;ตัวอย่างการนำเข้าlibrary สามารถ นำเข้าได้ตามนี้เลย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ขั้นตอนที่ 2: นำเข้าข้อมูล mail_data
&lt;/h2&gt;

&lt;p&gt;ตัวอย่างของข้อมูลได้ตามนี้เลย โดยจะเพิ่มเติมจากตัวอย่างเก่าคือ on_bad_lines="skip" ที่จะข้ามข้อความที่ไม่สามารถใช้ได้ออกไป เพราะเพื่อลดปัญหาที่จะเกิดเมื่อเป็นภาษาไทย&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("mail_data.csv ,on_bad_lines="skip")
df.head()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2emng2ah2lo82tx3xmro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2emng2ah2lo82tx3xmro.png" alt="Image description" width="524" height="219"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 3: จัดการข้อมูล
&lt;/h2&gt;

&lt;p&gt;เริ่มจากแทนที่ข้อมูลที่เป็น null ให้เป็น null string ก่อนแล้วสร้างคอลัมน์ใหม่ category ที่เปลี่ยนข้อมูลจากคอลัมน์ที่มีอยู่ Category ที่เป็นคำอย่างSpam,Ham ให้เป็น0,1ตามลำดับแบบตัวอย่างแรกเลย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data = df.where((pd.notnull(df)),'')
data['category'] = data['Category'].apply(lambda x: 1 if x == 'ham' else 0)
print(data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff39aoe8ljk4honi7i22w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff39aoe8ljk4honi7i22w.png" alt="Image description" width="735" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;แต่ผลที่ได้ออกมาเนื่องจากการที่เปลี่ยนชุดข้อมูลไปแล้ว และเพิ่มการข้ามข้อความที่ใช้ไม่ได้ใน&lt;strong&gt;ขั้นตอนที่2&lt;/strong&gt; จึงได้ข้อความที่ใช้ได้มาเพียง 215 จาก 245 แถว&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 4: แปลงข้อความเป็นเวกเตอร์ TF-IDF
&lt;/h2&gt;

&lt;p&gt;ทำการเปลี่ยนข้อความใน Message ให้เป็นเวกเตอร์เพื่อใช้คำนวนหาคะแนนของ TF-IDF ของแต่ละคำ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#Transorm data into feature vectors
# Creating a TfidfVectorizer for feature extraction
feature_extraction = TfidfVectorizer(min_df=1, stop_words='english', lowercase=True)

# Transforming the training data into TF-IDF feature matrix
X_train_feature = feature_extraction.fit_transform(X_train)

# Transforming the test data using the same vectorizer as used for training data
X_test_feature = feature_extraction.transform(X_test)

# Converting the data type of training labels to integer
y_train = y_train.astype('int')

# Converting the data type of test labels to integer
y_test = y_test.astype('int')

print(X_train_feature) # each message gets score by Tfidvectorixer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x716mh4535pnkoqrupp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x716mh4535pnkoqrupp.png" alt="Image description" width="800" height="692"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 5: Train Model โดยใช้ Logistic Regression
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#creating the model
model = LogisticRegression()
model.fit(X_train_feature, y_train)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 6: การประเมิน
&lt;/h2&gt;

&lt;p&gt;ทำการประเมินความแม่นยำของ Model ทั้งจากข้อมูลสำหรับ train และ test&lt;/p&gt;

&lt;p&gt;การประเมินความแม่นยำจากข้อมูลสำหรับ train&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Predicting labels on the training data using the trained model
pred_on_training_data = model.predict(X_train_feature)

# Calculating accuracy on the training data by comparing predicted labels with actual labels
acc_on_training_data = accuracy_score(y_train, pred_on_training_data)

print("Accuracy on training data:",acc_on_training_data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfohmg8qj5b7opom0rvh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfohmg8qj5b7opom0rvh.png" alt="Image description" width="464" height="49"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;การประเมินความแม่นยำจากข้อมูลสำหรับ test&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pred_on_test_data = model.predict(X_test_feature)
acc_on_test_data = accuracy_score(y_test, pred_on_test_data)

print("Accuracy on test data:",acc_on_test_data)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnv9f9ivw8kdouq0ega70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnv9f9ivw8kdouq0ega70.png" alt="Image description" width="416" height="42"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 7: ลองให้ทำนายดู
&lt;/h2&gt;

&lt;p&gt;ให้ Model ลองทำนายว่า Mailที่ใส่ไปจะเป็น Spamหรือไม่ โดยรอบนี้ใส่ไปเป็นภาษาไทยและเขียนให้เป็น Spam เพื่อทดสอบดู&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;input_your_mail = ["คุณได้รับรางวัลเงินสด คลิกที่นี่เพื่อรับสิทธิ์ทันที! พร้อมลุ้นรับของแถม"]
input_data_features = feature_extraction.transform(input_your_mail)
prediction = model.predict(input_data_features)

if(prediction[0] == 1):
  print("Ham mail")
else:
  print("Spam mail")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างผลที่ได้จากการรัน&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiinlxc31rrbovd6zcd2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiinlxc31rrbovd6zcd2r.png" alt="Image description" width="125" height="39"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ผลออกมาว่าเป็น Spam mailแสดงว่า ผลทำนายคือเป็นMailที่ไม่สำคัญนั่นเอง&lt;/p&gt;

&lt;h2&gt;
  
  
  สรุปผล
&lt;/h2&gt;

&lt;p&gt;สำหรับบทความนี้จากที่ผมลองตรวจจับSpam Mailด้วยวิธี TF-IDF เพื่อหาความสำคัญของแต่ละคำ และ Model จาก Logistic Regression ก็ถือว่าให้ผลการทำนายที่ดี ซึ่งสามารถลองนำไปใช้ได้จริงกับภาษาไทยด้วยถึงแม้ว่าต้นแบบจะเป็นภาษาอังกฤษ ก็ตาม ถ้าสนใจก็ลองเอาไปใช้ดูได้เลย&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;p&gt;Spam-Mail-Detection-using-TF-IDF Github:&lt;br&gt;
&lt;a href="https://github.com/Ananya01Agrawal/Spam-Mail-Detection-using-TF-IDF" rel="noopener noreferrer"&gt;https://github.com/Ananya01Agrawal/Spam-Mail-Detection-using-TF-IDF&lt;/a&gt;&lt;br&gt;
mail_data_thai.csv (ผมสร้างเองเพื่อลองใช้แบบภาษาไทย):&lt;br&gt;
&lt;a href="https://github.com/PoundPon/DummyDataset" rel="noopener noreferrer"&gt;https://github.com/PoundPon/DummyDataset&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
