การวิเคราะห์และการจำแนกชุดข้อมูลเห็ดในหลาม

การแนะนำ

การจำแนกเห็ดเป็นปัญหาของแมชชีนเลิร์นนิงระดับเริ่มต้น และมีวัตถุประสงค์เพื่อจำแนกอย่างถูกต้องว่าเห็ดนั้นกินได้หรือมีพิษหรือไม่ ตามข้อกำหนดเฉพาะ เช่น รูปร่างหมวก สีหมวก สีเหงือก ฯลฯ โดยใช้ตัวแยกประเภทที่แตกต่างกัน

ในโครงการนี้ ฉันได้ใช้ตัวแยกประเภทต่อไปนี้เพื่อทำการทำนาย:-

  1. การถดถอยโลจิสติก
  2. การถดถอยโลจิสติก KNN
  3. เอสวีเอ็ม,
  4. ไร้เดียงสา เบย์ส
  5. ต้นไม้การตัดสินใจ
  6. ตัวแยกประเภทฟอเรสต์แบบสุ่ม

หากคุณต้องการดูสมุดบันทึกต้นฉบับใน Kaggle โปรดไปที่ kaggle-milindsoorya

ชุดข้อมูล

ชุดข้อมูลที่ใช้ในโปรเจ็กต์นี้ประกอบด้วยเห็ด 8124 รายการพร้อมฟีเจอร์ 23 รายการ เช่น รูปร่างหมวก พื้นผิวหมวก สีหมวก รอยฟกช้ำ กลิ่น ฯลฯ

คุณสามารถดาวน์โหลดชุดข้อมูลจาก kaggle ได้หากต้องการติดตามในเครื่อง — mushroom-dataset

ไลบรารีและแพ็คเกจ Python ที่เราจะใช้ในโครงการนี้ได้แก่:

  • นัมปี้
  • หมีแพนด้า
  • ซีบอร์น
  • Matplotlib
  • กราฟวิซ
  • Scikit-เรียนรู้

กำลังโหลดชุดข้อมูล

หากคุณใช้ kaggle การโหลดข้อมูลก็เสร็จสิ้นแล้ว คุณเพียงแค่ต้องเรียกใช้เซลล์แรก หากคุณพบว่าทำให้เกิดความสับสน คุณสามารถดูโค้ดด้านล่างได้

🎐 กรณี Kaggle

import os
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
df = pd.read_csv('/kaggle/input/mushroom-classification/mushrooms.csv')
df.head()

🎐 กรณีของ google colab

หากคุณใช้ Google Colab คุณสามารถใช้ Google Drive เพื่อโหลดข้อมูลหรืออัปโหลดข้อมูลจากพีซีของคุณ คุณเพียงแค่ต้องดาวน์โหลดชุดข้อมูลจาก kaggle และเมื่อคุณเรียกใช้โค้ด คุณก็สามารถอัปโหลดไปยัง Colab ได้ ฉันพบว่าวิธีหลังง่ายกว่าและคุณสามารถทำได้เหมือนด้านล่าง

import pandas as pd
from google.colab import files
uploaded = files.upload()
df =  pd.read_csv("./mushrooms.csv")

ฟังก์ชัน Pandas read_csv() นำเข้าไฟล์ CSV (ในกรณีของเรา 'mushrooms.csv') เป็นรูปแบบ DataFrame

นำเข้าโมดูล

import pandas as pd
import numpy as np
import os 
import matplotlib.pyplot as plt
import seaborn as sns

การตรวจสอบข้อมูล

🎈 — หากต้องการดูภาพรวมของชุดข้อมูล เราสามารถใช้เมธอด .describe()

df.describe()

เมธอด .describe() จะให้สถิติของคอลัมน์ต่างๆ แก่คุณ

  • count แสดงจำนวนการตอบกลับ
  • Unique แสดงจำนวนค่าหมวดหมู่ที่ไม่ซ้ำ
  • top แสดงค่าหมวดหมู่ที่เกิดขึ้นสูงสุด
  • freq แสดงความถี่/จำนวนค่าหมวดหมู่ที่เกิดขึ้นสูงสุด

