พื้นหลัง
คำชี้แจงปัญหา
วัตถุประสงค์
ขอบเขต
กำลังโหลดและเตรียมรูปภาพ
การจัดรูปแบบและการแปลงรูปภาพ
การสกัดและการเลือกคุณสมบัติ
การถดถอยโลจิสติก
การวิเคราะห์จำแนกเชิงเส้น
K เพื่อนบ้านที่ใกล้ที่สุด
ต้นไม้แห่งการตัดสินใจ
ป่าสุ่ม
นาอิฟ เบย์ส
รองรับเครื่องเวกเตอร์
ตัวชี้วัดความแม่นยำและประสิทธิภาพ
การเปรียบเทียบโมเดลการเรียนรู้ของเครื่อง
ข้อจำกัดและความท้าทาย
สรุปความสำเร็จ
ผลงานและความสำคัญ
การทำงานในอนาคตและการปรับปรุง
โรคพืชเป็นภัยคุกคามที่สำคัญต่อผลผลิตทางการเกษตร นำไปสู่การสูญเสียผลผลิตและความยากลำบากทางเศรษฐกิจสำหรับเกษตรกร การตรวจหาโรคพืชอย่างทันท่วงทีและแม่นยำเป็นสิ่งสำคัญสำหรับการดำเนินกลยุทธ์การจัดการโรคที่มีประสิทธิผลและลดความเสียหายของพืชผลให้เหลือน้อยที่สุด วิธีการวินิจฉัยโรคด้วยตนเองแบบดั้งเดิมอาจใช้เวลานาน เป็นส่วนตัว และเกิดข้อผิดพลาดได้ง่าย ดังนั้น การบูรณาการเทคโนโลยี เช่น การเรียนรู้ของเครื่องและการประมวลผลภาพ จึงกลายเป็นแนวทางที่น่าหวังในการทำให้การตรวจจับโรคพืชเป็นอัตโนมัติและเพิ่มประสิทธิภาพ
วัตถุประสงค์หลักของโครงการนี้คือการพัฒนาระบบตรวจจับโรคพืชโดยใช้อัลกอริธึมการเรียนรู้ของเครื่องและเทคนิคการประมวลผลภาพ ระบบนี้มีจุดมุ่งหมายเพื่อจำแนกใบพืชว่ามีสุขภาพดีหรือเป็นโรคได้อย่างแม่นยำโดยการวิเคราะห์ภาพดิจิทัลของใบไม้ ด้วยการทำให้กระบวนการตรวจจับเป็นอัตโนมัติ เกษตรกรและผู้เชี่ยวชาญด้านการเกษตรสามารถระบุและจัดการกับโรคพืชได้ทันที ช่วยให้สามารถแทรกแซงได้ทันท่วงทีและเพิ่มประสิทธิภาพแนวทางการจัดการพืชผล
วัตถุประสงค์หลักของโครงการนี้มีดังนี้
พัฒนาระบบตรวจจับโรคพืชที่แข็งแกร่งและแม่นยำ
ใช้อัลกอริธึมการเรียนรู้ของเครื่องเพื่อการจำแนกใบพืชแบบอัตโนมัติ
ใช้เทคนิคการประมวลผลภาพเพื่อแยกคุณลักษณะที่เกี่ยวข้องออกจากภาพใบไม้
ประเมินประสิทธิภาพและความแม่นยำของโมเดลการเรียนรู้ของเครื่องต่างๆ
จัดให้มีอินเทอร์เฟซที่เป็นมิตรต่อผู้ใช้เพื่อการโต้ตอบกับระบบที่ง่ายดายและเป็นธรรมชาติ
โครงงานนี้เน้นการตรวจหาโรคพืชโดยเฉพาะในใบแอปเปิล ชุดข้อมูลที่ใช้สำหรับการฝึกอบรมและทดสอบแบบจำลองได้มาจากชุดข้อมูล Plant-Village ซึ่งมีรูปภาพใบและใบแอปเปิลที่มีสุขภาพดีซึ่งได้รับผลกระทบจากโรคต่างๆ เช่น ตกสะเก็ดของแอปเปิ้ล โรคเน่าดำ และสนิมของแอปเปิ้ลซีดาร์ โดยระบบมีเป้าหมายเพื่อให้เกิดความแม่นยำสูงใน การจำแนกโรคและเป็นเครื่องมือที่เป็นประโยชน์สำหรับเกษตรกรและผู้เชี่ยวชาญด้านการเกษตรในการระบุและจัดการโรคพืชอย่างมีประสิทธิภาพ โครงการนี้ไม่ครอบคลุมถึงการตรวจจับโรคแบบเรียลไทม์ในภาคสนาม หรือการบูรณาการอุปกรณ์ฮาร์ดแวร์สำหรับการรับภาพ
ชุดข้อมูลที่ใช้สำหรับระบบตรวจจับโรคพืชนี้ประกอบด้วยภาพใบแอปเปิลที่ได้รับจากชุดข้อมูลหมู่บ้านพืช ชุดข้อมูลถูกจัดออกเป็นสี่หมวดหมู่หลักซึ่งแสดงถึงคลาสต่างๆ ของสภาพใบของ Apple Apple___Apple_scab, Apple___Black_rot, Apple___Cedar_apple_rust และ Apple___healthy
Apple___Apple_scab: หมวดหมู่นี้ประกอบด้วย 630 ภาพ โดย 598 ภาพสำหรับการฝึกอบรม และ 32 ภาพสำหรับการทดสอบ
Apple___Black_rot: ชุดข้อมูลประกอบด้วย 621 รูปภาพในหมวดหมู่นี้ โดย 589 ภาพที่จัดสรรไว้สำหรับการฝึกอบรม และ 32 รูปภาพสำหรับการทดสอบ
Apple___Cedar_apple_rust: ชุดข้อมูลประกอบด้วยรูปภาพใบไม้ที่ได้รับผลกระทบจากสนิมแอปเปิ้ลซีดาร์ 275 รูป โดยรูปภาพ 261 รูปใช้สำหรับการฝึก และ 14 รูปสำหรับการทดสอบ
Apple___healthy: หมวดหมู่นี้ประกอบด้วยรูปภาพใบแอปเปิลที่มีสุขภาพดีจำนวน 1,645 ภาพ ในจำนวนนี้ 1,562 ภาพถูกกำหนดไว้สำหรับการฝึกอบรม และ 83 ภาพถูกสงวนไว้สำหรับการทดสอบ
ภาพการฝึกอบรมใช้เพื่อสอนโมเดลการเรียนรู้ของเครื่องให้จดจำรูปแบบและแยกแยะระหว่างใบที่มีสุขภาพดีและใบที่เป็นโรค ภาพทดสอบใช้เพื่อประเมินประสิทธิภาพและความแม่นยำของแบบจำลองที่ผ่านการฝึกอบรมกับข้อมูลที่มองไม่เห็น ด้วยการใช้ประโยชน์จากชุดข้อมูลที่หลากหลายนี้ ระบบตรวจจับโรคพืชมีจุดมุ่งหมายเพื่อจำแนกใบแอปเปิลอย่างแม่นยำว่ามีสุขภาพดีหรือได้รับผลกระทบจากโรค เช่น สะเก็ดแอปเปิ้ล โรคเน่าดำ หรือ สนิมแอปเปิ้ลซีดาร์ องค์ประกอบของชุดข้อมูลช่วยให้ระบบเรียนรู้จากสภาพใบที่หลากหลาย และปรับปรุงความสามารถในการสรุปและระบุโรคพืชได้อย่างแม่นยำ
กำลังโหลดและเตรียมรูปภาพ
ในบริบทของโครงการตรวจหาโรคใบแอปเปิ้ล ขั้นตอนแรกคือการได้รับชุดข้อมูลที่ประกอบด้วยรูปภาพใบแอปเปิ้ลที่ได้รับผลกระทบจากโรคต่างๆ จากนั้นภาพเหล่านี้จะถูกโหลดเข้าสู่ระบบเพื่อให้สามารถเข้าถึงได้เพื่อการประมวลผลต่อไป นอกจากนี้ รูปภาพยังได้รับการจัดเตรียมโดยดำเนินการปรับแต่งที่จำเป็น เช่น การปรับขนาดให้เป็นความละเอียดที่สอดคล้องกัน การครอบตัดส่วนที่ไม่จำเป็นออก หรือการปรับการกระจายสีให้เป็นปกติ การจัดรูปแบบและการแปลงรูปภาพ เมื่อโหลดรูปภาพใบแอปเปิลแล้ว จะต้องจัดรูปแบบและแปลงเพื่อให้แน่ใจว่า ความเข้ากันได้กับขั้นตอนต่อไปของโครงการ ซึ่งเกี่ยวข้องกับการกำหนดมาตรฐานของรูปแบบภาพโดยการแปลงเป็นไฟล์ประเภทเฉพาะ เช่น JPEG หรือ PNG นอกจากนี้ อาจมีการปรับเปลี่ยนความละเอียดของพื้นที่สีหรือคุณลักษณะของรูปภาพอื่นๆ เพื่อให้มั่นใจถึงความสอดคล้องและอำนวยความสะดวกในการวิเคราะห์ที่แม่นยำ
การสกัดและการเลือกคุณสมบัติ
การสกัดลักษณะเป็นขั้นตอนสำคัญในการตรวจหาโรคในใบแอปเปิ้ล มีการใช้เทคนิคต่างๆ เพื่อแยกคุณลักษณะที่เกี่ยวข้องออกจากภาพใบไม้ เทคนิคเหล่านี้รวมถึงการวิเคราะห์พื้นผิวเพื่อจับรูปแบบเนื้อสัมผัสที่เกี่ยวข้องกับโรค การตรวจสอบสีเพื่อระบุความแปรผันที่เชื่อมโยงกับโรคเฉพาะ และศึกษารูปร่างเพื่อตรวจจับความผิดปกติในสัณฐานวิทยาของใบ ด้วยการแยกคุณสมบัติที่โดดเด่นเหล่านี้ อัลกอริธึมการเรียนรู้ของเครื่องที่ตามมาสามารถแยกแยะความแตกต่างระหว่างใบแอปเปิ้ลที่มีสุขภาพดีและใบที่เป็นโรคได้อย่างมีประสิทธิภาพ
การเลือกคุณสมบัติ
ขั้นตอนนี้เกี่ยวข้องกับการเลือกชุดย่อยของคุณลักษณะที่แยกออกมาตามความเกี่ยวข้องและอำนาจในการเลือกปฏิบัติ การเลือกคุณสมบัติจะช่วยลดมิติของชุดข้อมูลโดยกำจัดสัญญาณรบกวนหรือข้อมูลที่ซ้ำซ้อน ด้วยการเลือกคุณสมบัติที่ให้ข้อมูลมากที่สุด จึงสามารถปรับปรุงประสิทธิภาพและความแม่นยำของแบบจำลองการตรวจหาโรคได้
โครงการตรวจหาโรคใบแอปเปิ้ลใช้อัลกอริธึมการเรียนรู้ของเครื่องเพื่อพัฒนาแบบจำลองการจำแนกโรคที่มีประสิทธิภาพ มีการใช้อัลกอริธึมต่อไปนี้
การถดถอยแบบลอจิสติก: การถดถอยแบบลอจิสติกใช้เพื่อทำนายความน่าจะเป็นที่ใบแอปเปิ้ลจะมีสุขภาพดีหรือเป็นโรคโดยพิจารณาจากคุณสมบัติที่แยกออกมา
การวิเคราะห์จำแนกเชิงเส้น: การวิเคราะห์จำแนกเชิงเส้นช่วยจำแนกใบแอปเปิ้ลโดยการค้นหาการผสมผสานเชิงเส้นของคุณสมบัติที่จะแยกตัวอย่างที่มีสุขภาพดีและตัวอย่างที่เป็นโรคได้ดีที่สุด
K Nearest Neighbors (KNN): K Nearest Neighbors จำแนกใบแอปเปิ้ลโดยการเปรียบเทียบลักษณะใบกับใบของเพื่อนบ้านที่ใกล้ที่สุดในพื้นที่คุณลักษณะ
แผนผังการตัดสินใจ: แผนผังการตัดสินใจใช้ชุดเงื่อนไข if-else เพื่อจัดกลุ่มตัวอย่างตามคุณลักษณะและความสัมพันธ์ตามลำดับชั้น
Random Forest: Random Forest เป็นวิธีการเรียนรู้แบบ Ensemble ที่รวมเอาแผนผังการตัดสินใจหลายแบบเพื่อเพิ่มความแม่นยำในการจำแนกประเภท
Naïve Bayes: Naïve Bayes เป็นอัลกอริธึมความน่าจะเป็นที่คำนวณความน่าจะเป็นของใบแอปเปิ้ลที่อยู่ในกลุ่มโรคเฉพาะ
Support Vector Machine (SVM): Support Vector Machine สร้างไฮเปอร์เพลนในพื้นที่คุณสมบัติมิติสูงเพื่อแยกประเภทใบแอปเปิล
หลังจากเลือกอัลกอริธึมแมชชีนเลิร์นนิงแล้ว โมเดลจะได้รับการฝึกโดยใช้ชุดข้อมูลที่ติดป้ายกำกับซึ่งประกอบด้วยรูปภาพใบแอปเปิ้ลพร้อมป้ายกำกับโรคที่เกี่ยวข้อง โมเดลเรียนรู้ที่จะจดจำรูปแบบและความสัมพันธ์ระหว่างคุณลักษณะและคลาสของโรคในระหว่างขั้นตอนการฝึกอบรมนี้ เพื่อให้มั่นใจในความน่าเชื่อถือและลักษณะทั่วไปของแบบจำลอง กระบวนการตรวจสอบจะดำเนินการ โมเดลที่ได้รับการฝึกจะได้รับการประเมินโดยใช้ชุดข้อมูลการตรวจสอบความถูกต้องแยกต่างหากซึ่งไม่ได้ใช้ระหว่างการฝึก ซึ่งจะช่วยประเมินความสามารถของแบบจำลองในการจำแนกตัวอย่างใบแอปเปิลที่มองไม่เห็นได้อย่างแม่นยำ
เมื่อแบบจำลองได้รับการฝึกอบรมและตรวจสอบแล้ว แบบจำลองเหล่านั้นจะถูกทดสอบบนชุดข้อมูลการทดสอบแยกต่างหากซึ่งมีรูปภาพใบแอปเปิ้ลใหม่ที่มองไม่เห็น แบบจำลองทำนายระดับโรคสำหรับแต่ละตัวอย่าง และคำนวณตัวชี้วัดการประเมินประสิทธิภาพ เช่น ความแม่นยำ ความแม่นยำ การเรียกคืน และคะแนน F1 เพื่อวัดประสิทธิภาพของแบบจำลองในการตรวจหาโรค
ใน [1]:
# -----------------------------------# การแยกคุณสมบัติระดับโลก# --------- -------------------------- จาก sklearn.preprocessing นำเข้า LabelEncoder จาก sklearn.preprocessing นำเข้า MinMaxScalerimport numpy เป็น npimport mahotasimport cvimport osimport h5py# ----- ---------------# พารามิเตอร์ที่ปรับได้ # --------------------images_per_class = 800fixed_size = tuple (( 500 , 500 ))train_path = "../dataset/train"test_path = "../dataset/test"h5_train_features = "../embeddings/features/features.h5"h5_train_labels = "../embeddings/labels/labels.h5 "bins = 8##### BGR เป็น RGB ConversionIn [2]:# การแปลงแต่ละภาพเป็น RGB จาก BGR formatdef rgb_bgr(image):rgb_img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)ส่งคืน rgb_img##### การแปลง RGB เป็น HSV (Hue Saturation Value) ใน [3]:# การแปลงเป็นรูปแบบภาพ HSV จาก RGBdef bgr_hsv(rgb_img) :hsv_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2HSV)ส่งคืน hsv_img##### การแบ่งส่วนรูปภาพใน [4]:# สำหรับการแยกสีเขียวและสีน้ำตาลdef img_segmentation(rgb_img, hsv_img):lower_green = np.array([ 25 , 0 , 20 ])upper_green = np อาร์เรย์ ([ 100 , 255 , 255 ])healthy_mask = cv2.inRange(hsv_img, lower_green, upper_green)result = cv2.bitwise_and(rgb_img, rgb_img, mask=healthy_mask)lower_brown = np.array([ 10 , 0 , 10 ])upper_brown = np.array([ 30 , 255 , 255 ])disease_mask = cv2.inRange(hsv_img, lower_brown, upper_brown)disease_result = cv2.bitwise_and(rgb_img, rgb_img, mask=disease_mask)final_mask = healthy_mask + Disease_maskfinal_result = cv2.bitwise_and(rgb_img, rgb_img, mask=final_mask)return Final_result##### การกำหนดคุณลักษณะ descriptors###### 1. Hu MomentsIn [5]:# คุณลักษณะ-descriptor-1: Hu Momentsdef fd_hu_moments(image):image = cv2.cvtColor(image , cv2.COLOR_BGR2GRAY)คุณลักษณะ = cv2.HuMoments(cv2.moments(image)).flatten()return คุณลักษณะ###### 2. Haralick TexturesIn [6]:# คุณลักษณะ-descriptor-2: Haralick Texturedef fd_haralick(image):gray = cv2.cvtColor (รูปภาพ, cv2.COLOR_BGR2GRAY)haralick = mahotas.features.haralick(gray).mean(axis= 0 )ส่งคืนฮาราลิค###### 3. Color HIstogramIn [7]:# คุณลักษณะ-descriptor-3: Color Histogramdef fd_histogram(image, mask=None):image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)hist = cv2 .calcHist( [ภาพ], [ 0 , 1 , 2 ], ไม่มี, [ถังขยะ, ถังขยะ, ถังขยะ], [ 0 , 256 , 0 , 256 , 0 ,256 ] )cv2.normalize(hist, hist)return hist.flatten()##### กำลังโหลดชุดข้อมูลการฝึกอบรมใน [8]:# รับฉลากการฝึกอบรมtrain_labels = os.listdir(train_path)# เรียงลำดับฉลากการฝึกอบรมtrain_labels.sort() พิมพ์ (train_labels)# รายการว่างเพื่อเก็บเวกเตอร์คุณลักษณะและป้ายกำกับglobal_features = []labels = [] ['Apple___Apple_scab', 'Apple___Black_rot', 'Apple___Cedar_apple_rust','Apple___healthy']##### การสร้างคุณสมบัติและการฝังป้ายกำกับจากชุดข้อมูลใน [9]:# วนซ้ำโฟลเดอร์ย่อยข้อมูลการฝึกอบรมสำหรับ training_name ใน train_labels:# join เส้นทางข้อมูลการฝึกอบรมและโฟลเดอร์การฝึกอบรมแต่ละสายพันธุ์ img_dir_path = os.path.join(train_path, training_name)# get การฝึกอบรมปัจจุบัน labelcurrent_label = training_name# วนซ้ำรูปภาพในแต่ละโฟลเดอร์ย่อยสำหรับ img ใน os.listdir(img_dir_path):# รับไฟล์รูปภาพ namefile = os.path.join(img_dir_path, img)# อ่านรูปภาพและปรับขนาดเป็น a fixed-sizeimage = cv2.imread(file)image = cv2.resize(image,fixed_size)# Running Function Bit By BitRGB_BGR = rgb_bgr(ภาพ)BGR_HSV = bgr_hsv(RGB_BGR)IMG_SEGMENT = img_segmentation(RGB_BGR, BGR_HSV)# เรียกใช้ตัวอธิบายคุณลักษณะทั่วโลกfv_hu_moments = fd_hu_moments(IMG_SEGMENT)fv_haralick = fd_haralick(IMG_SEGMENT)fv_histogram = fd_histogram(IMG_SEGMENT)# เชื่อมต่อคุณสมบัติส่วนกลางglobal_feature = np.hstack([fv_histogram, fv_haralick,fv_hu_moments])# อัปเดตรายการป้ายกำกับและคุณลักษณะ vectorlabels.append(current_label)global_features.append(global_feature)print("[STATUS] โฟลเดอร์ที่ประมวลผล: {}".format(current_label))print("[STATUS] การแยกคุณสมบัติส่วนกลางเสร็จสิ้นแล้ว...") [สถานะ] โฟลเดอร์ที่ประมวลผล: Apple___Apple_scab[STATUS] โฟลเดอร์ที่ประมวลผล: Apple___Black_rot[STATUS] โฟลเดอร์ที่ประมวลผล: Apple___Cedar_apple_rust[STATUS] โฟลเดอร์ที่ประมวลผล: Apple___healthy[STATUS] เสร็จสิ้นการแยกคุณสมบัติทั่วโลกแล้ว...ใน [10]:# print(global_features)In [ 41]:# รับขนาดเวกเตอร์คุณลักษณะโดยรวมprint("[STATUS] คุณลักษณะ vector ขนาด{}".format(np.array(global_features).shape)) [สถานะ] ขนาดเวกเตอร์คุณลักษณะ (3010, 532)ใน [12]:# รับขนาดป้ายกำกับการฝึกอบรมโดยรวม# print(labels)print("[STATUS] training Labels {}".format(np.array(labels).shape )) [สถานะ] ป้ายกำกับการฝึกอบรม (3010,)
ป้ายกำกับค่าที่เข้ารหัสApple___Apple_scab 0Apple___Black_rot 1Apple___Cedar_apple_rust 2Apple___healthy 3
ใน [13]:
targetNames = np.unique (ป้ายกำกับ) le = LabelEncoder () target = le.fit_transform (ป้ายกำกับ) พิมพ์ (targetNames) พิมพ์ ("[สถานะ] ป้ายกำกับการฝึกอบรมที่เข้ารหัส ... ") ['Apple ___ Apple_scab' 'Apple ___ Black_rot' 'Apple ___ Cedar_apple_rust' ' Apple___healthy'] [สถานะ] ป้ายกำกับการฝึกอบรมเข้ารหัสแล้ว...
ใน [14]:
จาก sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=( 0 , 1 ))rescaled_features = scaler.fit_transform(global_features)print("[STATUS] คุณลักษณะเวกเตอร์ที่ทำให้เป็นมาตรฐาน...")rescaled_features[STATUS] คุณลักษณะเวกเตอร์ทำให้เป็นมาตรฐาน...ออก [14]:อาร์เรย์([[0.8974175 , 0.03450962, 0.01845123, ..., 0.02027887, 0.12693291,0.96573218], [0.89815922, 0.13025558, 0.02774864, ..., 0.02027767, 0.12692423,0.96573354], [0.56777027, 0. , 0.01540143, ..., 0.02027886, 0.12693269,0.96573218], - [0.95697685, 0.01228793, 0.00548476, ..., 0.02027886, 0.12693346,0.96573218], [0.97704002, 0.10614054, 0.03136325, ..., 0.02027885, 0.12692424,0.96573217], [0.95214074, 0.03819411, 0.03671892, ..., 0.02027886, 0.12692996,0.96573217]])print("[STATUS] ป้ายกำกับเป้าหมาย: {}".format(target))print("[STATUS] รูปร่างป้ายกำกับเป้าหมาย: {}".format(เป้าหมาย.รูปร่าง)) [สถานะ] ป้ายกำกับเป้าหมาย: [0 0 0 ... 3 3 3] [สถานะ] รูปร่างป้ายกำกับเป้าหมาย: (3010,)
ก. คุณสมบัติ
h5f_data = h5py.File(h5_train_features, "w")h5f_data.create_dataset("dataset_1", data=np.array(rescaled_features))Out[16]:<ชุดข้อมูล HDF5 "dataset_1": รูปร่าง (3010, 532), พิมพ์ "
h5f_label = h5py.File(h5_train_labels, "w")h5f_label.create_dataset("dataset_1", data=np.array(target))Out[17]:<ชุดข้อมูล HDF5 "dataset_1": รูปร่าง (3010,) พิมพ์ "< i8">ใน [43]:h5f_data.close()h5f_label.close()
# -----------------------------------# การฝึกอบรมโมเดลของเรา# --------- -------------------------- นำเข้า h5pyimport numpy เป็น npimport osimport cvimport คำเตือนจาก matplotlib นำเข้า pyplotfrom sklearn.model_selection นำเข้า train_test_split, cross_val_score จาก sklearn.model_selection นำเข้า KFold, StratifiedKFold จาก sklearn.metrics นำเข้าความสับสน_เมทริกซ์ precision_score, classification_report จาก sklearn.linear_model นำเข้า LogisticRegression จาก sklearn.tree นำเข้า DecisionTreeClassifier จาก sklearn.ensemble นำเข้า RandomForestClassifier จาก sklearn.neighbors นำเข้า KNeighborsClassifier จาก sklearn.discriminant_analysis นำเข้า Linear DiscriminantAnalysis จาก sklearn.naive_bayes นำเข้า GaussianNB จาก sklearn.svm นำเข้า SVCimport joblibwarnings.filterwarnings ("ละเว้น") # -------------------- # พารามิเตอร์ที่ปรับได้ # ---------------- ----num_trees = 100test_size = 0.seed = 9scoring = "ความแม่นยำ"# รับฉลากการฝึกอบรมtrain_labels = os.listdir(train_path)# เรียงลำดับฉลากการฝึกอบรมtrain_labels.sort()ถ้าไม่ใช่ os.path.exists(test_path):os.makedirs(test_path)# สร้างโมเดลการเรียนรู้ของเครื่องทั้งหมดmodels = []models.append(("LR", LogisticRegression(random_state=seed)))models.append(("LDA" , LinearDiscriminantAnalysis()))models.append(("KNN", KNeighborsClassifier()))models.append(("DTC", DecisionTreeClassifier(random_state=seed)))models.append(("RF", RandomForestClassifier(n_estimators=num_trees,random_state=seed)))models.append(("NB) ", GaussianNB()))models.append(("SVM", SVC(random_state=seed)))# ตัวแปรเพื่อเก็บผลลัพธ์และ Namesresults = []names = []# นำเข้าเวกเตอร์คุณลักษณะและป้ายกำกับที่ผ่านการฝึกอบรม sh5f_data = h5py.File(h5_train_features, "r")h5f_label = h5py.File(h5_train_labels, "r")global_features_string = h5f_data["dataset_1"]global_labels_string = h5f_label["dataset_1"]global_features = np.array(global_features_string)global_labels = np.array(global_labels_string)h5f_data.close()h5f_label.close()# ตรวจสอบรูปร่างของเวกเตอร์คุณลักษณะและ labelprint("[STATUS] รูปร่างคุณลักษณะ : : {}".format(global_features.shape))print("[สถานะ] รูปร่างป้ายกำกับ: {}".format(global_labels.shape))print(เริ่มการฝึกอบรม "[STATUS] ... ") พิมพ์ (global_labels, len( global_labels) เลน (global_features)) [สถานะ] มีรูปทรง: (3010, 532) [สถานะ] รูปร่างป้ายกำกับ: (3010,) [สถานะ] การฝึกเริ่มต้นแล้ว... [0 0 0 ... 3 3 3] 3010 3010
ใน [38]:
(trainDataGlobal, testDataGlobal, trainLabelsGlobal, testLabelsGlobal, ) = train_test_split(np.array(global_features), np.array(global_labels),test_size=test_size, Random_state=seed)print("[STATUS] แยกข้อมูลรถไฟและข้อมูลการทดสอบ...")print("ข้อมูลรถไฟ : {} ".format(trainDataGlobal.shape))print("ข้อมูลทดสอบ : {}".format(testDataGlobal.shape)) [สถานะ] แยกข้อมูลรถไฟและการทดสอบ...ข้อมูลรถไฟ : (2408, 532)ข้อมูลการทดสอบ : (602, 532)ใน [40]:trainDataGlobalOut[40]:array([[9.47066972e-01, 1.97577832e-02 , 5.34481987e-04, ...,2.02788613e-02, 1.26936845e-01, 9.65732178e-01], [9.67673181e-01, 4.20456024e-02, 5.76285634e-02, ...,2.02788294e-02, 1.26933581e-01, 9.65732217e-01], [9.84705756e-01, 2.97800312e-02, 1.34500344e-02, ...,2.02788553e-02, 1.26941878e-01, 9.65732187e-01], - [8.64347882e-01, 5.89053245e-02, 4.27430333e-02, ...,2.02791643e-02, 1.26961451e-01, 9.65733689e-01], [9.85818416e-01, 1.47428536e-03, 3.35008392e-03, ...,2.02767694e-02, 1.26792776e-01, 9.65732951e-01], [9.93152188e-01, 1.31020292e-03, 8.50637768e-04, ...,2.02910354e-02, 1.27475382e-01, 9.65721108e-01]])
ใน [22]:
สำหรับชื่อ โมเดลใน models:kfold = KFold(n_splits= 10 )cv_results = cross_val_score(model, trainDataGlobal, trainLabelsGlobal, cv=kfold,scoring=scoring)results.append(cv_results)names.append(name)msg = "%s : %f (%f)" % (ชื่อ, cv_results.mean(), cv_results.std())พิมพ์(msg)LR: 0.900346 (0.020452)LDA: 0.892038 (0.017931)KNN: 0.884978 (0.019588)รถเข็น: 0.886210 (0.014771)RF: 0.967191 (0.012676)หมายเหตุ: 0.839293 (0.014065)SVM: 0.885813 (0.021190)
ใน [23]:
fig = pyplot.figure()fig.suptitle("การเปรียบเทียบอัลกอริทึม Machine Learning")ax = fig.add_subplot( 111 )pyplot.boxplot(results)ax.set_xticklabels(names)pyplot.show()
จากผลลัพธ์ข้างต้น เราจะเห็นว่าโมเดล Random Forest Classifier มีความแม่นยำสูงสุดที่ 96.7% และแบบจำลอง Gaussian NB มีความแม่นยำต่ำสุดที่ 83.9%