Lời Cam ĐoanHọ và tên các sinh viên thực hiện : Huỳnh Ngọc Giáp Triệu Võ Lê Quốc BảoTrọng Lớp : 22DDCA2 Chuyên ngành : Kỹ Thuật Điện Báo cáo đề tài : Phân loại hoa Iris dùng K-nesrest ne
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HỒ CHÍ MINH
-*** -TRÍ TUỆ NHÂN TẠO VÀ ỨNG DỤNG
T ên Đề Tài : Phân Loại Hoa Iris Dùng K-neighbors
Ngành: Kỹ Thuật Điện Lớp:22DDCA2
Giảng viên hướng dẫn : Phạm Nguyễn Nhựt Thanh
Sinh viên thực hiện : HUỲNH NGỌC GIÁP TRIỆU
Trang 2Lời Cam Đoan
Họ và tên các sinh viên thực hiện : Huỳnh Ngọc Giáp Triệu
Võ Lê Quốc BảoTrọng
Lớp : 22DDCA2
Chuyên ngành : Kỹ Thuật Điện
Báo cáo đề tài : Phân loại hoa Iris dùng K-nesrest neighbors
Chúng em xin cam đoan đây là công trình nghiên cứu của bản thân.Các kết quả nghiên cứu và các kết luận trong báo cáo là trung thực,không sao chép từ bất kỳ một nguồn nào và dưới bất kỳ hình thức nào.Trong quá trình làm chúng em có tham khảo các tài liệu liên quan nhằm khẳng định thêm sự tin cậy và cấp thiết của đề tài.Việc tham khảo các nguồn tài liệu đã được thực hiện một cách khách quan và đầy đủ trích dẫn,ghi nguồn tài liệu tham khảo đúng quy định
TP HCM , ngày tháng năm
Chữ ký các sinh viên thực hiện
Trang 3MỤC LỤC
CHƯƠNG 1 : Giới thiệu tổng quan đề tài, đặt ra bài toán, muc tiêu và giới hạn đề tài 4
1.1 Giới thiệu tổng quan về đề tài 4
1.2 Mục tiêu của đề tài 4
1.3 Giới hạn của đề tài 5
CHƯƠNG 2 : Cơ sở lý thuyết (các giải thuật sử dụng trong đề tài, phần mềm lập trình, thư viện ) 6
2.1 Giải thuật K-nearest neighbors (KNN) 6
2.2 Phần mềm lập trình và thư viện 6
CHƯƠNG 3 : Xây dựng giải thuật 9
3.1 Mô tả bài toán 9
Input: 9
1 Tải dữ liệu: 9
2 Tiền xử lý dữ liệu: 9
CHƯƠNG 4 : Kết quả và hướng phát triển (trình bày các kết quả đạt được, nhận xét về đề xuất hướng phát triển) 11
Trang 4CHƯƠNG 1 : Giới thiệu tổng quan đề tài, đặt ra bài toán, muc tiêu và
giới hạn đề tài
1.1
Giới thiệu tổng quan về đề tài
Phân loại hoa Iris là một bài toán kinh điển trong lĩnh vực học máy và khai phá dữ liệu, được sửdụng rộng rãi để minh họa các phương pháp phân loại Bộ dữ liệu Iris bao gồm thông tin về ba
loài hoa Iris khác nhau: Iris-setosa, Iris-versicolor, và Iris-virginica Dữ liệu này được mô tả bằng bốn đặc trưng chính: chiều dài và chiều rộng của đài hoa (sepal) cùng chiều dài và chiều rộng của cánh hoa (petal).
Phương pháp K-nearest neighbors (KNN) là một thuật toán đơn giản nhưng hiệu quả để giải
quyết bài toán phân loại KNN dựa trên nguyên tắc so sánh đối tượng cần phân loại với các đốitượng đã biết trong không gian đặc trưng, từ đó xác định nhãn dựa vào đa số láng giềng gầnnhất
1.2 Mục tiêu của đề tài
Áp dụng thuật toán KNN vào phân loại hoa Iris:
1 Xây dựng mô hình phân loại dựa trên dữ liệu Iris và thuật toán KNN
2 Tìm hiểu và tối ưu hóa tham số KKK (số lượng láng giềng gần nhất) để đạt hiệuquả phân loại cao nhất
Đánh giá hiệu suất mô hình:
1 Đánh giá mô hình qua các chỉ số như độ chính xác (accuracy), độ nhạy (recall),
độ đặc hiệu (specificity), và F1-score.
2 Phân tích các yếu tố ảnh hưởng đến hiệu suất phân loại, chẳng hạn như phân bố
dữ liệu và khoảng cách giữa các lớp
Cung cấp nền tảng lý thuyết và thực nghiệm:
1 Giới thiệu khái niệm cơ bản về KNN và cách hoạt động của nó trong không gian nhiều chiều
2 Triển khai thực nghiệm để kiểm chứng tính hiệu quả của KNN so với các
phương pháp khác trên cùng tập dữ liệu
1.3 Giới hạn của đề tài
Giới hạn về dữ liệu:
1 Bộ dữ liệu Iris là một tập dữ liệu nhỏ, chỉ gồm 150 mẫu (50 mẫu cho mỗi loàihoa), do đó không phản ánh được các bài toán phân loại phức tạp hơn trong thựctế
Trang 52 Các đặc trưng trong tập dữ liệu Iris khá đơn giản và phân tách tốt, dẫn đến tínhứng dụng của kết quả có thể bị hạn chế trong các bài toán với dữ liệu phức tạp hơn.
Hạn chế của phương pháp KNN:
1 KNN nhạy cảm với phân phối của dữ liệu và kích thước mẫu, dễ bị ảnh hưởng bởi
các điểm ngoại lai (outliers).
2 Chi phí tính toán cao khi áp dụng trên dữ liệu lớn do phải tính khoảng cách giữađiểm cần phân loại và tất cả các điểm trong tập huấn luyện
Phạm vi triển khai:
1 Đề tài chỉ tập trung vào một thuật toán duy nhất (KNN) và không so sánh chi tiếtvới các thuật toán phân loại khác như SVM, Decision Tree, hoặc Random Forest
2 Không đề cập sâu đến việc xử lý dữ liệu không cân bằng hoặc kỹ thuật mở rộng dữ
liệu như tăng cường dữ liệu (data augmentation).
CHƯƠNG 2 : Cơ sở lý thuyết (các giải thuật sử dụng trong đề tài,
phần mềm lập trình, thư viện )
Trang 62.1 Giải thuật K-nearest neighbors (KNN)
Nguyên tắc hoạt động: KNN là một thuật toán thuộc nhóm học máy không giám sát
(instance-based learning), hoạt động dựa trên khoảng cách giữa các điểm trong không gian đặc trưng Khi
cần phân loại một điểm mới, thuật toán sẽ:
Tính khoảng cách từ điểm đó đến tất cả các điểm trong tập huấn luyện
Chọn ra KKK điểm gần nhất (theo một tiêu chuẩn khoảng cách như Euclidean, Manhattan,hoặc Minkowski)
Phân loại điểm đó dựa trên nhãn của đa số KKK điểm láng giềng gần nhất
Ưu điểm :
- Đơn giản, dễ hiểu và dễ triển khai
- Hiệu quả trên các tập dữ liệu nhỏ với số lượng đặc trưng ít
Nhược điểm :
- Hiệu suất giảm khi dữ liệu có kích thước lớn (do tính toán khoảng cách phức tạp)
- Nhạy cảm với các điểm ngoại lai (outliers).
- Phụ thuộc vào tham số KKK và phương pháp tính khoảng cách
Anaconda: Môi trường tích hợp để quản lý các thư viện và gói phần mềm cần thiết.
Các thư viện Python sử dụng
NumPy: Hỗ trợ xử lý mảng và các phép toán ma trận hiệu quả.
Pandas: Cung cấp công cụ để xử lý và phân tích dữ liệu.
Trang 7Matplotlib và Seaborn: Thư viện trực quan hóa dữ liệu.
scikit-learn: Thư viện chính để triển khai thuật toán KNN và đánh giá hiệu suất mô hình.
Các module cụ thể:
sklearn.neighbors.KNeighborsClassifier : Triển khai thuật toán KNN
sklearn.model_selection.train_test_split : Chia dữ liệu thành tập huấn luyện và kiểm tra
sklearn.metrics: Cung cấp các công cụ đánh giá hiệu suất mô hình (accuracy, confusion matrix, F1-score)
Joblib hoặc Pickle: Lưu trữ mô hình sau khi huấn luyện (nếu cần)
from warnings import filterwarnings
Quy trình triển khai
Tiền xử lý dữ liệu:
Đọc dữ liệu Iris từ tập tin có sẵn trong thư viện scikit-learn
Chuẩn hóa dữ liệu để đảm bảo các đặc trưng có thang đo tương đồng
Xây dựng và huấn luyện mô hình:
Sử dụng KNeighbors Classifier để xây dựng mô hình KNN
Tối ưu hóa tham số KKK bằng cách thử nghiệm trên tập huấn luyện
Đánh giá mô hình:
Chạy thử nghiệm trên tập kiểm tra
Sử dụng các chỉ số đánh giá để phân tích hiệu suất của mô hình
Trực quan hóa:
Trang 8Trực quan hóa phân bố dữ liệu và kết quả phân loại.
Tối ưu hóa và thử nghiệm:
Kiểm tra ảnh hưởng của tham số khoảng cách (Euclidean, Manhattan, Minkowski).Đánh giá độ nhạy với kích thước tập dữ liệu hoặc dữ liệu bị nhiễu
Thông qua các công cụ và thư viện trên, đề tài đảm bảo cung cấp một cách tiếp cận chặt chẽ
và rõ ràng để giải quyết bài toán phân loại hoa Iris bằng thuật toán KNN
CHƯƠNG 3 : Xây dựng giải thuật
3.1
Mô tả bài toán
Trang 9Input :
Bộ dữ liệu Iris gồm 150 mẫu với 4 đặc trưng:
Chiều dài và chiều rộng của đài hoa (sepal length, sepal width).
Chiều dài và chiều rộng của cánh hoa (petal length, petal width).
Nhãn tương ứng cho 3 loài hoa: Iris-setosa, Iris-versicolor, Iris-virginica.
Số lượng láng giềng gần nhất KKK
Phương pháp tính khoảng cách
Output:
Nhãn dự đoán của các mẫu trong tập kiểm tra
Đánh giá độ chính xác và hiệu suất của mô hình
Bước 1: Thu thập và chuẩn bị dữ liệu
1 Tải dữ liệu:
Sử dụng thư viện sklearn để tải bộ dữ liệu Iris
Chia dữ liệu thành tập huấn luyện (80%) và tập kiểm tra (20%)
2 Tiền xử lý dữ liệu:
Kiểm tra dữ liệu bị thiếu hoặc nhiễu (nếu có)
Chuẩn hóa dữ liệu để đảm bảo các đặc trưng có thang đo tương đồng
Bước 2: Xây dựng mô hình K-Nearest Neighbors
Trang 10Dựa trên nhãn của KKK láng giềng, sử dụng quy tắc đa số để xác định nhãn của mẫu kiểm tra.
Bước 3: Đánh giá mô hình
Chỉ số đánh giá:
Sử dụng các chỉ số như:
Độ chính xác (Accuracy):
Confusion Matrix để phân tích chi tiết hơn.
F1-Score, Precision, Recall để đánh giá hiệu suất toàn diện.
Tìm tham số KKK tối ưu:
Sử dụng Cross-validation để thử nghiệm các giá trị KKK
Chọn KKK mang lại hiệu suất cao nhất
CHƯƠNG 4 : Kết quả và hướng phát triển (trình bày các kết quả đạt
được, nhận xét về đề xuất hướng phát triển)
# Import Packages
import numpy as np
Trang 11# Load the data
df = pd.read_csv( 'iris.data' , names=columns)
df.head()
# Some basic statistical analysis about the data
df.describe() # Đã sửa 'describes' thành 'describe'
Trang 12#Checking for null values
Trang 14! pip install seaborn
# Import các thư viện
Trang 15df = pd.read_csv( 'iris.data' , names=columns)
except FileNotFoundError:
if the file path is correct.' )
# %%
# %%
# Some basic statistical analysis about the data
df.describe() # Sửa 'describes' thành 'describe'
# %%
#Checking for null values
Trang 16l = [ 'Setosa' , 'Versicolor' , 'Virginica' ]
df_numerical = df.drop(columns=[ 'Class_label' ])
# Tính toán ma trận tương quan chỉ trên các cột số học
fig=plt.gcf()
fig.set_size_inches( 10 , )
fig=sns.heatmap(df_numerical.corr(),annot= True ,cmap= 'cubehelix' ,linewidths= 1
linecolor= 'k' ,square= True ,mask= False , vmin= -1 ,
vmax= 1 ,cbar_kws={ "orientation" : "vertical" },cbar= True )
Trang 17! pip install seaborn
# Import các thư viện
# Đảm bảo tên cột thống nhất (chú ý 'length')
columns = [ 'Sepal length' , 'Sepal width' , 'Petal length' , 'Petal width' , 'Class_label' ]
# Load the data
try:
df = pd.read_csv( 'iris.data' , names=columns)
except FileNotFoundError:
if the file path is correct.' )
Trang 18# %%
# %%
# Some basic statistical analysis about the data
df.describe() # Sửa 'describes' thành 'describe'
# %%
#Checking for null values
df_numerical = df.drop(columns=[ 'Class_label' ])
# Tính toán ma trận tương quan chỉ trên các cột số học
fig=plt.gcf()
fig.set_size_inches( 10 , )
fig=sns.heatmap(df_numerical.corr(),annot= True ,cmap= 'cubehelix' ,linewidths= 1
linecolor= 'k' ,square= True ,mask= False , vmin= -1 ,
vmax= 1 ,cbar_kws={ "orientation" : "vertical" },cbar= True )
# %%
# boxplot on each feature split out by species
#Sửa tên cột Class_labels -> Class_label
df.boxplot(by= "Class_label" ,figsize=( 10 , 10 ))
plt.show() # Thêm plt.show để hiển thị boxplot
Trang 20! pip install seaborn
# Import các thư viện
# Đảm bảo tên cột thống nhất (chú ý 'length')
columns = [ 'Sepal length' , 'Sepal width' , 'Petal length' , 'Petal width' , 'Class_label' ]
# Load the data
try:
df = pd.read_csv( 'iris.data' , names=columns)
except FileNotFoundError:
if the file path is correct.' )
Trang 21# %%
# %%
# Some basic statistical analysis about the data
df.describe() # Sửa 'describes' thành 'describe'
# %%
#Checking for null values
df_numerical = df.drop(columns=[ 'Class_label' ])
# Tính toán ma trận tương quan chỉ trên các cột số học
fig=plt.gcf()
fig.set_size_inches( 10 , )
fig=sns.heatmap(df_numerical.corr(),annot= True ,cmap= 'cubehelix' ,linewidths= 1
linecolor= 'k' ,square= True ,mask= False , vmin= -1 ,
vmax= 1 ,cbar_kws={ "orientation" : "vertical" },cbar= True )
# %%
# boxplot on each feature split out by species
#Sửa tên cột Class_labels -> Class_label
df.boxplot(by= "Class_label" ,figsize=( 10 , 10 ))
plt.show() # Thêm plt.show để hiển thị boxplot
Trang 22# %%
# Visualize the whole dataset
sns.pairplot(df, hue= 'Class_label' ) # Changed 'Class_labels' to 'Class_label'
# Separate features and target
data = df.values
X = data[:, 0 4
Y = data[:, 4
Tách dữ liệu training theo cross-valdilation,k=5
# Split the data to train and test dataset.
Trang 23from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_teat = train_test_split(X, Y,
# Importing metrics for evaluation
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
# ipython-input-35-0007d876747f
# Split the data to train and test dataset.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y,
test_size= 0.2 ,random_state = 0 ) # Sửa 'y_teat' thành 'y_test'
# Importing metrics for evaluation
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
# ipython-input-40-0007d876747f
# LogisticRegression
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score #import accuracy_score
model1= LogisticRegression()
model1.fit(X_train, y_train)
y_pred1 = model1.predict(X_test)
# Summary of the predictions made by the model1
nghĩa
Trang 24print ( "Confusion matrix: \n" ,confusion_matrix(y_test, y_pred1)) # Bây giờ y_test đã được định nghĩa
# Summary of the predictions made by the model2
Trang 25# Support Vector Machine's
from sklearn.svm import SVC
model3 = SVC()
model3.fit(X_train, y_train)
y_pred3 = model3.predict(X_test)
# Summary of the predictions made by the model3
Trang 26from sklearn.naive_bayes import GaussianNB
model4 = GaussianNB()
model4.fit(X_train, y_train)
y_pred4 = model4.predict(X_test)
# Summary of the precdictions made by the model4
# Summary off the predictions made by the model5
# Accuracy score
Trang 27from sklearn.metrics import accuracy_score
score5 = accuracy_score(y_pred5,y_test)
#Linear Discriminant Analysis's
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis model6 = LinearDiscriminantAnalysis()
model6.fit(X_train,y_train)
y_pred6 = model6.predict(X_test)
# Summary of the predictions made by the model6