นี่คือส่วนหนึ่งของผลลัพธ์:

🎈 — หากต้องการทราบชื่อคอลัมน์ จำนวนค่า ประเภทข้อมูล ฯลฯ เราสามารถใช้เมธอด info() ได้

# display basic info about data type
df.info()

🎈 — การใช้วิธี value_counts() เราจะเห็นว่าชุดข้อมูลมีความสมดุล

# display number of samples on each class
df['class'].value_counts()

// Output
e    4208
p    3916
Name: class, dtype: int64

🎈 — ตรวจสอบให้แน่ใจด้วยว่าไม่มีค่าว่าง

# check for null values
df.isnull().sum()

การจัดการข้อมูล

ข้อมูลมีการจัดหมวดหมู่ ดังนั้นเราจะใช้ LabelEncoder เพื่อแปลงเป็นลำดับ LabelEncoder แปลงแต่ละค่าในคอลัมน์เป็นตัวเลข

วิธีการนี้ต้องการให้คอลัมน์หมวดหมู่เป็นประเภทข้อมูล 'หมวดหมู่' ตามค่าเริ่มต้น คอลัมน์ที่ไม่ใช่ตัวเลขจะเป็นประเภทข้อมูล 'วัตถุ' จากเมธอด df.info() เราพบว่าคอลัมน์ของเราเป็นประเภทข้อมูล 'อ็อบเจ็กต์' ดังนั้นเราจะต้องเปลี่ยนประเภทเป็น 'หมวดหมู่' ก่อนที่จะใช้แนวทางนี้

df = df.astype('category')
df.dtypes

ตอนนี้เราได้แปลงคอลัมน์ให้เป็นประเภทหมวดหมู่แล้ว เราสามารถใช้ LabelEncoder เพื่อทำให้คอลัมน์อยู่ในรูปแบบที่เครื่องเข้าใจได้

# Using LabelEncoder to convert catergory values to ordinal
from sklearn.preprocessing import LabelEncoder
labelencoder=LabelEncoder()
for column in df.columns:
    df[column] = labelencoder.fit_transform(df[column])

df.head()

จากรูปด้านบน เราจะเห็นได้ว่า Veil-type มีค่าเฉพาะเพียงค่าเดียวเท่านั้น และด้วยเหตุนี้จึงไม่มีส่วนช่วยอะไรกับข้อมูล ดังนั้นเราจึงสามารถกำจัดมันได้อย่างปลอดภัย

df = df.drop(["veil-type"],axis=1)

ที่นี่ axis-1 หมายความว่าเรากำลังทิ้งทั้งคอลัมน์ (เช่น แนวตั้ง) ถ้าเป็น axis-0 เราก็จะทิ้งทั้งแถว (เช่น แนวนอน)

การเตรียมข้อมูล

เราสามารถใช้วิธี train_test_split ของ scikit-learn เพื่อสร้างข้อมูลการฝึกอบรมและการทดสอบได้

from sklearn.model_selection import train_test_split
# "class" column as numpy array.
y = df["class"].values
# All data except "class" column.
x = df.drop(["class"], axis=1).values
# Split data for train and test.
x_train, x_test, y_train, y_test = train_test_split(x,y,random_state=42,test_size=0.2)

วิธีการจำแนกประเภท

1. การจำแนกการถดถอยโลจิสติก

from sklearn.linear_model import LogisticRegression

## lr = LogisticRegression(solver="lbfgs")
lr = LogisticRegression(solver="liblinear")
lr.fit(x_train,y_train)

print("Test Accuracy: {}%".format(round(lr.score(x_test,y_test)*100,2)))

// Output

Test Accuracy: 94.65%

2. การจำแนกประเภท KNN

from sklearn.neighbors import KNeighborsClassifier

best_Kvalue = 0
best_score = 0

