Phần features chứa các thuộc tính mô tả đặc trưng của mỗi điểm dữ liệu, trong khi target variable chứa nhãn tương ứng của các điểm dữ liệu đó.. Tìm láng giềng gần nhất: Sau khi có dữ liệ
GIỚI THIỆU VỀ THUẬT TOÁN K-Nearest Neighbors
Ý tưởng chính của thuật toán KNN
Ý tưởng chính của thuật toán KNN dựa trên giả định rằng các điểm dữ liệu cùng nhãn thường có các đặc trưng tương tự và gần nhau trong không gian đặc trưng Do đó, để dự đoán nhãn của một điểm dữ liệu mới, ta có thể xem xét nhãn của các điểm dữ liệu láng giềng gần nhất của nó
1 Chuẩn bị dữ liệu: Đầu tiên, ta cần chuẩn bị dữ liệu để sử dụng trong thuật toán Dữ liệu thường được chia thành hai phần: features (đặc trưng) và target variable (biến mục tiêu) Phần features chứa các thuộc tính mô tả đặc trưng của mỗi điểm dữ liệu, trong khi target variable chứa nhãn tương ứng của các điểm dữ liệu đó
2 Chọn số láng giềng (k): KNN yêu cầu chỉ định số lượng láng giềng (k) để xác định nhãn cho một điểm dữ liệu mới Số k cần được chọn cẩn thận để đảm bảo mô hình hoạt động tốt trên dữ liệu
3 Tìm láng giềng gần nhất: Sau khi có dữ liệu và số láng giềng k, ta tính toán khoảng cách giữa điểm dữ liệu mới và tất cả các điểm dữ liệu trong tập huấn luyện Ta sau đó chọn k điểm gần nhất theo khoảng cách này
4 Xác định nhãn: Tiếp theo, ta xem xét nhãn của các điểm dữ liệu láng giềng đã chọn và xác định nhãn cho điểm dữ liệu mới bằng cách sử dụng một quy tắc đa số đơn giản Ví dụ: nếu trong k láng giềng, có nhiều điểm thuộc về nhãn A hơn nhãn B, ta dự đoán điểm dữ liệu mới thuộc về nhãn A
5 Đánh giá mô hình: Cuối cùng, ta đánh giá độ chính xác của mô hình KNN bằng cách so sánh nhãn dựđoán của mô hình với nhãn thực tế của các điểm dữ liệu kiểm tra.
Ưu điểm của thuật toán KNN
• Tính toán nhanh: KNN không cần học một mô hình phức tạp từ dữ liệu, mà chỉ cần lưu trữ dữ liệu và tính khoảng cách giữa các điểm khi cần dự đoán
• Thuật toán đơn giản và dễ diễn giải: KNN có ý tưởng cơ bản là những điểm dữ liệu tương tự nhau sẽ gần nhau trong không gian, và dựa vào biểu quyết đa số hoặc trung bình của các điểm gần nhất để phân loại hoặc hồi quy
KNN là một thuật toán đa năng, có thể xử lý các bài toán phân loại và hồi quy và có thể hoạt động hiệu quả với dữ liệu có nhiều chiều và nhiều lớp.
• Độ chính xác cao: KNN có thể đạt được độ chính xác cao nếu lựa chọn tham số K phù hợp và sử dụng phương pháp đo khoảng cách hợp lý
KNN không cần phải đưa ra các giả định bổ sung hoặc xây dựng một mô hình cho dữ liệu, cho phép nó xử lý dữ liệu phi cấu trúc hoặc có phân phối khác nhau.
Nhược điể m c ủ a thu ậ t toán KNN
• Độ chính xác phụ thuộc vào chất lượng của dữ liệu: Nếu dữ liệu có nhiều nhiễu hoặc không cân bằng, thuật toán KNN có thể đưa ra dự đoán sai lệch
• Dựđoán trở nên chậm với dữ liệu lớn: Thuật toán KNN phải tính khoảng cách giữa điểm cần dự đoán và tất cả các điểm trong tập dữ liệu, do đó chi phí tính toán sẽ tăng theo kích thước của dữ liệu
• Không phù hợp với tập dữ liệu lớn: Thuật toán KNN cần lưu trữ tất cả dữ liệu đào tạo, do đó yêu cầu bộ nhớ cao Ngoài ra, việc tìm kiếm các hàng xóm gần nhất trong không gian nhiều chiều cũng gặp khó khăn
• Cần tìm một giá trị k tối ưu (số láng giềng gần nhất): Giá trị k ảnh hưởng đến kết quả của thuật toán KNN Nếu k quá nhỏ, thuật toán sẽ bị ảnh hưởng bởi nhiễu Nếu k quá lớn, thuật toán sẽ bịảnh hưởng bởi các điểm xa.
Mô tả bài toán Zoo Animal Classification
Tổng quan chương trình
2.1.1 Bộ dữ liệu Zoo và Class
• Bộ dữ liệu "Zoo.csv" bao gồm thông tin về các loài động vật trong một sở thú Các thuộc tính trong bộ dữ liệu này có thể bao gồm Tên của loài động vật, Thuộc tính
"hair", Thuộc tính "feathers", Thuộc tính "eggs", Thuộc tính "milk", Thuộc tính
"airborne", Thuộc tính "aquatic", Thuộc tính "predator", Thuộc tính "toothed", Thuộc tính "backbone", Thuộc tính "breathes", Thuộc tính "venomous", Thuộc tính "fins", Số lượng chân của động vật, Thuộc tính "tail", Thuộc tính "domestic", Thuộc tính
"catsize", Mã số chỉ loại động vật
• Bộ dữ liệu "Class.csv" bao gồm thông tin về số hiệu về lớp động vật, số lượng động vật trong lớp đấy, loại lớp động vật và tên các loại đông vật có mặt trong lớp đấy
2.1.2 Hợp lại hai bộ dữ liệu và loại bỏ những dữ liệu không cần thiết
Sau khi hợp dữ liệu bằng cách sử dụng hàm merge và xóa dữ liệu không cần thiết bằng hàm drop ta có dữ liệu như sau
Chuẩn bị Data thứ nhất cho Models
2.2.1 Chọn các cột để thêm vào tập hợp X và y features = list(zoo_df.columns.values) animal_nam hair feathers eggs milk airborne aquatic predator toothed backbone breathes venomous fins legs tail domestic catsize class_type aardvark 1 0 0 1 0 0 1 1 1 1 0 0 4 0 0 1 1 antelope 1 0 0 1 0 0 0 1 1 1 0 0 4 1 0 1 1 bass 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 4 bear 1 0 0 1 0 0 1 1 1 1 0 0 4 0 0 1 1 boar 1 0 0 1 0 0 1 1 1 1 0 0 4 1 0 1 1 buffalo 1 0 0 1 0 0 0 1 1 1 0 0 4 1 0 1 1 calf 1 0 0 1 0 0 0 1 1 1 0 0 4 1 1 1 1 carp 0 0 1 0 0 1 0 1 1 0 0 1 0 1 1 0 4 catfish 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 4 cavy 1 0 0 1 0 0 0 1 1 1 0 0 4 0 1 0 1
Class_Number Number_Of_Animal_Speci Class_Type Animal_Names
1 41 Mammal aardvark, antelope, bear, boar, buffalo, calf, cavy, cheetah, deer, d 2 20 Bird chicken, crow, dove, duck, flamingo, gull, hawk, kiwi, lark, ostrich, p
3 5 Reptile pitviper, seasnake, slowworm, tortoise, tuatara
4 13 Fish bass, carp, catfish, chub, dogfish, haddock, herring, pike, piranha, se
5 4 Amphibian frog, frog, newt, toad
6 8 Bug flea, gnat, honeybee, housefly, ladybird, moth, termite, wasp
7 10 Invertebrate clam, crab, crayfish, lobster, octopus, scorpion, seawasp, slug, starfi dòng trên đầu tiên tạo một danh sách gồm tất cả tên cột trong DataFrame 'zoo_df' bằng cách sử dụng phương thức columns.values
X = zoo_df[features] y = zoo_df['Class_Number'] chúng ta gán tập X bằng một DataFrame mới chỉ chứa các cột trong danh sách 'features' Điều này tạo ra tập X chứa các đặc trưng mà chúng ta quan tâm Tương tự, chúng ta gán tập y bằng cột 'Class_Number' trong DataFrame 'zoo_df', đại diện cho nhãn của mẫu dữ liệu tương ứng.
2.2.2 Chia X, y data ra thành train và test X_train, X_test, y_train, y_test = train_test_split(X,y,random_state = 0) Đoạn mã trên chia tập dữ liệu thành các biến sau:
X_train: Tập dữ liệu huấn luyện cho các đặc trưng (features).
X_test: Tập dữ liệu kiểm tra cho các đặc trưng (features) y_train: Tập dữ liệu huấn luyện cho nhãn (label) y_test: Tập dữ liệu kiểm tra cho nhãn (label)
Tham số X là tập dữ liệu đầu vào chứa các đặc trưng, y là tập dữ liệu đầu ra chứa nhãn
Tham số random_state=0 được sử dụng để đảm bảo rằng việc chia tập dữ liệu sẽ luôn tạo ra các tập huấn luyện và kiểm tra nhất quán trong các lần chạy khác nhau Bằng cách sử dụng giá trị cố định cho random_state, chúng ta có thể tái tạo kết quả chia tập dữ liệu một cách nhất quán.
Huấn luyện model
Dòng đầu tiên tạo một đối tượng của lớp KNeighborsClassifier từ module sklearn.neighbors Đối tượng này sẽ được sử dụng để xây dựng mô hình KNN Trong đó, tham số n_neighbors=5 xác định số lượng hàng xóm gần nhất mà mô hình sẽ sử dụng để đưa ra dự đoán knn.fit(X_train, y_train)
Dòng tiếp theo sử dụng phương thức fit() của đối tượng KNeighborsClassifier để huấn luyện mô hình Phương thức này nhận hai tập dữ liệu là X_train (tập dữ liệu huấn luyện cho các đặc trưng) và y_train (tập dữ liệu huấn luyện cho nhãn) Mô hình KNN sẽ học từ các điểm dữ liệu huấn luyện này để có thể dự đoán nhãn cho các điểm dữ liệu mới.
Kiểm tra và đánh giá Model
2.4.1 T ạo và in ra báo cáo phân loại y_pred = knn.predict(X_test) print(classification_report(y_test,y_pred))
Trong đoạn mã trên, chúng ta đang sử dụng hàm classification_report từ module sklearn.metrics để tạo báo cáo phân loại của mô hình dự đoán trên tập dữ liệu kiểm tra.
Dòng mã trên tính toán và in ra báo cáo phân loại dựa trên các nhãn thực tế (y_test) và các nhãn dự đoán (y_pred) Báo cáo phân loại cung cấp thông số đánh giá hiệu suất của mô hình cho từng lớp (nhãn) trong bài toán phân loại.
Báo cáo phân loại thường bao gồm các số liệu như độ chính xác (accuracy), độ phủ (recall), độ chính xác dương tính (precision), và F1-score Nó cung cấp cái nhìn tổng quan về hiệu suất của mô hình, giúp đánh giá mức độ chính xác và đầy đủ của các dự đoán phân loại trên tập dữ liệu kiểm tra precision recall f1-score support
1 1.00 1.00 1.00 10 2 1.00 1.00 1.00 5 3 0.00 0.00 0.00 1 4 0.83 1.00 0.91 5 5 1.00 1.00 1.00 1 6 1.00 1.00 1.00 2 7 1.00 1.00 1.00 2 accuracy 0.96 26 macro avg 0.83 0.86 0.84 26 weighted avg 0.93 0.96 0.94 26
2.4.2 Thực hiện tìm giá trị K tốt nhất k_list = np.arange(1, 50, 2) mean_scores = [] accuracy_list = [] error_rate = [] for i in k_list: knn = KNeighborsClassifier(n_neighbors=i) knn.fit(X_train,y_train) pred_i = knn.predict(X_test) score = cross_val_score(knn,X_train, y_train,cv) mean_scores.append(np.mean(score)) error_rate.append(np.mean(pred_i != y_test)) print("Mean Scores:") print(mean_scores) print("Error Rate:") print(error_rate)
Dòng đầu tiên định nghĩa một mảng k_list sử dụng hàm arange() từ thư viện NumPy
Mảng giá trị k dao động từ 1 đến 49 theo bước nhảy là 2 Phạm vi này xác định các số lượng hàng xóm khác nhau sẽ được kiểm tra cho mô hình KNN.
Các biến mean_scores, accuracy_list, và error_rate được khởi tạo rỗng Chúng sẽ được sử dụng để lưu trữ kết quả đánh giá hiệu suất của mô hình KNN với các giá trị k khác nhau
Vòng lặp for trên sử dụng mỗi giá trị k trong k_list để tạo một mô hình KNN mới với số lượng hàng xóm tương ứng Sau đó, mô hình được huấn luyện trên tập dữ liệu huấn luyện (X_train, y_train)
Tiếp theo, mô hình được sử dụng để dự đoán nhãn trên tập dữ liệu kiểm tra (X_test) Điều này cho phép chúng ta tính toán tỷ lệ lỗi (error rate) của mô hình bằng cách so sánh nhãn dự đoán (pred_i) với nhãn thực tế (y_test)
Ngoài ra, chúng ta sử dụng phương thức cross_val_score() từ module sklearn.model_selection để đánh giá hiệu suất của mô hình KNN bằng phương pháp cross- validation Kết quả điểm số của cross-validation được lưu vào biến score, và giá trị trung bình của điểm số này được thêm vào danh sách mean_scores.
Trực quan hóa mô hình hiệu suất giá trị n khác nhau
Bằng cách sử dụng hàm Plot ta tạo ra được hai mô hình:
13 Độ chính xác của mô hình đối với các giá trị thay đổi của K
Tỷ lệ lỗi của mô hình đối với các giá trị thay đổi của K
Chuẩn bị Data thứ hai cho Model
2.6.1 Chuẩn bị dữ liệu thứ hai zoo_df['has_legs'] = np.where(zoo_df['legs']>0,1,0) zoo_df = zoo_df[['animal_name','hair','feathers','eggs','milk', 'airborne', 'aquatic', 'predator','toothed','backbone','breathes','venomous','fins','legs','has_legs','tail','dome stic','catsize','Class_Number','Class_Type']] zoo_df.head()
Dòng này thực hiện việc tạo một cột mới có tên là 'has_legs' trong DataFrame 'zoo_df' Cột mới này sẽ được điều chỉnh dựa trên giá trị của cột 'legs' trong DataFrame ban đầu
• condition là một biểu thức điều kiện, trong trường hợp này là zoo_df['legs']>0 Điều kiện này kiểm tra giá trị của cột 'legs' trong DataFrame 'zoo_df' xem có lớn hơn 0 hay
• x là giá trị trả về nếu điều kiện là True, trong trường hợp này là 1
• y là giá trị trả về nếu điều kiện là False, trong trường hợp này là 0
Từ đấy ta có trường dữ liệu has legs mới
2.6.2 Chọn tập dữ liệu cho mô hình features = list(zoo_df.columns.values)
This line creates a list called 'features' which contains the names of all the columns in the DataFrame 'zoo_df' The zoo_df.columns.values function returns a list containing the column names of the DataFrame The features.remove('legs') functions remove the 'legs' column from the list The features.remove('Class_Type') function removes the 'Class_Type' column from the list The features.remove('Class_Number') function removes the 'Class_Number' column from the list The features.remove('animal_name') function removes the 'animal_name' column from the list.
Các dòng này sử dụng phương thức remove() của list để loại bỏ các phần tử có giá trị tương ứng từ list 'features' Các cột bị loại bỏ bao gồm 'legs', 'Class_Type', 'Class_Number' và 'animal_name' Điều này được thực hiện để xác định các cột sẽ được sử dụng làm đặc trưng (features) trong tập dữ liệu X
X2 = zoo_df[features] y2 = zoo_df['Class_Type']
Dòng này tạo ra tập dữ liệu X bằng cách chọn các cột trong DataFrame 'zoo_df' tương ứng với các tên được lưu trong list 'features' Tập dữ liệu y được tạo ra bằng cách chọn cột 'Class_Type' trong DataFrame 'zoo_df'.
Huấn luyện Model
X2_train, X2_test, y2_train, y2_test = train_test_split(X2,y2,random_state = 0)
• X2 là tập dữ liệu đặc trưng (features) đã được chọn từ DataFrame 'zoo_df'
• y2 là tập dữ liệu nhãn (labels) tương ứng với cột 'Class_Type' trong DataFrame 'zoo_df'
• random_state=0 sử dụng giá trị random_state cố định để đảm bảo kết quả chia dữ liệu được tái tạo mỗi khi chạy lại mã
Hàm train_test_split được sử dụng để chia tập dữ liệu thành hai phần: tập huấn luyện (train) và tập kiểm tra (test) Các tham số đầu vào của hàm này bao gồm:
• X2 là tập dữ liệu đặc trưng (features) sẽ được chia
• y2 là tập dữ liệu nhãn (labels) tương ứng với các mẫu trong X2
• random_state là tham số tùy chọn để đảm bảo việc chia dữ liệu được thực hiện theo cách nhất quán mỗi khi chạy lại mã
Kết quả của hàm train_test_split là bốn biến:
• X2_train là tập dữ liệu đặc trưng (features) được chia cho huấn luyện
• X2_test là tập dữ liệu đặc trưng (features) được chia cho kiểm tra
• y2_train là tập dữ liệu nhãn (labels) tương ứng với X2_train
• y2_test là tập dữ liệu nhãn (labels) tương ứng với X2_test.
Sau khi thực hiện đoạn mã này, ta sẽ có tập dữ liệu huấn luyện (X2_train, y2_train) và tập dữ liệu kiểm tra (X2_test, y2_test) để sử dụng trong quá trình huấn luyện và đánh giá mô hình knn2 = KNeighborsClassifier(n_neighbors = 5)
Dòng đầu tiên tạo một đối tượng của lớp KNeighborsClassifier từ module sklearn.neighbors Đối tượng này sẽ được sử dụng để xây dựng mô hình KNN Trong đó, tham số n_neighbors=5 xác định số lượng hàng xóm gần nhất mà mô hình sẽ sử dụng để đưa ra dự đoán knn2.fit(X2_train, y2_train)
Dòng tiếp theo sử dụng phương thức fit() của đối tượng KNeighborsClassifier để huấn luyện mô hình Phương thức này nhận hai tập dữ liệu là X_train (tập dữ liệu huấn luyện cho các đặc trưng) và y_train (tập dữ liệu huấn luyện cho nhãn) Mô hình KNN sẽ học từ các điểm dữ liệu huấn luyện này để có thể dự đoán nhãn cho các điểm dữ liệu mới.
Kiểm tra và đánh giá Model
2.8.1 Tạo và in ra báo cáo phân loại y2_pred = knn2.predict(X2_test) print(classification_report(y_test,y_pred))
Trong mã lệnh trên, hàm classification_report từ sklearn.metrics tạo báo cáo phân loại cho mô hình dự đoán dựa trên tập dữ liệu kiểm tra.
Dòng mã trên tính toán và in ra báo cáo phân loại dựa trên các nhãn thực tế (y2_test) và các nhãn dự đoán (y2_pred) Báo cáo phân loại cung cấp các thông số đánh giá hiệu suất của mô hình cho từng lớp (nhãn) trong bài toán phân loại
Báo cáo phân loại thường bao gồm các số liệu như độ chính xác (accuracy), độ phủ (recall), độ chính xác dương tính (precision), và F1-score Nó cung cấp cái nhìn tổng quan về hiệu suất của mô hình, giúp đánh giá mức độ chính xác và đầy đủ của các dự đoán phân loại trên tập dữ liệu kiểm tra precision recall f1-score support
Amphibian 1.00 1.00 1.00 1 Bird 1.00 1.00 1.00 5 Bug 1.00 1.00 1.00 2 Fish 1.00 1.00 1.00 5 Invertebrate 1.00 1.00 1.00 2 Mammal 1.00 1.00 1.00 10 Reptile 1.00 1.00 1.00 1 accuracy 1.00 26 macro avg 1.00 1.00 1.00 26 weighted avg 1.00 1.00 1.00 26
2.8.2 Thực hiện tìm giá trị K tốt nhất k_list = np.arange(1, 50, 2) mean_scores2 = [] accuracy_list2 = [] error_rate2 = [] for i in k_list: knn2 = KNeighborsClassifier(n_neighbors=i) knn2.fit(X2_train,y2_train) pred_i = knn2.predict(X2_test) score = cross_val_score(knn2,X2_train, y2_train,cv) mean_scores2.append(np.mean(score)) error_rate2.append(np.mean(pred_i != y2_test)) print("Mean Scores:") print(mean_scores) print("Error Rate:") print(error_rate)
Dòng đầu tiên định nghĩa một mảng k_list sử dụng hàm arange() từ thư viện NumPy
Mảng này chứa các giá trị k từ 1 đến 49 với bước là 2 Điều này định nghĩa các số lượng hàng xóm khác nhau mà chúng ta sẽ thử nghiệm cho mô hình KNN
Các biến mean_scores, accuracy_list, và error_rate được khởi tạo rỗng Chúng sẽ được sử dụng để lưu trữ kết quả đánh giá hiệu suất của mô hình KNN với các giá trị k khác nhau
Vòng lặp for trên sử dụng mỗi giá trị k trong k_list để tạo một mô hình KNN mới với số lượng hàng xóm tương ứng Sau đó, mô hình được huấn luyện trên tập dữ liệu huấn luyện (X_train, y_train)
Tiếp đến, mô hình được dùng để dự đoán nhãn trên tập dữ liệu kiểm tra (X_test) Điều này giúp ta tính tỷ lệ lỗi (error rate) của mô hình bằng cách so sánh nhãn dự đoán (pred_i) với nhãn thực tế (y_test).
Ngoài ra, chúng ta sử dụng phương thức cross_val_score() từ module sklearn.model_selection để đánh giá hiệu suất của mô hình KNN bằng phương pháp cross- validation Kết quả điểm số của cross-validation được lưu vào biến score, và giá trị trung bình của điểm số này được thêm vào danh sách mean_scores.
Trực quan hóa mô hình hiệu suất giá trị n khác nhau
Bằng cách sử dụng hàm Plot ta tạo ra một mô hình so sánh giữa các đặc trưng
19 Độ chính xác của hai mô hình đối với các giá trị thay đổi của K Độ sai lệch của hai mô hình đối với các giá trị thay đổi của K
Từ đấy ta nhận xét thay thế chân tính năng bằng has_legs cải thiện độ chính xác của các mô hình KNN ở mọi giá trị trong đó n >3 và mang lại lợi ích trong mô hình KNN vì tính năng has_legs chỉ có hai giá trị (0 hoặc 1), trong khi tính năng chân ban đầu có thể có nhiều giá trị khác nhau Điều này giúp giảm số lượng giá trị khác nhau mà mô hình KNN cần xem xét, từ đó giảm không gian đặc trưng và có thể cải thiện hiệu suất tính toán
Ý tưởng cá nhân về bài toán xếp hạng và đề xuất phim
Thu nhập dữ liệu
3.2.1 API của The Movie Database (TMDb)
API của The Movie Database (TMDb) là một giao diện lập trình ứng dụng cho phép nhà phát triển truy cập và tương tác với dữ liệu của TMDb trong ứng dụng của họ API cung cấp một loạt các endpoints và phương thức để truy xuất thông tin về phim, chương trình truyền hình và các nội dung liên quan khác.
Dưới đây là một số khía cạnh quan trọng của API của TMDb:
• Tìm kiếm và xem thông tin phim: API cho phép bạn tìm kiếm phim bằng tên, từ khóa, ID hoặc thông qua các tiêu chí tùy chọn khác Bạn có thể lấy thông tin chi tiết về phim, bao gồm diễn viên, đạo diễn, thể loại, tóm tắt, hình ảnh, trailer và đánh giá
• Truy xuất danh sách phim: Bạn có thể lấy danh sách các phim phổ biến, phim mới nhất, phim được đề xuất, phim theo thể loại và nhiều danh sách khác
• Thông tin về diễn viên và đạo diễn: Bạn có thể truy xuất thông tin chi tiết về các diễn viên và đạo diễn, bao gồm danh sách phim mà họ tham gia và thông tin cá nhân.
3.2 2 Triển khai API của ThemovieDb
Bằng cách truy cập và trích xuất các thông tin cần thiết ta sẽ lấy những dữ liệu quan trong cần thiết cho xây dựng hệ thống xếp hang và đề xuất thông tin cá nhân trong đấy ta sẽ lấy những thông tin quan trọng như 'ID', 'Title', 'Keywords', 'Director', 'Cast', 'Genres', 'Vote Average'
3.2 3 Đưa dữ liệu lấy từ trang web sang file CSV
Bằng cách sử dụng hàm writerow ta sẽ in từng dữ liệu theo số hàng đã được định sẵn ta sẽ có một file CSV với đầy đủ thông tin quan trọng lên tới 8000 bộ phim
ID Title Keywords Director Cast Genres Vote Average
872585 Oppenheimer 'husband wife relationship', 'basedChristopher Nolan 'Cillian Murphy', 'Emily Blunt', 'Matt Damon', 'Robert Downey Jr.', 'Florence Pugh', 'Josh Hartnett', 'Casey Affleck', 'Rami Malek', 'Kenneth Branagh', 'Benny Safdie', 'Jason Clarke', 'Dylan Arnold', 'Tom Conti', 'James D'Arcy', 'David Dastmalchian', 'Dane DeHaan', 'Alden Ehrenreich', 'Tony Goldwyn', 'Jefferson Hall', 'David Krumholtz', 'Matthew Modine', 'Scott Grimes', 'Kurt Koehler', 'John Gowans', 'Macon Blair', 'Harry Groener', 'Gregory Jbara', 'Ted King', 'Tim DeKay', 'Steven Houska', 'Petrie Willink', 'Matthias Schweighửfer', 'Alex Wolff', 'Josh Zuckerman', 'Rory Keane', 'Michael Angarano', 'Emma Dumont', 'Sadie Stratton', 'Britt Kyle', 'Guy Burnet', 'Tom Jenkins', 'Louise Lombard', 'Michael Andrew Baker', 'Jeff Hephner', 'Olli Haaskivi', 'David Rysdahl', 'Josh Peck', 'Jack Quaid', 'Brett DelBuono', 'Gustaf Skarsgồrd', 'James Urbaniak', 'Trond Fausa Aurvồg', 'Devon Bostick', 'Danny Deferrari', 'Christopher Denham', 'Jessica Erin Martin', 'Ronald Auguste', 'Mỏtộ Haumann', 'Olivia Thirlby', 'Jack Cutmore- 'Drama', 'History' 8.229 507089 Five Nights at Freddy's 'night shift', 'child murder', 'restaura Emma Tammi 'Josh Hutcherson', 'Piper Ru 'Horror', 'Mystery' 7.992
575264 Mission: Impossible - Dead R'race against time', 'rome, italy', 'ch Christopher McQuarrie 'Tom Cruise', 'Hayley Atwell', 'Ving Rhames', 'Simon Pegg', 'Rebecca Ferguson', 'Vanessa Kirby', 'Esai Morales', 'Pom Klementieff', 'Henry Czerny', 'Shea Whigham', 'Greg Tarzan Davis', 'Frederick Schmidt', 'Mariela Garriga', 'Cary Elwes', 'Charles Parnell', 'Mark Gatiss', 'Indira Varma', 'Rob Delaney', 'Marcello Walton', 'Brian Law', 'Lincoln Conway', 'Alex James-Phelps', 'Marcin Dorociński', 'Ivan Ivashkin', 'Zahari Baharov', 'Adrian Bouchet', 'Sam Barrett', 'Louis Vaughan', 'Jean Kartal', 'Os Leanse', 'Luke Smith', 'Nikolaos Brahimllari', 'Matt Malecki', 'Damian Rozanek', 'Antonio Bustorff', 'Ioachim Ciobanu', 'Michael Kosterin', 'Sergej Lopouchanski', 'Robert Luckay', 'Jadran Malkovich', 'Mikhail Safronov', 'Christopher Sciueref', 'Andrea Scarduzio', 'Barnaby Kay', 'Gloria Obianyo', 'Alex Brock', 'Kaye Dinauto', 'Dana Blacklake', 'Arevinth V Sarma', 'Doroteya Toleva', 'Lucia Tong', 'Hersha Verity', 'Yennis Cheung', 'Laura Vortler', 'Faycal Attougui', 'Gaetano Bruno', 'Marco Sincini', 'Evita Ciri', 'Melissa 'Action', 'Thriller' 7.6 299054 Expend4bles 'sequel', 'nuclear bomb', 'cargo shScott Waugh 'Jason Statham', '50 Cent', 'Megan Fox', 'Dolph Lundgren', 'Iko Uwais', 'Andy Garcớa', 'Sylvester Stallone', 'Tony Jaa', 'Randy Couture', 'Jacob Scipio', 'Levy Tran', 'Lucy Newman-Williams', 'Daren Nop', 'Kenny "Cowboy" Bartram', 'Cody Mackie', 'Cokey Falkow', 'Dan Chupong', 'Karim Saidi', 'Samuel Black', 'Adam Masto', 'Sheila Shah', 'Nicole Andrews', 'Oat Jenner', 'Susanne Potrock', 'Eddie Hall', 'Mike Mửller', 'Alexander Hristozov', 'Antoni Davidov', 'David Nop', 'Igor Pečenjev', 'Stefan Ivanov', 'Vladimir Mihailov', 'Martin Ghiaurov', 'Tjaša Perko', 'Stefan Bahrun', 'Assen Karanikolov', 'Caroline Wilde', 'Jason Lines' 'Action', 'Adventure', 'Thriller' 6.482
385687 Fast X 'sequel', 'revenge', 'racing', 'familyLouis Leterrier 'Vin Diesel', 'Michelle Rodriguez', 'Tyrese Gibson', 'Ludacris', 'John Cena', 'Nathalie Emmanuel', 'Jordana Brewster', 'Sung Kang', 'Jason Momoa', 'Scott Eastwood', 'Daniela Melchior', 'Alan Ritchson', 'Helen Mirren', 'Brie Larson', 'Jason Statham', 'Charlize Theron', 'Rita Moreno', 'Joaquim de Almeida', 'Leo A Perry', 'Luis Da Silva Jr.', 'Jaz Hutchins', 'Luka Hays', 'Alexander Capon', 'Pete Davidson', 'Shadrach Agozino', 'Ludmilla', 'Miraj Grbić', 'Meadow Walker Thornton-Allan', 'Michael Irby', 'Shahir Figueira', 'Ben-Hur Santos', 'Debby Ryan', 'Josh Dun', 'Dwayne Johnson', 'Gal Gadot', 'Paul Walker', 'Ali Baddou', 'Emily Buchan' 'Action', 'Crime', 'Thriller' 7.222 678512 Sound of Freedom 'pedophilia', 'kidnapping', 'human t Alejandro Gúmez Monteverde'Jim Caviezel', 'Mira Sorvino', 'Bill Camp', 'Gerardo Taracena', 'Kurt Fuller', 'Josộ Zỳủiga', 'Eduardo Verỏstegui', 'Scott Haze', 'Yessica Borroto Perryman', 'Gary Basaraba', 'Manny Pộrez', 'Gustavo Sỏnchez Parra', 'Javier Godino', 'James Quattrochi', 'Eduardo Gomez Monteverde', 'Gustavo Angarita Jr.', 'Ariel Sierra', 'Kris Avedisian', 'Alejandro Muela', 'Jaime Newball', 'Cristal Aparicio', 'Lucas Ávila', 'Samuel Livingston', 'Valerie Domớnguez', 'Jairo Ordúủez' 'Action', 'Drama' 8.088
609681 The Marvels 'hero', 'superhero', 'space travel', 'Nia DaCosta 'Brie Larson', 'Teyonah Parri 'Action', 'Adventure', 'Science Fiction' 6.515800158 The Killer 'sniper', 'new york city', 'assassin', David Fincher 'Michael Fassbender', 'Tilda Swinton', 'Charles Parnell', 'Arliss Howard', 'Kerry O'Malley', 'Sophie Charlotte', 'Emiliano Pernia', 'Gabriel Polanco', 'Sala Baker', 'Endre Hules', 'Bernard Bygott', 'Monique Ganderton', 'Daran Norris', 'Nikki Dixon', 'Paloma Palacio Colon', 'Lớa Lockhart', 'Arturo Duvergộ', 'Gộnesis Estộvez', 'Leroy Edwards III', 'Kellan Rhude', 'Sacha Beaubier', 'Branden Mitch', 'Brandon Morales', 'Kyrstal Ortiz', 'Erik Hellman', 'Carlos Rogelio Diaz', 'Ilyssa Fradin', 'Julia Rowley', 'Jack Kesy', 'Eric Tolzmann', 'Jirus Tillman', 'Kev Morris Sr.', 'Brett C Johnson', 'Tariq Azikiue', 'Jộrụme Keen', 'Stộphane Vasseur', 'Franỗois Patissier', 'Dzianis Chpoutalau', 'Cộcile Coves', 'Claire Patronikn', 'Lila Espinasse', 'Sara Mezouar', 'Zacharia Mezouar', 'Marie Bessiốre', 'Nino Viard', 'Antoine Matichard', 'Anna Cosmao', 'Alexandra Holzhammer' 'Crime', 'Thriller' 6.822926393 The Equalizer 3 'italy', 'vigilante justice', 'italian maAntoine Fuqua 'Denzel Washington', 'Dakota Fanning', 'Eugenio Mastrandrea', 'David Denman', 'Gaia Scodellaro', 'Remo Girone', 'Andrea Scarduzio', 'Andrea Dodero', 'Daniele Perrone', 'Sonia Ammar', 'Manuela Tasciotti', 'Zakaria Hamza', 'Dea Lanzaro', 'Adolfo Margiotta', 'Niccolò Senni', 'Bruno Bilotta', 'Alessandro Press', 'Niccolò Fava', 'Alessandro Xavier De Silva', 'Adriano Sabrie', 'Valerio Da Silva', 'Gian Piero Rotoli', 'Isabella Delle Monache', 'Salvatore Ruocco', 'Daniele Ornatelli', 'Luigi Catani', 'Giovanni Trombetta', 'Gianluigi Scilla', 'Danilo Capuzi', 'Giovanni Scotti', 'Marta Zoffoli', 'Marco Giuliani', 'Simona Distefano', 'Mauro Cremonini', 'Arcangelo Iannace', 'Beatrice Aiello', 'Agostino Chiummariello', 'Mariarosaria Mingione', 'Marco Cicalese', 'Diego Riace', 'Lucia Zotti', 'Cristiano Pittarello', 'Melissa Leo' 'Action', 'Thriller', 'Crime' 7.439
Trực quan hóa và biến đổi những đặc trưng quan trọng
Dữ liệu cho ta thấy thể loại Drama là thể loại có nhiều nhất và Horror là thể loại ít nhất trong top 10 thể loại phim
Dữ liệu cho ta thấy diễn viên FrankWelker là người được đóng phim nhiều nhất và LiamNeeson là người được đóng phim ít nhất trong top 10 diễn viễn
In a study of the top ten directors, Steven Spielberg was found to have directed the most films, while Robert Rodriguez directed the fewest Spielberg's extensive filmography includes blockbuster hits like "Jurassic Park" and "E.T the Extra-Terrestrial," while Rodriguez is known for directing smaller-scale independent films like "Sin City" and "From Dusk till Dawn."
Bằng cách sử dụng hàm Binary ta sẽ được sử dụng để chuyển đổi danh sách thể loại, diễn viên và đạo diễn thành một danh sách nhị phân, Điều này có thể giúp biểu diễn các đặc trưng dữ liệu dưới dạng số trong bài toán KNN.
Xây dựng hàm đề xuất phim cá nhận dựa trên thuật toán KNN
3.4.1 Xây dựng hàm tính toán độ tương đồng giữa hai bộ phim qua những đặc trưng
Kết quả Trả về tổng các khoảng cách để tính toán độ tương đồng tổng thể giữa hai bộ phim
Giá trị này là tổng của các khoảng cách tương ứng cho thể loại, đạo diễn, dàn diễn viên và từ khóa
27 Đoạn mã trên định nghĩa một hàm getNeighbors(baseMovie, K) để tìm các hàng xóm (neighbors) gần nhất của một bộ phim cơ sở (baseMovie) dựa trên độ tương đồng giữa các bộ phim distances = []: Khởi tạo một danh sách rỗng để lưu trữ khoảng cách giữa baseMovie và các bộ phim khác
Vòng lặp for index, movie in movies.iterrows():: Duyệt qua từng hàng (bộ phim) trong DataFrame movies if movie['new_id'] != baseMovie['new_id'].values[0]:: Kiểm tra xem bộ phim hiện tại có khác với baseMovie hay không Điều này đảm bảo không tính toán khoảng cách giữa baseMovie và chính nó dist = Similarity(baseMovie['new_id'].values[0], movie['new_id']): Tính toán độ tương đồng giữa baseMovie và bộ phim hiện tại bằng cách gọi hàm Similarity đã được định nghĩa trước đó Kết quả được lưu trữ trong biến dist distances.append((movie['new_id'], dist)): Thêm một cặp (id của bộ phim, khoảng cách) vào danh sách distances distances.sort(key=operator.itemgetter(1)): Sắp xếp danh sách distances theo khoảng cách tăng dần, để các hàng xóm gần nhất được đặt ở đầu danh sách neighbors = []: Khởi tạo một danh sách rỗng để lưu trữ các hàng xóm gần nhất.
Vòng lặp for x in range(K):: Duyệt qua K hàng xóm gần nhất neighbors.append(distances[x]): Thêm hàng xóm thứ x (có khoảng cách gần nhất) vào danh sách neighbors return neighbors: Trả về danh sách các hàng xóm gần nhất
3.4.3 Xây dựng hàm predict_score
Hàm predict_score(name) giúp dự đoán điểm đánh giá của phim dựa trên tiêu đề nhập vào Sau đó, tìm kiếm trong DataFrame movies những phim có tiêu đề chứa từ khóa name và lấy dòng đầu tiên Dòng dữ liệu này được chuyển thành DataFrame, chuyển vị để có một hàng và các cột tương ứng với thông tin phim.
Hàm getNeighbors(baseMovie, K): Đây là một hàm con được định nghĩa bên trong hàm predict_score, nhận đầu vào là baseMovie (bộ phim cơ sở) và K (số lượng hàng xóm gần nhất
29 cần tìm) Hàm này được sử dụng để tìm các hàng xóm gần nhất của baseMovie bằng cách gọi hàm Similarity đã được định nghĩa trước đó
K = 10: Đặt giá trị K là 10, đại diện cho số lượng hàng xóm gần nhất cần tìm avgRating = 0: Khởi tạo biến avgRating với giá trị ban đầu là 0.neighbors = getNeighbors(new_movie, K): Gọi hàm getNeighbors để tìm các hàng xóm gần nhất của new_movie và lưu trữ kết quả vào biến neighbors
Vòng lặp for neighbor in neighbors:: Duyệt qua từng hàng xóm trong danh sách neighbors.
Kết quả chương trình
Khi nhập một bộ phim có trong Data ta sẽ nhận được tiêu biểu như phim The Baker ta sẽ sử dụng hàm predict_score để lấy ra những bộ phim được gợi ý dựa trên thuật toán và đánh giá điểm
Nhâp: predict_score('The Baker') Kết quả: chương trình sẽ trả ra 10 bộ phim giống nhất và in ra điểm được dự báo
Ta có thể thấy điểm đánh giá qua thuật toán KNN rất giống với điểm đánh giá thực từ đấy ta có thể thấy thuật toán KNN có thể áp dụng cho bài toán xếp hạng và đề xuất phim
Ý TƯỞNG ỨNG DỤNG, PHÁT TRIỂN
Ý tưởng ứng dụng
4.1.1 Ứng dụng thuật to án KNN v ới h ệ thống gợi ý phim
Sử dụng thuật toán KNN để xây dựng một hệ thống gợi ý phim dựa trên lịch sử xem phim của người dùng
Sử dụng thông tin về các bộ phim đã được xem và đánh giá để tạo ra các khuyến nghị về các bộ phim tương tự cho người dùng
4.1.2 Ứng dụng thuật toán KNN với hệ thống phát hiện bất thường
KNN có ứng dụng trong việc phát hiện các điểm dữ liệu khác thường trong phạm vi dữ liệu Tiêu biểu như trong định nghĩa lừa đảo tín dụng, KNN hỗ trợ xác định giao dịch gian lận căn cứ vào các đặc điểm giao dịch.
Phát triển
4.2.1 Tăng cường tính tương thích của KNN với dữ liệu lớn
Tối ưu hóa thuật toán KNN để có khả năng xử lý dữ liệu lớn một cách hiệu quả và đạt được kết quả nhanh chóng
Sử dụng kỹ thuật như K-d trees hoặc Ball trees để cải thiện hiệu suất của KNN trên dữ liệu có kích thước lớn
4.2.2 Kết hợp KNN với các thuật toán học máy khác
Kết hợp KNN với các thuật toán học máy khác như Decision Tree, Random Forest, hoặc Neural Networks để cải thiện độ chính xác và khả năng dự đoán của mô hình
Sử dụng phương pháp voting hoặc stacking để kết hợp dự đoán từ nhiều mô hình và tận dụng các ưu điểm của mỗi thuật toán