การวิเคราะห์และการจำแนกชุดข้อมูลเห็ดในหลาม
การแนะนำ
การจำแนกเห็ดเป็นปัญหาของแมชชีนเลิร์นนิงระดับเริ่มต้น และมีวัตถุประสงค์เพื่อจำแนกอย่างถูกต้องว่าเห็ดนั้นกินได้หรือมีพิษหรือไม่ ตามข้อกำหนดเฉพาะ เช่น รูปร่างหมวก สีหมวก สีเหงือก ฯลฯ โดยใช้ตัวแยกประเภทที่แตกต่างกัน
ในโครงการนี้ ฉันได้ใช้ตัวแยกประเภทต่อไปนี้เพื่อทำการทำนาย:-
- การถดถอยโลจิสติก
- การถดถอยโลจิสติก KNN
- เอสวีเอ็ม,
- ไร้เดียงสา เบย์ส
- ต้นไม้การตัดสินใจ
- ตัวแยกประเภทฟอเรสต์แบบสุ่ม
หากคุณต้องการดูสมุดบันทึกต้นฉบับใน 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% ด้วยชุดข้อมูลนี้
🎃 คุณอาจชอบ:-
- วิธีการตั้งค่า Jupyter Notebook ด้วย Python 3 บน Ubuntu 20.04
- วิธีใช้สภาพแวดล้อมเสมือนของ python กับ conda
🔎 ข้อมูลอ้างอิง
- เมทริกซ์ความสับสนในการเรียนรู้ของเครื่องคืออะไร
- การเข้ารหัสแบบหมวดหมู่โดยใช้ Label-Encoding และ One-Hot-Encoder
- การจำแนกเห็ดโดยใช้ตัวแยกประเภทที่แตกต่างกัน
เข้าร่วม FAUN: เว็บไซต์💻|Podcast🎙️|Twitter🐦|Facebook👥 |อินสตาแกรม📷|กลุ่ม Facebook ส่วนตัว |กลุ่ม LinkedIn 💬| Slack 📱|Cloud Native ข่าว📰|เพิ่มเติม.
หากโพสต์นี้มีประโยชน์ โปรดคลิกปุ่มปรบมือ 👏 ด้านล่างสองสามครั้งเพื่อแสดงการสนับสนุนผู้เขียน 👇