for i in range(1,10):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(x_train,y_train)
    if knn.score(x_test,y_test) > best_score:
        best_score = knn.score(x_train,y_train)
        best_Kvalue = i

print("""Best KNN Value: {}
Test Accuracy: {}%""".format(best_Kvalue, round(best_score*100,2)))

// Output
Test Accuracy: 94.65%

3. การจำแนกประเภท SVM

from sklearn.svm import SVC
svm = SVC(random_state=42, gamma="auto")
svm.fit(x_train,y_train)
print("Test Accuracy: {}%".format(round(svm.score(x_test,y_test)*100,2)))
// Output
Test Accuracy: 100.0%

4. การจำแนกประเภทไร้เดียงสาเบย์

from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(x_train,y_train)
print("Test Accuracy: {}%".format(round(nb.score(x_test,y_test)*100,2)))
// Output
Test Accuracy: 92.18%

5. การจำแนกแผนผังการตัดสินใจ

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(x_train,y_train)
print("Test Accuracy: {}%".format(round(dt.score(x_test,y_test)*100,2)))
// Output
Test Accuracy: 100.0%

6. การจำแนกป่าไม้แบบสุ่ม

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(x_train,y_train)
print("Test Accuracy: {}%".format(round(rf.score(x_test,y_test)*100,2)))
// Output
Test Accuracy: 100.0%

การตรวจสอบผลลัพธ์การจำแนกประเภทด้วย Confusion Matrix

ในส่วนนี้ ผมจะตรวจสอบผลลัพธ์ที่มีเมทริกซ์ความสับสนใน Logistic Regression และ KNN Classification

เมทริกซ์ความสับสนเป็นเทคนิคในการสรุปประสิทธิภาพของอัลกอริทึมการจำแนกประเภท ความแม่นยำในการจำแนกประเภทเพียงอย่างเดียวอาจทำให้เข้าใจผิดได้หากคุณมีจำนวนการสังเกตไม่เท่ากันในแต่ละคลาส หรือหากคุณมีมากกว่าสองคลาสในชุดข้อมูลของคุณ

ความแม่นยำของ Logistic Regression คือ 97.05% และ KNN's คือ 100%

from sklearn.metrics import confusion_matrix
# Linear Regression
y_pred_lr = lr.predict(x_test)
y_true_lr = y_test
cm = confusion_matrix(y_true_lr, y_pred_lr)
f, ax = plt.subplots(figsize =(5,5))
sns.heatmap(cm,annot = True,linewidths=0.5,linecolor="red",fmt = ".0f",ax=ax)
plt.xlabel("y_pred_lr")
plt.ylabel("y_true_lr")
plt.show()

# Random Forest
y_pred_rf = rf.predict(x_test)
y_true_rf = y_test
cm = confusion_matrix(y_true_rf, y_pred_rf)
f, ax = plt.subplots(figsize =(5,5))
sns.heatmap(cm,annot = True,linewidths=0.5,linecolor="red",fmt = ".0f",ax=ax)
plt.xlabel("y_pred_rf")
plt.ylabel("y_true_rf")
plt.show()

บทสรุป

จากเมทริกซ์ความสับสน เราพบว่าข้อมูลการฝึกอบรมและการทดสอบของเรามีความสมดุล

วิธีการจำแนกประเภทส่วนใหญ่มีความแม่นยำ 100% ด้วยชุดข้อมูลนี้

🎃 คุณอาจชอบ:-

🔎 ข้อมูลอ้างอิง

เข้าร่วม FAUN: เว็บไซต์💻|Podcast🎙️|Twitter🐦|Facebook👥 |อินสตาแกรม📷|กลุ่ม Facebook ส่วนตัว |กลุ่ม LinkedIn 💬| Slack 📱|Cloud Native ข่าว📰|เพิ่มเติม.

หากโพสต์นี้มีประโยชน์ โปรดคลิกปุ่มปรบมือ 👏 ด้านล่างสองสามครั้งเพื่อแสดงการสนับสนุนผู้เขียน 👇