Mục đích của báo cáo: phân tích bộ dữ liệu chẩn đoán ung thư vú Wisconsin để cải thiện chẩn đoán Bộ dữ liệu chẩn đoán ung thư vú Wisconsin là một tập dữ liệu công khai baogồm thông tin v
Giới thiệu
Tầm quan trọng của việc phát hiện sớm ung thư vú
Ung thư vú, một trong những loại ung thư ác tính nhất, đang đe dọa nghiêm trọng đến sức khỏe thể chất và tinh thần của phụ nữ trên thế giới Tuy nhiên, bệnh này có thể chữa được nếu được phát hiện ở giai đoạn đầu vì bệnh không di căn, do đó, tầm quan trọng của việc phát hiện sớm và cần tiến hành nghiên cứu về các dòng này. Việc phát hiện sớm ung thư mang lại nhiều lợi ích:
Tăng khả năng điều trị thành công: Khi được phát hiện ở giai đoạn đầu, ung thư vú thường có thể được điều trị hiệu quả bằng các phương pháp như phẫu thuật, xạ trị, hóa trị, liệu pháp hormone.
Giảm nguy cơ di căn: Ung thư vú giai đoạn đầu thường chưa di căn sang các bộ phận khác của cơ thể, do đó, việc điều trị sẽ có hiệu quả cao hơn.
Cải thiện chất lượng cuộc sống: Phát hiện sớm ung thư vú giúp giảm bớt gánh nặng tâm lý cho người bệnh và gia đình, đồng thời giúp họ có thể tiếp tục sống một cuộc sống bình thường.
Mục đích của báo cáo: phân tích bộ dữ liệu chẩn đoán ung thư vú Wisconsin để cải thiện chẩn đoán
Bộ dữ liệu chẩn đoán ung thư vú Wisconsin là một tập dữ liệu công khai bao gồm thông tin về các bệnh nhân ung thư vú và các đặc điểm mô học của khối u Bộ dữ liệu này là một công cụ có giá trị cho các nhà nghiên cứu nhằm phát triển và đánh giá các phương pháp chẩn đoán và điều trị ung thư vú.
Mục đích của báo cáo này là sử dụng các kỹ thuật Phân tích dữ liệu khám phá (EDA) để phân tích Bộ dữ liệu chẩn đoán ung thư vú Wisconsin Việc phân tích này sẽ giúp:
Hiểu rõ hơn về các đặc điểm của ung thư vú
Xác định các yếu tố nguy cơ ung thư vú
Phát triển các mô hình dự đoán ung thư vú
Cải thiện độ chính xác của chẩn đoán ung thư vú
Tổng quan về Bộ dữ liệu chẩn đoán ung thư vú
Mô tả các tính năng và biến trong bộ dữ liệu
Bộ dữ liệu này có được bằng cách phân tích các đặc điểm nhân tế bào của 569 hình ảnh thu được bằng phương pháp chọc hút bằng kim mịn đối với khối vú. Mỗi hình ảnh được phân loại (chẩn đoán) là “Lành tính - Benign” hoặc “Ác tính
- Malignant”. Để có thể tiến hành phân tích được bộ dữ liệu trên chúng ta cần dùng một số thư viện trong Python giúp chúng ta có thể phân tích dễ dàng phân tích dữ liệu và trực quan hóa, từ đó chúng ta có thể thực hiện quá trình tiền xử lí dữ liệu và sau đó là xây dựng các model trong Machine Learning
Các thư viện thường được dùng bao gồm:
Thư viện Numpy: NumPy cung cấp các hàm và công cụ để làm việc với mảng và ma trận đa chiều, và được sử dụng rộng rãi trong tính toán khoa học.
Thư viện Pandas: Pandas cung cấp các cấu trúc dữ liệu và công cụ để làm việc với dữ liệu dạng bảng (như DataFrame), giúp dễ dàng thực hiện các thao tác xử lý dữ liệu và phân tích.
Thư viện Matplotlib: Matplotlib là một thư viện trực quan hóa dữ liệu mạnh mẽ trong Python, giúp vẽ đồ thị và biểu đồ.
Thư viện Seaborn: Seaborn là một thư viện trực quan hóa dữ liệu dựa trên Matplotlib, cung cấp các giao diện cao cấp để vẽ các biểu đồ thống kê phức tạp một cách dễ dàng và thuận tiện.
Hình 1: Cài đặt thư viện
Chú thích : %matplotlib inline: câu lệnh này chỉ định rằng các biểu đồ được vẽ bằng Matplotlib sẽ được hiển thị trực tiếp trong notebook (hoặc môi trường sử dụng Jupyter) mà không cần gọi hàm plt.show().
Dữ liệu chẩn đoán ung thư vú Wisconsin được lưu dưới file “data.csv”
Tập dữ liệu mô tả: Có mười đặc điểm có giá trị thực được tính toán cho mỗi nhân tế bào ung thư:
radius (mean of distances from center to points on the perimeter):
texture (standard deviation of gray-scale values)
smoothness (local variation in radius lengths)
concavity (severity of concave portions of the contour)
concave points (number of concave portions of the contour)
fractal dimension (“coastline approximation” — 1) Để tiến hành phân tích tập dữ liệu đã cho chúng ta làm theo các bước:
Bước 1: Đọc dữ liệu vào DataFrame df = pd.read_csv(' /input/breast-cancer-wisconsin-data/data.csv')
Bước 2: Hiển thị dữ liệu dưới dạng bảng df.head() –không chỉ định tham số cho hàm head() mặc định sẽ hiển thị
Hình 2: Tập dữ liệu mẫu với 33 thuộc tính
Bước 3: Tìm số cột và số hàng có trong Data Frame df.shape
Hình 3: Bộ dữ liệu gồm 569 hàng và 33 cột
Bước 4: Xem kiểu dữ liệu có trong bảng và check các giá trị không xác định df.info()
Các kiểu dữ liệu trả về cho các cột bao gồm: float(31), int(1),object(1)
Bước 5: Lấy tên các cột có trong tệp dữ liệu df.columns
diagnosis: Kết quả chẩn đoán (lành tính hoặc ác tính).
radius_mean: Bán kính trung bình của nhân.
texture_mean: Kết cấu trung bình của nhân.
perimeter_mean: Chu vi trung bình của nhân.
area_mean: Diện tích trung bình của nhân.
smoothness_mean: Độ mịn trung bình của nhân.
compactness_mean: Độ chặt chẽ trung bình của nhân.
concavity_mean: Độ lõm trung bình của nhân.
concave points_mean: Số điểm lõm trung bình của nhân.
symmetry_mean: Độ đối xứng trung bình của nhân.
fractal_dimension_mean: Kích thước phân số trung bình của nhân.
Trong bộ dữ liệu Diagnostic DataSet Wisconsin, các cột "mean", "se" và
"worst" đại diện cho ba phần khác nhau của các đặc trưng liên quan đến biểu hiện của tế bào ung thư vú.
"mean" (trung bình): Đây là giá trị trung bình của một đặc trưng được tính toán từ các giá trị đo lường của nó trên một tập hợp các tế bào ung thư và cung cấp thông tin về trung tâm của phân bố các đặc trưng
"se" (độ lệch chuẩn): Đây là độ lệch chuẩn của một đặc trưng được tính toán từ các giá trị đo lường của nó trên một tập hợp các tế bào ung thư và cung cấp thông tin về mức độ biến thiên của các đặc trưng, được sử dụng để đánh giá sự đồng đều trong dữ liệu.
"worst" (tệ nhất): Đây là giá trị tệ nhất của một đặc trưng được tính toán từ các giá trị đo lường của nó trên một tập hợp các tế bào ung thư và cung cấp thông tin về giá trị lớn nhất của các đặc trưng trong mỗi mẫu và đánh giá tình trạng nghiêm trọng của tế bào ung thư.
Bước 6: Kiểm tra các giá trị bị thiếu df.isnull().sum()
Bước 7: Xóa cột “Unamed 32” và cột “id”
Cột “ Unnamed: 32” và “id” dường như không có bất kỳ dữ liệu hữu ích nào có thể hữu ích cho việc xây dựng mô hình học máy Do đó, sẽ loại bỏ nó trước khi phân tích sâu hơn. df.drop("Unnamed: 32", axis=1, inplace=True) df.drop('id',axis=1, inplace=True)
axis=1: chỉ định cột là giá trị cần xóa
inplace=True: Sửa đổi DataFrame gốc tại chỗ
Bước 8: Thống kê mô tả về dữ liệu df.describe()
Hình 5: Mô tả về tập dữ liệu sau làm sạch
Hàm df.describe() trả về một DataFrame mới với số hàng được hiển thị ra các thông số như giá trị trung bình, độ lệch chuẩn, min, max và tỷ lệ phần trăm của các cột
Tóm lại sau bước khám phá và làm quen với dữ liệu, ta có thể biết được:
Hiểu biết về dữ liệu: Mô tả ngắn gọn về tập dữ liệu, bao gồm số lượng hàng, cột, loại dữ liệu và bất kỳ đặc điểm quan trọng nào khác.
Phân phối dữ liệu: Mô tả cách dữ liệu được phân phối, bao gồm các giá trị trung bình, trung vị, tứ phân vị và bất kỳ giá trị ngoại lệ nào.
Mối quan hệ giữa các biến: Xác định bất kỳ mối quan hệ hoặc tương quan nào giữa các biến khác nhau trong dữ liệu.
Thiếu dữ liệu và giá trị bất thường: Ghi nhận bất kỳ giá trị thiếu hoặc bất thường nào trong dữ liệu và đánh giá tác động tiềm ẩn của chúng đối với phân tích. b) Trực quan hóa dữ liệu
Sau khi khám phá dữ liệu, bước tiếp theo là trực quan hóa dữ liệu Trực quan hóa dữ liệu là quá trình đại diện cho dữ liệu dưới dạng đồ họa hoặc biểu đồ để dễ hiểu và diễn giải hơn.
Trực quan hóa dữ liệu về số lượng các ca nhiễm bệnh là lành tính (B) hay ác tính (M), sử dụng thư viện Seaborn và hàm đếm countplot():
Hình 6: Biểu đồ tỉ lệ các khối u lành tính và ác tính
Chú thích: M – malignant: ác tính, B – Benign: lành tính
Tiền xử lý dữ liệu
Quá trình tiền xử lý dữ liệu là một bước quan trọng trong bất kỳ dự án học máy nào Nó giúp đảm bảo rằng dữ liệu ở trong một định dạng phù hợp để mô hình học máy có thể sử dụng
Quá trình tiền xử lí dữ liệu được thực hiện như sau:
- Từ ma trận tương quan trên ta sẽ bỏ đi các thuộc tính có độ tương quan cao (> 0.92) để tránh hiện tượng đa cộng tuyến đó là giảm thiểu sự ảnh hưởng của các biến tương quan lên mô hình và tăng tính ổn định của các ước lượng.
⇒ Kết quả còn lại 23 cột thuộc tính
- Xử lý dữ liệu đầu ra về dạng 0, 1
Xử lý dữ liệu ra là cột diagnosis có 2 dạng là B và M về 0 và 1
- Phân chia dữ liệu: chia dữ liệu thành các tập huấn luyện và tập kiểm tra
Chia bộ ra liệu thành 2 phần, 1 phần để train và 1 phần để test
Test_size: là tỷ lệ chia
Random_state: trình tạo số ngẫu nhiên được sử dụng để xáo trộn dữ liệu trước khi chia tách dữ liệu, đảm bảo việc ngẫu nhiên hóa giống nhau được sử dụng mỗi khi bạn chạy mã, dẫn đến việc phân chia dữ liệu giống nhau
- Các giá trị X_train và X_test được lấy từ bộ dữ liệu khi loại bỏ cột mục tiêu diagnosis bằng lệnh df.drop(‘diagnosis’, axis = 1) (trong đó axis = 1 có nghĩa xóa cột)
- Các gái trị y_train, y_test được lấy từ cột diagnosis trong bộ dữ liệu df[‘diagnosis’]
- Ta chia bộ dữ liệu thành tỷ lệ 8:2 trong đó 80% dùng để train và 20% dùng để test biến test_size = 0.2
- Giá trị random_state = 42: dùng để ta đánh dấu bộ dữ liệu khi chia ra sao cho sau mỗi lần chạy lại đảm bảo dữ liệu chia vẫn giống nhau.
- Áp dụng cách thức chuẩn hóa dữ liệu – StandardScaler bằng fit_transform:
Chuẩn hóa dữ liệu là việc scale dữ liệu về một phân bố trong đó giá trị trung bình bằng 0 và độ lệch chuẩn = 1 Kỹ thuật này còn được gọi là “whitening.”. Nhờ việc chuẩn hóa, các thuật toán như linear regression, logistic regression được cải thiện.
Công thức chuẩn của phương pháp standardization như sau: z = (x – u ) / s
x : là giá trị gốc ban đầu.
u : là giá trị trung bình (mean)
fit_transform : là sự kết hợp giữa fit và transform
+ fit: tìm hiểu các trọng số và tham số của mô hình từ dữ liệu tập huấn luyện như là giá trí trung bình, độ lệch chuẩn
+ transform: áp dụng các thông tin từ phương thức fit để áp dụng biến đổi cho tập dữ liệu
Hình 8: Dữ liệu X_train sau khi fit_transform
Xây dựng các mô hình phân loại
Đánh giá hiệu suất của các mô hình phân loại
Giới thiệu
KNN (K-Nearest Neighbors) là một trong những thuật toán học có giám sát đơn giản nhất được sử dụng nhiều trong khai phá dữ liệu và học máy. Ý tưởng của thuật toán này là nó không học một điều gì từ tập dữ liệu học (nên KNN được xếp vào loại lazy learning), mọi tính toán được thực hiện khi nó cần dự đoán nhãn của dữ liệu mới.
Lớp (nhãn) của một đối tượng dữ liệu mới có thể dự đoán từ các lớp (nhãn) của k hàng xóm gần nó nhất.
Giả sử ta có D là tập các dữ liệu đã được phân loại thành 2 nhãn (+) và (-) được biểu diễn trên trục tọa độ như hình vẽ và một điểm dữ liệu mới A chưa biết nhãn Vậy làm cách nào để chúng ta có thể xác định được nhãn của A là (+) hay (-)?
Hình 1 : Mô hình thuật toán KNN
Có thể thấy cách đơn giản nhất là so sánh tất cả các đặc điểm của dữ liệu A với tất cả tập dữ liệu học đã được gắn nhãn và xem nó giống cái nào nhất, nếu dữ liệu (đặc điểm) của A giống với dữ liệu của điểm mang nhãn (+) thì điểm A mang nhãn (+), nếu dữ liệu A giống với dữ liệu nhãn (-) hơn thì nó mang nhãn (-)
Trong trường hợp của KNN, thực tế nó không so sánh dữ liệu mới (không được phân lớp) với tất cả các dữ liệu khác, thực tế nó thực hiện một phép tính toán học để đo khoảng cách giữa dữ liệu mới với tất cả các điểm trong tập dữ liệu học D để thực hiện phân lớp Phép tính khoảng cách giữa 2 điểm có thể là Euclidian, Manhattan, trọng số, Minkowski, …
Trong báo cáo này sẽ tính khoảng cách theo công thức Euclidian:
Hình 2 : Công thức khoảng cách Euclidian
Các bước xây dựng thuật toán KNN:
1 Ta có D là tập các điểm dữ liệu đã được gắn nhãn và A là dữ liệu chưa được phân loại.
2 Đo khoảng cách Euclidian từ dữ liệu mới A đến tất cả các dữ liệu khác đã được phân loại trong D.
3 Chọn K (K là tham số mà bạn định nghĩa) khoảng cách nhỏ nhất.
4 Kiểm tra danh sách các lớp có khoảng cách ngắn nhất và đếm số lượng của mỗi lớp xuất hiện.
5 Lấy đúng lớp (lớp xuất hiện nhiều lần nhất).
6 Lớp của dữ liệu mới là lớp mà bạn đã nhận được ở bước 5.
Hình 3 : Tập dữ liệu D và điểm A(3, 9) cần phân loại nhãn
Giả sử ta có tập dữ liệu D có gắn nhãn gồm 15 điểm như trên ảnh.
1 Điểm cần dự đoán nhãn A(3,9)
2 Ta tính khoảng cách từ điểm A đến các điểm dữ liệu trong D bằng công thức Euclidian.
3 Ta chọn K= 5, và tìm ra 5 điểm có khoảng cách gần với điểm A nhất.
4 Trong 5 điểm ta thấy có 4 điểm mang nhãn (+) và 1 điểm mang nhãn (-).
5 Vậy ta có thể đưa ra kết luận là điểm A cần dự đoán mang nhãn (+).
Hình 4 : Chọn K = 5 điểm gần nhất với A(3 , 9) nhất
Triển khai
Xây dựng model KNN tính khoảng cách bằng Euclidean:
Hình 5 : Code triển khai thuật toán KNN
Toàn bộ mã nguồn trên xây dựng một mô hình KNN có khả năng huấn luyện trên dữ liệu và dự đoán nhãn cho các điểm dữ liệu mới Phương thức fit được sử dụng để đưa dữ liệu huấn luyện vào mô hình, sau đó phương thức predict được sử dụng để dự đoán nhãn cho các điểm dữ liệu mới.
Hàm euclidean_distance để tính khoảng cách Euclidean giữa hai điểm x1 và x2.Khoảng cách Euclidean được tính bằng cách lấy căn bậc hai của tổng bình phương của hiệu của các thành phần tương ứng trong x1 và x2.
Class KNN (K-Nearest Neighbors) triển khai thuật toán phân loại:
- Phương thức init (self, k=3) được gọi khi một đối tượng KNN được khởi tạo k là số lượng láng giềng gần nhất được sử dụng trong quá trình dự đoán Giá trị mặc định của k là 3.
- Phương thức fit(self, X, y) được sử dụng để đưa dữ liệu huấn luyện vào mô hình X là tập các điểm dữ liệu huấn luyện và y là nhãn tương ứng của các điểm dữ liệu đó.
- Phương thức predict(self, X) được sử dụng để dự đoán nhãn của các điểm dữ liệu trong X Phương thức này trả về một danh sách các nhãn dự đoán tương ứng với các điểm dữ liệu trong X.
- Phương thức _predict(self, x) là một phương thức bên trong lớp KNN và được sử dụng để dự đoán nhãn của một điểm dữ liệu x cụ thể.
- Đầu tiên, phương thức tính toán khoảng cách giữa điểm dữ liệu x và tất cả các điểm dữ liệu huấn luyện trong self.X_train bằng cách sử dụng hàm euclidean_distance.
- Sau đó, phương thức chọn ra k điểm có khoảng cách gần nhất bằng cách sắp xếp các khoảng cách và lấy k chỉ số đầu tiên.
- Tiếp theo, phương thức lấy danh sách các nhãn tương ứng với k điểm gần nhất.
- Cuối cùng, phương thức sử dụng phương pháp "bầu chọn đa số đa số" (majority vote) để chọn ra nhãn dự đoán cho điểm dữ liệu x dựa trên k điểm gần nhất đã tìm được Nghĩa là, phương pháp này đếm số lần xuất hiện của mỗi nhãn trong k điểm gần nhất và chọn nhãn có số lần xuất hiện nhiều nhất làm nhãn dự đoán cho x.
Triển khai model KNN trên tập dữ liệu Diagnostic Wisconsin: o Tìm giá trị K (số láng giềng) gần nhất sao cho tỷ lệ lỗi trung bình thấp nhất, giá trị K này có thể được sử dụng để xây dựng mô hình KNN cuối cùng để dự đoán nhãn cho dữ liệu mới:
Hình 6 : Hàm tính tỉ lệ lỗi cho các giá trị K = {1, ,41} o Đầu tiên, một danh sách rỗng error_rate được khởi tạo để lưu trữ tỷ lệ lỗi mô hình KNN. o Trong mỗi vòng lặp, một đối tượng KNN được khởi tạo với giá trị k hiện tại. o Mô hình KNN được huấn luyện bằng cách sử dụng phương thức fit trên dữ liệu huấn luyện X_train và nhãn tương ứng y_train. o Sau đó, phương thức predict được sử dụng để dự đoán nhãn cho dữ liệu kiểm tra X_test. o Tỷ lệ lỗi được tính bằng cách so sánh nhãn dự đoán pred_i với nhãn thực tế y_test và tính trung bình của các phần tử khác nhau. o Giá trị tỷ lệ lỗi trung bình được thêm vào danh sách error_rate. o Sau khi vòng lặp kết thúc, danh sách error_rate chứa tỷ lệ lỗi trung bình cho từng giá trị k.
Vẽ biểu đồ error_rate để tìm ra K cho tỉ lễ lỗi trung bình thấp nhất:
Hình 7 : Vẽ biểu đồ các tỉ lệ lỗi dùng matplotlib
Hình 8 : Biểu đồ tỉ lệ lỗi với các giá trị K
Từ biểu đồ trên ta thấy giá trị k = {13, 25, 31} là cho tỉ lệ lỗi trung bình thấp nhất (~6%), hay ta có thể thấy được độ chính xác so với tập dữ liệu ban đầu (~94%) là cao nhất.
Hiệu suất
Để đánh giá hiệu suất tốt nhất của mô hình KNN chúng ta sẽ chọn 1 trong số giá trị K vừa tìm được, ở đây chúng ta sẽ chọn K = 15, sau đó đưa tập dữ liệu X_train, y_train vào hàm fit() để train model, cuối cùng là trả về mảng predictions2 qua hàm predict() với tham số truyền vào là tập dữ liệu dùng để test X_tetst
Sau đó chúng ta sẽ tính tổng số lượng các phân loại chính xác trên tổng số lượng cần phân loại sẽ ra được hiệu suất của thuật toán:
Hình 9 : Hiệu suất K tốt nhất K = 15
Kết quả trả về, độ chính xác xấp xỉ: ~ 93.8%
Đơn giản và dễ triển khai: Thuật toán KNN là một thuật toán đơn giản và dễ hiểu, phù hợp cho việc khám phá và phân loại dữ liệu ung thư vú trong tập dữ liệu này.
Tích hợp thông tin cục bộ: KNN tính toán dự đoán dựa trên các điểm gần nhất trong tập dữ liệu huấn luyện Điều này cho phép KNN nắm bắt thông tin cục bộ trong dữ liệu ung thư vú, chẳng hạn như kích thước và hình dạng của nhân tế bào, giúp phân loại chính xác hơn.
Khả năng phân loại đa lớp: KNN có thể dễ dàng được mở rộng để phân loại ung thư vú thành hai lớp: ung thư ác tính và ung thư lành tính.
Độ phức tạp tính toán: KNN yêu cầu 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 trong tập dữ liệu huấn luyện Với bộ dữ liệu có kích thước lớn như Breast Cancer Wisconsin Data Set, điều này có thể tạo ra một độ phức tạp tính toán cao.
Yêu cầu bộ nhớ lớn: KNN cần lưu toàn bộ tập dữ liệu huấn luyện trong bộ nhớ để tính toán khoảng cách và tìm các điểm gần nhất Vì vậy, với tập dữ liệu Breast Cancer Wisconsin Data Set có kích thước
569 mẫu, cần có đủ bộ nhớ để xử lý.
Nhạy cảm với dữ liệu nhiễu: KNN có thể bị ảnh hưởng bởi các điểm dữ liệu nhiễu hoặc các điểm dữ liệu có giá trị bất thường trong tập dữ b) Logistic Regression
Logistic regression là một phương pháp học máy phổ biến trong lĩnh vực phân loại và dự đoán Được đặt tên theo hàm logistic, phương pháp này được sử dụng để ước lượng xác suất xảy ra của một biến phụ thuộc nhị phân dựa trên các biến đầu vào.
Mục tiêu chính của logistic regression là tìm một mô hình tuyến tính để dự đoán xác suất xảy ra của sự kiện quan tâm Mặc dù tên gọi có chứa từ
"regression" (hồi quy), logistic regression thực chất là một phương pháp phân loại Nó được sử dụng khi biến phụ thuộc là một biến nhị phân hoặc có thể được chuyển đổi thành biến nhị phân.
Các ký hiệu được sử dụng : θ : tham số tương ứng với các feature m : số bộ dữ liệu dùng để train ( là các hàng trong data train)
X : inputs , tất cả các đặc trưng của dữ liệu y : outputs , giá trị kết quả x i , y i : giá trị hàng thứ i của tập X và kết quả thứ i của y n : số đặc trưng của bộ dữ liệu h θ ( x ) : hàm giả thuyết
Vì là bài toán phân loại nhị phân nên giá trị hàm giả thuyết sẽ đưa về khoảng 0 và 1
Do đó áp dụng hàm sigmoid ( hàm này chỉ được dùng cho bài toán phân loại nhị phần) + đường biên phân chia của hàm sigmoid là 0.5 để phân chia ranh giới Điều muốn 0< h θ ( x )