Hướng dẫn dứt khoát về hồi quy logistic trong Python PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Hướng dẫn rõ ràng về hồi quy logistic bằng Python

Giới thiệu

Đôi khi nhầm lẫn với hồi quy tuyến tính bởi người mới - do chia sẻ thuật ngữ hồi quyhồi quy logistic khác xa với hồi quy tuyến tính. Trong khi hồi quy tuyến tính dự đoán các giá trị như 2, 2.45, 6.77 hoặc giá trị liên tục, làm cho nó trở thành hồi quy thuật toán, hồi quy logistic dự đoán các giá trị như 0 hoặc 1, 1 hoặc 2 hoặc 3, giá trị rời rạc, làm cho nó trở thành phân loại thuật toán. Có, nó được gọi là hồi quy nhưng là một phân loại thuật toán. Thêm vào đó trong một thời điểm.

Do đó, nếu vấn đề khoa học dữ liệu của bạn liên quan đến các giá trị liên tục, bạn có thể áp dụng hồi quy thuật toán (hồi quy tuyến tính là một trong số chúng). Mặt khác, nếu nó liên quan đến việc phân loại đầu vào, giá trị rời rạc hoặc lớp, bạn có thể áp dụng phân loại thuật toán (hồi quy logistic là một trong số đó).

Trong hướng dẫn này, chúng tôi sẽ thực hiện hồi quy logistic bằng Python với thư viện Scikit-Learn. Chúng tôi cũng sẽ giải thích tại sao từ "hồi quy" có trong tên và cách hoạt động của hồi quy logistic.

Để làm điều đó, trước tiên chúng tôi sẽ tải dữ liệu sẽ được phân loại, hiển thị và xử lý trước. Sau đó, chúng tôi sẽ xây dựng một mô hình hồi quy logistic sẽ hiểu được dữ liệu đó. Mô hình này sau đó sẽ được đánh giá và sử dụng để dự đoán các giá trị dựa trên đầu vào mới.

Động lực

Công ty bạn đang làm việc đã hợp tác với một trang trại nông nghiệp của Thổ Nhĩ Kỳ. Sự hợp tác này liên quan đến việc bán hạt bí ngô. Hạt bí ngô rất quan trọng đối với dinh dưỡng của con người. Chúng chứa một tỷ lệ tốt của carbohydrate, chất béo, protein, canxi, kali, phốt pho, magiê, sắt và kẽm.

Trong nhóm khoa học dữ liệu, nhiệm vụ của bạn là chỉ ra sự khác biệt giữa các loại hạt bí ngô bằng cách sử dụng dữ liệu - hoặc phân loại dữ liệu theo loại hạt giống.

Trang trại Thổ Nhĩ Kỳ làm việc với hai loại hạt giống bí ngô, một loại được gọi là Çerçevelik và điều khác Ürgüp Sivrisi.

Để phân loại hạt bí ngô, nhóm của bạn đã làm theo bài báo năm 2021 “Việc sử dụng phương pháp học máy trong phân loại hạt bí ngô (Cucurbita pepo L.). Nguồn gen và sự tiến hóa của cây trồng ” từ Koklu, Sarigil và Ozbek - trong bài báo này, có một phương pháp để chụp ảnh và trích xuất các phép đo hạt giống từ các hình ảnh.

Sau khi hoàn thành quá trình được mô tả trong bài báo, các phép đo sau được trích xuất:

  • Khu vực - số lượng pixel trong đường viền của hạt bí ngô
  • Chu vi - chu vi tính bằng pixel của hạt bí ngô
  • Chiều dài trục chính - cũng là chu vi tính bằng pixel của hạt bí ngô
  • Chiều dài trục nhỏ - khoảng cách trục nhỏ của hạt bí ngô
  • Độ lệch tâm - độ lệch tâm của hạt bí ngô
  • Vùng lồi - số pixel của vỏ lồi nhỏ nhất tại vùng hình thành bởi hạt bí ngô
  • Mức độ - tỷ lệ của diện tích hạt bí ngô với pixel hộp giới hạn
  • Đường kính tương đương - căn bậc hai của phép nhân diện tích hạt bí ngô với bốn chia cho số pi
  • Nhỏ gọn - tỉ lệ diện tích của hạt bí so với diện tích của hình tròn có cùng chu vi
  • Độ cứng - tình trạng lồi lõm của hạt bí ngô
  • Tròn - sự noãn của hạt bí ngô mà không xét đến sự biến dạng các cạnh của nó
  • Aspect Ratio - tỷ lệ các hạt bí ngô

Đó là những phép đo bạn phải làm việc với. Bên cạnh các phép đo, còn có Lớp nhãn cho hai loại hạt bí ngô.

Để bắt đầu phân loại hạt giống, hãy nhập dữ liệu và bắt đầu xem xét nó.

Hiểu tập dữ liệu

Lưu ý: Bạn có thể tải xuống bộ dữ liệu bí ngô tại đây.

Sau khi tải xuống tập dữ liệu, chúng tôi có thể tải nó vào cấu trúc khung dữ liệu bằng cách sử dụng pandas thư viện. Vì nó là một tệp excel, chúng tôi sẽ sử dụng read_excel() phương pháp:

import pandas as pd

fpath = 'dataset/pumpkin_seeds_dataset.xlsx' 
df = pd.read_excel(fpath)

Sau khi dữ liệu được tải vào, chúng ta có thể xem nhanh 5 hàng đầu tiên bằng cách sử dụng head() phương pháp:

df.head() 

Kết quả này trong:

	Area 	Perimeter 	Major_Axis_Length 	Minor_Axis_Length 	Convex_Area 	Equiv_Diameter 	Eccentricity 	Solidity 	Extent 	Roundness 	Aspect_Ration 	Compactness 	Class
0 	56276 	888.242 	326.1485 			220.2388 			56831 			267.6805 		0.7376 			0.9902 		0.7453 	0.8963 		1.4809 			0.8207 			Çerçevelik
1 	76631 	1068.146 	417.1932 			234.2289 			77280 			312.3614 		0.8275 			0.9916 		0.7151 	0.8440 		1.7811 			0.7487 			Çerçevelik
2 	71623 	1082.987 	435.8328 			211.0457 			72663 			301.9822 		0.8749 			0.9857 		0.7400 	0.7674 		2.0651 			0.6929 			Çerçevelik
3 	66458 	992.051 	381.5638 			222.5322 			67118 			290.8899 		0.8123 			0.9902 		0.7396 	0.8486 		1.7146 			0.7624 			Çerçevelik
4 	66107 	998.146 	383.8883 			220.4545 			67117 			290.1207 		0.8187 			0.9850 		0.6752 	0.8338 		1.7413 			0.7557 			Çerçevelik

Tại đây, chúng tôi có tất cả các phép đo trong các cột tương ứng của chúng, Tính năng, đặc điểmvà cả Lớp cột, của chúng tôi mục tiêu, là cái cuối cùng trong khung dữ liệu. Chúng tôi có thể xem chúng tôi có bao nhiêu phép đo bằng cách sử dụng shape thuộc tính:

df.shape 

Đầu ra là:

(2500, 13)

Kết quả hình dạng cho chúng ta biết rằng có 2500 mục nhập (hoặc hàng) trong tập dữ liệu và 13 cột. Vì chúng tôi biết có một cột mục tiêu - điều này có nghĩa là chúng tôi có 12 cột tính năng.

Bây giờ chúng ta có thể khám phá biến mục tiêu, hạt bí ngô Class. Vì chúng ta sẽ dự đoán biến đó, nên thật thú vị khi xem chúng ta có bao nhiêu mẫu mỗi hạt bí ngô. Thông thường, sự khác biệt giữa số lượng cá thể trong các lớp của chúng ta càng nhỏ thì mẫu của chúng ta càng cân bằng và dự đoán của chúng ta càng tốt.

Việc kiểm tra này có thể được thực hiện bằng cách đếm từng mẫu hạt với value_counts() phương pháp:

df['Class'].value_counts() 

Đoạn mã trên hiển thị:

Çerçevelik       1300
Ürgüp Sivrisi    1200
Name: Class, dtype: int64

Chúng ta có thể thấy rằng có 1300 mẫu Çerçevelik hạt giống và 1200 mẫu của Ürgüp Sivrisi hạt giống. Lưu ý rằng sự khác biệt giữa chúng là 100 mẫu, một sự khác biệt rất nhỏ, điều này tốt cho chúng tôi và cho thấy không cần phải cân bằng lại số lượng mẫu.

Hãy cũng xem thống kê mô tả về các tính năng của chúng tôi với describe() để xem dữ liệu được phân phối tốt như thế nào. Chúng tôi cũng sẽ chuyển bảng kết quả với T để so sánh giữa các thống kê dễ dàng hơn:

df.describe().T

Bảng kết quả là:

					count 	mean 			std 			min 		25% 			50% 			75% 			max
Area 				2500.0 	80658.220800 	13664.510228 	47939.0000 	70765.000000 	79076.00000 	89757.500000 	136574.0000
Perimeter 			2500.0 	1130.279015 	109.256418 		868.4850 	1048.829750 	1123.67200 		1203.340500 	1559.4500
Major_Axis_Length 	2500.0 	456.601840 		56.235704 		320.8446 	414.957850 		449.49660 		492.737650 		661.9113
Minor_Axis_Length 	2500.0 	225.794921 		23.297245 		152.1718 	211.245925 		224.70310 		240.672875 		305.8180
Convex_Area 		2500.0 	81508.084400 	13764.092788 	48366.0000 	71512.000000 	79872.00000 	90797.750000 	138384.0000
Equiv_Diameter 		2500.0 	319.334230 		26.891920 		247.0584 	300.167975 		317.30535 		338.057375 		417.0029
Eccentricity 		2500.0 	0.860879 		0.045167 		0.4921 		0.831700 		0.86370 		0.897025 		0.9481
Solidity 			2500.0 	0.989492 		0.003494 		0.9186 		0.988300 		0.99030 		0.991500 		0.9944
Extent 				2500.0 	0.693205 		0.060914 		0.4680 		0.658900 		0.71305 		0.740225 		0.8296
Roundness 			2500.0 	0.791533 		0.055924 		0.5546 		0.751900 		0.79775 		0.834325 		0.9396
Aspect_Ration 		2500.0 	2.041702 		0.315997 		1.1487 		1.801050 		1.98420 		2.262075 		3.1444
Compactness 		2500.0 	0.704121 		0.053067 		0.5608 		0.663475 		0.70770 		0.743500 		0.9049

Bằng cách nhìn vào bảng, khi so sánh nghĩa làđộ lệch chuẩn (std), có thể thấy rằng hầu hết các tính năng đều có giá trị trung bình khác xa với độ lệch chuẩn. Điều đó cho thấy rằng các giá trị dữ liệu không tập trung xung quanh giá trị trung bình mà nằm rải rác xung quanh nó hơn - nói cách khác, chúng có tính thay đổi cao.

Ngoài ra, khi nhìn vào tối thiểu (min) Và tối đa (max), một số tính năng, chẳng hạn như AreaConvex_Area, có sự khác biệt lớn giữa giá trị tối thiểu và tối đa. Điều này có nghĩa là các cột đó có dữ liệu rất nhỏ và giá trị dữ liệu cũng rất lớn, hoặc biên độ cao hơn giữa các giá trị dữ liệu.

Với khả năng thay đổi cao, biên độ cao và các tính năng với các đơn vị đo lường khác nhau, hầu hết dữ liệu của chúng tôi sẽ được hưởng lợi từ việc có cùng một thang đo cho tất cả các tính năng hoặc thu nhỏ. Việc chia tỷ lệ dữ liệu sẽ tập trung dữ liệu xung quanh giá trị trung bình và giảm phương sai của nó.

Kịch bản này cũng có thể chỉ ra rằng có những giá trị ngoại lệ và giá trị cực đoan trong dữ liệu. Vì vậy, tốt nhất là bạn nên có một số điều trị ngoại lệ bên cạnh việc mở rộng dữ liệu.

Có một số thuật toán học máy, ví dụ, các thuật toán dựa trên cây như Phân loại rừng ngẫu nhiên, không bị ảnh hưởng bởi phương sai dữ liệu cao, giá trị ngoại lai và giá trị cực đoan. Hồi quy logistic thì khác, nó dựa trên một hàm phân loại các giá trị của chúng ta và các tham số của hàm đó có thể bị ảnh hưởng bởi các giá trị nằm ngoài xu hướng dữ liệu chung và có phương sai cao.

Chúng ta sẽ hiểu thêm về hồi quy logistic sau một chút khi chúng ta bắt đầu triển khai nó. Hiện tại, chúng tôi có thể tiếp tục khám phá dữ liệu của mình.

Lưu ý: Có một câu nói phổ biến trong Khoa học Máy tính: “Rác vào, rác ra” (GIGO), điều đó rất phù hợp cho việc học máy. Điều này có nghĩa là khi chúng ta có dữ liệu rác - các phép đo không mô tả hiện tượng, dữ liệu không được hiểu và chuẩn bị tốt theo loại thuật toán hoặc mô hình, sẽ có khả năng tạo ra kết quả không chính xác và không hoạt động. một ngày cơ sở.
Đây là một trong những lý do tại sao việc khám phá, hiểu dữ liệu và cách hoạt động của mô hình đã chọn là rất quan trọng. Bằng cách đó, chúng ta có thể tránh bỏ rác vào mô hình của mình - thay vào đó, hãy đặt giá trị vào đó và nhận ra giá trị.

Trực quan hóa dữ liệu

Cho đến nay, với các thống kê mô tả, chúng tôi có một cái nhìn sơ lược về một số chất lượng của dữ liệu. Một bước quan trọng khác là hình dung nó và xác nhận giả thuyết của chúng tôi về phương sai, biên độ và giá trị ngoại lệ cao. Để xem liệu những gì chúng ta đã quan sát được cho đến nay có hiển thị trong dữ liệu hay không, chúng ta có thể vẽ một số biểu đồ.

Cũng rất thú vị khi xem các tính năng có liên quan như thế nào đến hai lớp sẽ được dự đoán. Để làm điều đó, hãy nhập seaborn gói và sử dụng pairplot biểu đồ để xem xét từng phân bố đối tượng và từng phân tách lớp cho mỗi đối tượng:

import seaborn as sns


sns.pairplot(data=df, hue='Class')

Lưu ý: Đoạn mã trên có thể mất một lúc để chạy, vì cặp mã kết hợp các biểu đồ phân tán của tất cả các tính năng (nó có thể) và cũng hiển thị các phân phối tính năng.

Nhìn vào cặp lô, chúng ta có thể thấy rằng trong hầu hết các trường hợp, điểm của Çerçevelik lớp được tách biệt rõ ràng khỏi các điểm của Ürgüp Sivrisi lớp. Điểm của một lớp ở bên phải khi các lớp khác ở bên trái, hoặc một số điểm lên trong khi các điểm khác ở dưới. Nếu chúng ta sử dụng một số loại đường cong hoặc đường để phân tách các lớp, điều này cho thấy việc tách chúng ra sẽ dễ dàng hơn, nếu chúng được trộn lẫn với nhau, việc phân loại sẽ là một nhiệm vụ khó khăn hơn.

Trong tạp chí Eccentricity, CompactnessAspect_Ration các cột, một số điểm “bị cô lập” hoặc lệch khỏi xu hướng dữ liệu chung - các điểm ngoại lệ - cũng dễ dàng được phát hiện.

Khi nhìn vào đường chéo từ phía trên bên trái đến phía dưới bên phải của biểu đồ, hãy lưu ý rằng các phân bố dữ liệu cũng được mã hóa màu theo các lớp của chúng ta. Hình dạng phân bố và khoảng cách giữa cả hai đường cong là những chỉ số khác về mức độ phân tách của chúng - càng xa nhau càng tốt. Trong hầu hết các trường hợp, chúng không được xếp chồng lên nhau, có nghĩa là chúng dễ tách biệt hơn, cũng góp phần vào nhiệm vụ của chúng ta.

Theo trình tự, chúng ta cũng có thể vẽ đồ thị hộp của tất cả các biến với sns.boxplot() phương pháp. Trong hầu hết các trường hợp, việc định hướng các ô hộp theo chiều ngang sẽ rất hữu ích, vì vậy hình dạng của các ô vuông giống với các hình dạng phân bố, chúng ta có thể làm điều đó với orient tranh luận:


sns.boxplot(data=df, orient='h') 

Hướng dẫn dứt khoát về hồi quy logistic trong Python PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Trong cốt truyện ở trên, hãy chú ý rằng AreaConvex_Area có độ lớn cao như vậy khi so sánh với độ lớn của các cột khác, đến mức chúng làm vuông góc các ô hộp khác. Để có thể xem xét tất cả các ô hộp, chúng ta có thể chia tỷ lệ các tính năng và vẽ lại chúng.

Trước khi làm điều đó, chúng ta hãy hiểu rằng nếu có các giá trị của các đối tượng có liên quan mật thiết đến các giá trị khác - nếu có các giá trị cũng lớn hơn khi các giá trị của đối tượng khác lớn hơn, có mối tương quan thuận; hoặc nếu có các giá trị làm ngược lại, sẽ nhỏ hơn trong khi các giá trị khác nhỏ hơn, có tương quan tiêu cực.

Điều quan trọng là phải xem xét vì có mối quan hệ chặt chẽ trong dữ liệu có thể có nghĩa là một số cột được bắt nguồn từ các cột khác hoặc có ý nghĩa tương tự với mô hình của chúng tôi. Khi điều đó xảy ra, kết quả mô hình có thể được đánh giá quá cao và chúng tôi muốn kết quả gần với thực tế hơn. Nếu có mối tương quan chặt chẽ, điều đó cũng có nghĩa là chúng ta có thể giảm số lượng đối tượng địa lý và sử dụng ít cột hơn, làm cho mô hình nhiều hơn giống nhau.

Lưu ý: Mối tương quan mặc định được tính toán với corr() phương pháp là Hệ số tương quan Pearson. Hệ số này được chỉ ra khi dữ liệu là định lượng, được phân phối bình thường, không có giá trị ngoại lệ và có mối quan hệ tuyến tính.

Một sự lựa chọn khác sẽ là tính toán Hệ số tương quan của Spearman. Hệ số Spearman được sử dụng khi dữ liệu là thứ tự, phi tuyến tính, có bất kỳ phân phối nào và có các giá trị ngoại lai. Lưu ý rằng dữ liệu của chúng tôi không hoàn toàn phù hợp với các giả định của Pearson hoặc Spearman (cũng có nhiều phương pháp tương quan hơn, chẳng hạn như của Kendall). Vì dữ liệu của chúng tôi là định lượng và điều quan trọng là chúng tôi phải đo lường mối quan hệ tuyến tính của nó, chúng tôi sẽ sử dụng hệ số Pearson.

Chúng ta hãy xem xét mối tương quan giữa các biến và sau đó chúng ta có thể chuyển sang xử lý trước dữ liệu. Chúng tôi sẽ tính toán các mối tương quan với corr() phương pháp và trực quan hóa chúng với Seaborn's heatmap(). Kích thước tiêu chuẩn của bản đồ nhiệt có xu hướng nhỏ, vì vậy chúng tôi sẽ nhập matplotlib (công cụ / thư viện trực quan hóa chung mà Seaborn được xây dựng bên trên) và thay đổi kích thước bằng figsize:

import matplotlib.pyplot as plt
plt.figure(figsize=(15, 10))

correlations = df.corr()
sns.heatmap(correlations, annot=True) 

Hướng dẫn dứt khoát về hồi quy logistic trong Python PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Trong bản đồ nhiệt này, các giá trị gần 1 hoặc -1 là các giá trị chúng ta cần chú ý. Trường hợp đầu tiên, biểu thị mối tương quan dương cao và trường hợp thứ hai, tương quan âm cao. Cả hai giá trị, nếu không trên 0.8 hoặc -0.8 sẽ có lợi cho mô hình hồi quy logistic của chúng tôi.

Khi có mối tương quan cao, chẳng hạn như một trong những 0.99 giữa Aspec_RationCompactness, điều này có nghĩa là chúng tôi có thể chọn chỉ sử dụng Aspec_Ration hoặc chỉ Compactness, thay vì cả hai (vì chúng gần như bằng nhau người dự đoán của nhau). Điều tương tự đối với EccentricityCompactness với một -0.98 tương quan, cho AreaPerimeter với một 0.94 tương quan và một số cột khác.

Xử lý trước dữ liệu

Vì chúng tôi đã khám phá dữ liệu trong một thời gian, chúng tôi có thể bắt đầu xử lý trước nó. Hiện tại, hãy sử dụng tất cả các tính năng để dự đoán lớp học. Sau khi có được một mô hình đầu tiên, một đường cơ sở, sau đó chúng ta có thể loại bỏ một số cột có tương quan cao và so sánh nó với đường cơ sở.

Các cột tính năng sẽ là X dữ liệu và cột lớp, y dữ liệu mục tiêu:

y = df['Class']
X = df.drop(columns=['Class'], axis=1)

Chuyển các đối tượng phân loại thành đối tượng số

Về chúng tôi Class cột - các giá trị của nó không phải là số, điều này có nghĩa là chúng ta cũng cần phải biến đổi chúng. Có nhiều cách để thực hiện chuyển đổi này; ở đây, chúng tôi sẽ sử dụng replace() phương pháp và thay thế Çerçevelik đến 0Ürgüp Sivrisi đến 1.

y = y.replace('Çerçevelik', 0).replace('Ürgüp Sivrisi', 1)

Hãy ghi nhớ bản đồ! Khi đọc kết quả từ mô hình của bạn, ít nhất bạn sẽ muốn chuyển đổi những kết quả này trở lại trong tâm trí của mình hoặc trở lại thành tên lớp cho những người dùng khác.

Phân chia dữ liệu thành các tập huấn luyện và thử nghiệm

Trong quá trình khám phá của mình, chúng tôi đã lưu ý rằng các tính năng cần mở rộng quy mô. Nếu chúng tôi mở rộng quy mô ngay bây giờ hoặc theo cách tự động, chúng tôi sẽ chia tỷ lệ giá trị với toàn bộ Xy. Trong trường hợp đó, chúng tôi sẽ giới thiệu rò rỉ dữ liệu, vì các giá trị của tập hợp thử nghiệm sắp có sẽ ảnh hưởng đến tỷ lệ. Rò rỉ dữ liệu là nguyên nhân phổ biến dẫn đến kết quả không thể thu được và hiệu suất cao ảo tưởng của các mô hình ML.

Suy nghĩ về việc mở rộng quy mô cho thấy rằng trước tiên chúng ta cần tách Xy dữ liệu thêm vào các tập huấn luyện và thử nghiệm, sau đó đến phù hợp với một thước đo tỷ lệ trên tập huấn luyện và để biến đổi cả bộ thử nghiệm và huấn luyện (mà không bao giờ để tập hợp thử nghiệm tác động đến bộ chia tỷ lệ thực hiện điều này). Đối với điều này, chúng tôi sẽ sử dụng Scikit-Learn's train_test_split() phương pháp:

from sklearn.model_selection import train_test_split
SEED = 42 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=.25, 
                                                    random_state=SEED)

Cài đặt test_size=.25 đảm bảo rằng chúng tôi đang sử dụng 25% dữ liệu để thử nghiệm và 75% cho đào tạo. Điều này có thể bị bỏ qua, một khi nó là phần tách mặc định, nhưng Kim tự tháp cách viết mã khuyên rằng “rõ ràng tốt hơn là ngầm hiểu”.

Lưu ý: Câu "rõ ràng tốt hơn là ngầm hiểu" là ám chỉ đến Zen của Pythonhoặc PEP20. Nó đưa ra một số gợi ý để viết mã Python. Nếu những đề xuất đó được tuân theo, mã được coi là Kim tự tháp. Bạn có thể biết thêm về nó tại đây.

Sau khi tách dữ liệu thành các tập huấn luyện và thử nghiệm, cách tốt là xem có bao nhiêu bản ghi trong mỗi tập. Điều đó có thể được thực hiện với shape thuộc tính:

X_train.shape, X_test.shape, y_train.shape, y_test.shape

Điều này hiển thị:

((1875, 12), (625, 12), (1875,), (625,))

Chúng ta có thể thấy rằng sau khi chia tách, chúng ta có 1875 hồ sơ để đào tạo và 625 hồ sơ để thử nghiệm.

Dữ liệu tỷ lệ

Khi chúng tôi đã chuẩn bị xong các tập huấn luyện và kiểm tra, chúng tôi có thể tiến hành chia tỷ lệ dữ liệu với Scikit-Learn StandardScaler đối tượng (hoặc các tỷ lệ khác do thư viện cung cấp). Để tránh rò rỉ, bộ chia tỷ lệ được lắp vào X_train dữ liệu và các giá trị của chuyến tàu sau đó được sử dụng để chia tỷ lệ - hoặc chuyển đổi - cả dữ liệu chuyến tàu và dữ liệu thử nghiệm:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

Vì bạn thường gọi:

scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

Hai dòng đầu tiên có thể được thu gọn bằng một số ít fit_transform() gọi, phù hợp với bộ chia tỷ lệ trên tập hợp và biến đổi nó chỉ trong một lần. Bây giờ chúng ta có thể tái tạo các biểu đồ hình hộp để thấy sự khác biệt sau khi chia tỷ lệ dữ liệu.

Xem xét việc chia tỷ lệ loại bỏ các tên cột, trước khi vẽ biểu đồ, chúng ta có thể tổ chức dữ liệu tàu vào một khung dữ liệu với các tên cột một lần nữa để tạo điều kiện trực quan:

column_names = df.columns[:12] 
X_train = pd.DataFrame(X_train, columns=column_names)

sns.boxplot(data=X_train, orient='h')

Hướng dẫn dứt khoát về hồi quy logistic trong Python PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Cuối cùng thì chúng ta cũng có thể thấy tất cả các ô hộp của mình! Lưu ý rằng tất cả chúng đều có giá trị ngoại lệ và các tính năng thể hiện phân phối xa hơn bình thường (có các đường cong lệch sang trái hoặc phải), chẳng hạn như Solidity, Extent, Aspect_RationCompactedness, giống nhau có tương quan cao hơn.

Loại bỏ các ngoại lệ bằng phương pháp IQR

Chúng ta đã biết rằng hồi quy logistic có thể bị tác động bởi các yếu tố ngoại lai. Một trong những cách điều trị chúng là sử dụng một phương pháp được gọi là Dải phân vị or I.Q.R.. Bước đầu tiên của phương pháp IQR là chia dữ liệu chuyến tàu của chúng ta thành bốn phần, được gọi là tứ phân vị. Phần tư đầu tiên, Q1, chiếm 25% dữ liệu, thứ hai, Q2, đến 50%, thứ ba, Q3, đến 75% và là người cuối cùng, Q4, đến 100%. Các ô trong ô boxplot được xác định bằng phương pháp IQR và là hình ảnh đại diện cho nó.

Xét một ô vuông nằm ngang, đường thẳng đứng ở bên trái đánh dấu 25% dữ liệu, đường thẳng đứng ở giữa, 50% dữ liệu (hoặc trung vị) và đường thẳng đứng cuối cùng ở bên phải, 75% dữ liệu . Cả hai hình vuông được xác định bởi các đường thẳng đứng có kích thước càng đồng đều - hoặc càng có nhiều đường thẳng đứng ở giữa - có nghĩa là dữ liệu của chúng tôi gần với phân phối chuẩn hơn hoặc ít bị lệch hơn, điều này rất hữu ích cho việc phân tích của chúng tôi.

Bên cạnh hộp IQR còn có các đường kẻ ngang ở hai bên. Các dòng đó đánh dấu các giá trị phân phối tối thiểu và tối đa được xác định bởi

$$
Tối thiểu = Q1 - 1.5 * IQR
$$

$$
Tối đa = Q3 + 1.5 * IQR
$$

IQR chính xác là sự khác biệt giữa Q3 và Q1 (hoặc Q3 - Q1) và nó là điểm trung tâm nhất của dữ liệu. Đó là lý do tại sao khi tìm IQR, chúng tôi kết thúc việc lọc các giá trị ngoại lệ trong các chi tiết dữ liệu, hoặc trong các điểm tối thiểu và tối đa. Các ô hình hộp cho chúng ta biết kết quả của phương pháp IQR sẽ như thế nào.

Hướng dẫn dứt khoát về hồi quy logistic trong Python PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Chúng ta có thể sử dụng Gấu trúc quantile() phương pháp để tìm lượng tử của chúng tôi và iqr từ scipy.stats gói để có được dải dữ liệu liên phần cho mỗi cột:

from scipy.stats import iqr

Q1 = X_train.quantile(q=.25)
Q3 = X_train.quantile(q=.75)

IQR = X_train.apply(iqr)

Bây giờ chúng ta có Q1, Q3 và IQR, chúng ta có thể lọc ra các giá trị gần với giá trị trung bình hơn:


minimum = X_train < (Q1-1.5*IQR)
maximum = X_train > (Q3+1.5*IQR)


filter = ~(minimum | maximum).any(axis=1)


X_train = X_train[filter]

Sau khi lọc các hàng đào tạo của mình, chúng tôi có thể xem có bao nhiêu hàng trong số chúng vẫn còn trong dữ liệu với shape:

X_train.shape

Kết quả này trong:

(1714, 12)

Chúng ta có thể thấy rằng số hàng đã tăng từ 1875 đến 1714 sau khi lọc. Điều này có nghĩa là 161 hàng chứa các giá trị ngoại lai hoặc 8.5% dữ liệu.

Lưu ý: Chúng tôi khuyên rằng việc lọc các giá trị ngoại lai, loại bỏ các giá trị NaN và các hành động khác liên quan đến việc lọc và làm sạch dữ liệu luôn ở dưới hoặc tối đa 10% dữ liệu. Hãy thử nghĩ đến các giải pháp khác nếu quá trình lọc hoặc loại bỏ của bạn vượt quá 10% dữ liệu của bạn.

Sau khi loại bỏ các ngoại lệ, chúng tôi gần như đã sẵn sàng đưa dữ liệu vào mô hình. Để lắp mô hình, chúng tôi sẽ sử dụng dữ liệu tàu. X_train được lọc, nhưng những gì về y_train?

y_train.shape

Kết quả này cho ra:

(1875,)

Thông báo rằng y_train vẫn có 1875 hàng. Chúng ta cần phải khớp với số lượng y_train hàng với số lượng X_train hàng và không chỉ tùy ý. Chúng tôi cần xóa các giá trị y của các trường hợp hạt bí ngô mà chúng tôi đã loại bỏ, các giá trị này có thể nằm rải rác qua y_train bộ. Bộ lọc X_train stil có các chỉ số ban đầu của nó và chỉ số có những khoảng trống mà chúng tôi đã loại bỏ các chỉ số ngoại lệ! Sau đó, chúng ta có thể sử dụng chỉ mục của X_train DataFrame để tìm kiếm các giá trị tương ứng trong y_train:

y_train = y_train.iloc[X_train.index]

Sau khi làm điều đó, chúng ta có thể nhìn vào y_train hình dạng lại:

y_train.shape

Kết quả đầu ra:

(1714,)

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Bây giờ, y_train cũng có 1714 hàng và chúng giống như X_train hàng. Cuối cùng chúng tôi đã sẵn sàng để tạo mô hình hồi quy logistic của mình!

Triển khai mô hình hồi quy logistic

Phần khó đã xong! Tiền xử lý thường khó hơn phát triển mô hình, khi nói đến việc sử dụng các thư viện như Scikit-Learn, đã sắp xếp hợp lý việc áp dụng các mô hình ML xuống chỉ trong một vài dòng.

Đầu tiên, chúng tôi nhập LogisticRegression lớp và khởi tạo nó, tạo ra một LogisticRegression vật:

from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression(random_state=SEED)

Thứ hai, chúng tôi điều chỉnh dữ liệu chuyến tàu của mình cho logreg mô hình với fit() và dự đoán dữ liệu thử nghiệm của chúng tôi với predict() phương pháp, lưu trữ kết quả dưới dạng y_pred:



logreg.fit(X_train.values, y_train)
y_pred = logreg.predict(X_test)

Chúng tôi đã đưa ra dự đoán với mô hình của mình! Hãy xem 3 hàng đầu tiên trong X_train để xem chúng tôi đã sử dụng dữ liệu nào:

X_train[:3]

Đoạn mã trên xuất ra:

       Area          Perimeter     Major_Axis_Length    Minor_Axis_Length    Convex_Area   Equiv_Diameter       Eccentricity  Solidity      Extent        Roundness     Aspect_Ration        Compactness
0      -1.098308     -0.936518     -0.607941            -1.132551            -1.082768     -1.122359            0.458911      -1.078259     0.562847      -0.176041     0.236617             -0.360134
1      -0.501526     -0.468936     -0.387303            -0.376176            -0.507652     -0.475015            0.125764      0.258195      0.211703      0.094213      -0.122270            0.019480
2      0.012372      -0.209168     -0.354107            0.465095              0.003871      0.054384            -0.453911     0.432515      0.794735      0.647084      -0.617427            0.571137

Và ở 3 dự đoán đầu tiên trong y_pred để xem kết quả:

y_pred[:3] 

Kết quả này trong:

array([0, 0, 0])

Đối với ba hàng đó, dự đoán của chúng tôi là chúng là hạt giống của lớp đầu tiên, Çerçevelik.

Với hồi quy logistic, thay vì dự đoán lớp cuối cùng, chẳng hạn như 0, chúng tôi cũng có thể dự đoán xác suất mà hàng có liên quan đến 0 lớp. Đây là những gì thực sự xảy ra khi hồi quy logistic phân loại dữ liệu và predict() sau đó phương thức này chuyển dự đoán này qua một ngưỡng để trả về một lớp "cứng". Để dự đoán xác suất liên quan đến một lớp, predict_proba() Được sử dụng:

y_pred_proba = logreg.predict_proba(X_test)

Hãy cũng xem xét 3 giá trị đầu tiên của các dự đoán xác suất y:

y_pred_proba[:3] 

Kết quả đầu ra:

        # class 0   class 1   
array([[0.54726628, 0.45273372],
       [0.56324527, 0.43675473],
       [0.86233349, 0.13766651]])

Bây giờ, thay vì ba số không, chúng ta có một cột cho mỗi lớp. Trong cột bên trái, bắt đầu bằng 0.54726628, là xác suất của dữ liệu liên quan đến lớp 0; và ở cột bên phải, bắt đầu bằng 0.45273372, là xác suất của nó liên quan đến lớp 1.

Lưu ý: Sự khác biệt trong phân loại này còn được gọi là cứngmềm mại sự dự đoán. Dự đoán cứng đóng hộp dự đoán vào một lớp, trong khi dự đoán mềm đưa ra xác suất của cá thể thuộc về một lớp.

Có thêm thông tin về cách tạo ra kết quả dự đoán. Nó không thực sự 0, nhưng cơ hội lên lớp là 55% 0và 45% cơ hội lên lớp 1. Điều này cho thấy ba đầu tiên X_test điểm dữ liệu, liên quan đến lớp 0, chỉ thực sự rõ ràng về điểm dữ liệu thứ ba, với xác suất 86% - và không quá nhiều đối với hai điểm dữ liệu đầu tiên.

Khi truyền đạt các phát hiện bằng cách sử dụng các phương pháp ML - tốt nhất là trả về một lớp mềm và xác suất liên quan là "lòng tin" của phân loại đó.

Chúng ta sẽ nói thêm về cách tính toán đó khi chúng ta đi sâu hơn vào mô hình. Lúc này, chúng ta có thể thực hiện bước tiếp theo.

Đánh giá mô hình với báo cáo phân loại

Bước thứ ba là xem mô hình hoạt động như thế nào trên dữ liệu thử nghiệm. Chúng tôi có thể nhập Scikit-Learn classification_report() và vượt qua của chúng tôi y_testy_pred như các đối số. Sau đó, chúng tôi có thể in ra phản hồi của nó.

Báo cáo phân loại chứa các chỉ số phân loại được sử dụng nhiều nhất, chẳng hạn như chính xác, nhớ lại, điểm f1chính xác.

  1. Độ chính xác: để hiểu giá trị dự đoán chính xác nào được bộ phân loại của chúng tôi coi là đúng. Độ chính xác sẽ chia các giá trị tích cực thực sự đó cho bất kỳ giá trị nào được dự đoán là tích cực:

$$
precision = frac {text {true positive}} {text {true positive} + text {false positive}}
$$

  1. Nhớ lại: để hiểu có bao nhiêu mặt tích cực thực sự đã được xác định bởi trình phân loại của chúng tôi. Việc thu hồi được tính bằng cách chia giá trị tích cực thực sự cho bất kỳ thứ gì lẽ ra phải được dự đoán là tích cực:

$$
nhớ lại = frac {text {true positive}} {text {true positive} + text {false negative}}
$$

  1. Điểm F1: là cân bằng hoặc trung bình hài hòa độ chính xác và thu hồi. Giá trị thấp nhất là 0 và cao nhất là 1. Khi f1-score bằng 1, điều đó có nghĩa là tất cả các lớp đã được dự đoán chính xác - đây là một số điểm rất khó để có được với dữ liệu thực:

$$
text {f1-score} = 2 * frac {text {precision} * text {summon}} {text {precision} + text {summon}}
$$

  1. tính chính xác: mô tả có bao nhiêu dự đoán mà bộ phân loại của chúng tôi đã đúng. Giá trị độ chính xác thấp nhất là 0 và cao nhất là 1. Giá trị đó thường được nhân với 100 để thu được tỷ lệ phần trăm:

$$
độ chính xác = frac {văn bản {số dự đoán đúng}} {văn bản {tổng số dự đoán}}
$$

Lưu ý: Rất khó để có được độ chính xác 100% trên bất kỳ dữ liệu thực nào, nếu điều đó xảy ra, hãy lưu ý rằng một số rò rỉ hoặc điều gì đó sai có thể đang xảy ra - không có sự nhất trí về giá trị độ chính xác lý tưởng và nó cũng phụ thuộc vào ngữ cảnh. Giá trị 70%, có nghĩa là bộ phân loại sẽ mắc lỗi trên 30% dữ liệu hoặc trên 70% có xu hướng đủ cho hầu hết các kiểu máy.

from sklearn.metrics import classification_report
cr = classification_report(y_test, y_pred)
print(cr)

Sau đó, chúng ta có thể xem kết quả báo cáo phân loại:

				precision    recall  f1-score   support

           0       0.83      0.91      0.87       316
           1       0.90      0.81      0.85       309

    accuracy                           0.86       625
   macro avg       0.86      0.86      0.86       625
weighted avg       0.86      0.86      0.86       625

Đây là kết quả của chúng tôi. Thông báo rằng precision, recall, f1-scoreaccuracy các chỉ số đều rất cao, trên 80%, đây là mức lý tưởng - nhưng những kết quả đó có thể bị ảnh hưởng bởi sự tương quan cao và sẽ không duy trì trong thời gian dài.

Độ chính xác của mô hình là 86%, có nghĩa là nó phân loại sai 14% thời gian. Chúng tôi có thông tin tổng thể đó, nhưng sẽ rất thú vị nếu biết 14% sai lầm xảy ra liên quan đến việc phân loại lớp 0 hoặc lớp học 1. Để xác định những lớp nào bị xác định sai là lớp nào và tần suất nào - chúng ta có thể tính toán và vẽ biểu đồ ma trận hỗn loạn dự đoán của mô hình của chúng tôi.

Đánh giá mô hình bằng ma trận nhầm lẫn

Hãy tính toán và sau đó vẽ đồ thị của ma trận nhầm lẫn. Sau khi làm điều đó, chúng ta có thể hiểu từng phần của nó. Để vẽ ma trận nhầm lẫn, chúng tôi sẽ sử dụng Scikit-Learn confusion_matrix(), mà chúng tôi sẽ nhập từ metrics mô-đun.

Ma trận nhầm lẫn dễ hình dung hơn bằng cách sử dụng Seaborn heatmap(). Vì vậy, sau khi tạo nó, chúng ta sẽ chuyển ma trận nhầm lẫn của mình làm đối số cho bản đồ nhiệt:

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d')

Hướng dẫn dứt khoát về hồi quy logistic trong Python PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

  1. Ma trận hỗn loạn: ma trận cho biết có bao nhiêu mẫu đúng hay sai cho mỗi lớp. Các giá trị đúng và được dự đoán chính xác được gọi là mặt tích cực thực sựvà những cái được dự đoán là tích cực nhưng không tích cực được gọi là dương tính giả. Cùng một danh pháp của phủ định thực sựphủ định sai được sử dụng cho các giá trị âm;

Bằng cách nhìn vào biểu đồ ma trận nhầm lẫn, chúng ta có thể thấy rằng chúng ta có 287 các giá trị đã 0 và dự đoán là 0 - hoặc là mặt tích cực thực sự cho lớp học 0 (hạt Çerçevelik). Chúng tôi cũng có 250 tích cực thực sự cho lớp học 1 (Hạt Ürgüp Sivrisi). Các giá trị dương thực sự luôn nằm trong đường chéo ma trận đi từ phía trên bên trái xuống phía dưới bên phải.

Chúng tôi cũng có 29 các giá trị được cho là 0, nhưng được dự đoán là 1 (dương tính giả) Và 59 các giá trị đã 1 và dự đoán là 0 (phủ định sai). Với những con số đó, chúng ta có thể hiểu rằng lỗi mà mô hình mắc phải nhất là nó dự đoán âm tính sai. Vì vậy, nó hầu như có thể kết thúc việc phân loại hạt Ürgüp Sivrisi thành hạt Çerçevelik.

Loại lỗi này cũng được giải thích là do lớp học bị thu hồi 81% 1. Lưu ý rằng các chỉ số được kết nối với nhau. Và sự khác biệt trong đợt thu hồi đến từ việc có ít hơn 100 mẫu thuộc lớp Ürgüp Sivrisi. Đây là một trong những hệ quả của việc chỉ có một vài mẫu ít hơn lớp khác. Để cải thiện hơn nữa việc thu hồi, bạn có thể thử nghiệm với trọng số của lớp hoặc sử dụng nhiều mẫu Ürgüp Sivrisi hơn.

Cho đến nay, chúng tôi đã thực hiện hầu hết các bước truyền thống của khoa học dữ liệu và sử dụng mô hình hồi quy logistic như một hộp đen.

Lưu ý: Nếu bạn muốn đi xa hơn, hãy sử dụng Xác thực chéo (CV) và Tìm kiếm theo lưới tương ứng để tìm kiếm mô hình tổng quát nhất liên quan đến dữ liệu và các tham số mô hình tốt nhất được chọn trước khi đào tạo, hoặc siêu tham số.

Lý tưởng nhất là với CV và Grid Search, bạn cũng có thể triển khai một cách kết hợp để thực hiện các bước xử lý trước dữ liệu, phân chia dữ liệu, lập mô hình và đánh giá - điều này được thực hiện dễ dàng với Scikit-Learn đường ống.

Bây giờ là lúc để mở hộp đen và nhìn vào bên trong nó, để hiểu sâu hơn về cách hoạt động của hồi quy logistic.

Đi sâu hơn vào cách hoạt động thực sự của hồi quy logistic

Sản phẩm hồi quy từ đó không ngẫu nhiên, để hiểu được hồi quy logistic làm gì, chúng ta có thể nhớ anh chị em của nó, hồi quy tuyến tính có tác dụng gì đối với dữ liệu. Công thức hồi quy tuyến tính như sau:

$$
y = b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n
$$

Trong đó b0 là điểm đánh chặn hồi quy, b1 hệ số và x1 dữ liệu.

Phương trình đó dẫn đến một đường thẳng được sử dụng để dự đoán các giá trị mới. Nhắc lại phần giới thiệu, sự khác biệt bây giờ là chúng ta sẽ không dự đoán các giá trị mới, mà là một lớp. Vì vậy đường thẳng đó cần thay đổi. Với hồi quy logistic, chúng tôi giới thiệu tính phi tuyến tính và dự đoán hiện được thực hiện bằng cách sử dụng đường cong thay vì đường:

Hướng dẫn dứt khoát về hồi quy logistic trong Python PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Quan sát rằng trong khi đường hồi quy tuyến tính tiếp tục đi và được tạo bởi các giá trị vô hạn liên tục, thì đường cong hồi quy logistic có thể được chia ở giữa và có các điểm cực trị ở các giá trị 0 và 1. Hình dạng “S” đó là lý do nó phân loại dữ liệu - các điểm gần hơn hoặc nằm ở điểm cực trị cao nhất thuộc về lớp 1, trong khi các điểm ở góc phần tư thấp hơn hoặc gần hơn 0, thuộc về lớp 0. Phần giữa của “S” là giữa 0 và 1, 0.5 - đó là ngưỡng cho các điểm hồi quy logistic.

Hướng dẫn dứt khoát về hồi quy logistic trong Python PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Chúng ta đã hiểu sự khác biệt trực quan giữa hồi quy logistic và tuyến tính, nhưng còn công thức thì sao? Công thức cho hồi quy logistic như sau:

$$
y = b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n
$$

Nó cũng có thể được viết là:

$$
y_ {prob} = frac {1} {1 + e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}
$$

Hoặc thậm chí được viết là:

$$
y_ {prob} = frac {e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}} {1 + e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}
$$

Trong phương trình trên, chúng ta có xác suất đầu vào, thay vì giá trị của nó. Nó có 1 làm tử số nên nó có thể dẫn đến giá trị từ 0 đến 1 và 1 cộng với một giá trị ở mẫu số của nó, để giá trị của nó là 1 và một cái gì đó - điều này có nghĩa là toàn bộ kết quả của phân số không được lớn hơn 1 .

Và giá trị ở mẫu số là bao nhiêu? Nó là e, cơ số của lôgarit tự nhiên (khoảng 2.718282), được nâng lên thành lũy thừa của hồi quy tuyến tính:

$$
e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}
$$

Một cách viết khác sẽ là:

$$
ln left (frac {p} {1-p} right) = {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}
$$

Trong phương trình cuối cùng đó, ln là lôgarit tự nhiên (cơ số e) và p là xác suất, do đó logarit của xác suất của kết quả giống như kết quả hồi quy tuyến tính.

Nói cách khác, với kết quả hồi quy tuyến tính và lôgarit tự nhiên, chúng ta có thể đi đến xác suất đầu vào liên quan hoặc không liên quan đến một lớp được thiết kế.

Toàn bộ quá trình dẫn xuất hồi quy logistic như sau:

$$
p {X} = frac {e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}} {1 + e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}
$$

$$
p (1 + e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}) = e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}
$$

$$
p + p * e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)} = e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}
$$

p
=

e

(

b
0

+

b
1

*

x
1

+

b
2

*

x
2

+

b
3

*

x
3

+
...
+

b
n

*

x
n

)

-
p
*

e

(

b
0

+

b
1

*

x
1

+

b
2

*

x
2

+

b
3

*

x
3

+
...
+

b
n

*

x
n

)

$$
frac {p} {1-p} = e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}
$$

$$
ln left (frac {p} {1-p} right) = (b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)
$$

Điều này có nghĩa là mô hình hồi quy logistic cũng có các hệ số và giá trị chặn. Bởi vì nó sử dụng một hồi quy tuyến tính và thêm một thành phần phi tuyến tính vào nó với logarit tự nhiên (e).

Chúng ta có thể thấy các giá trị của hệ số và hệ số chặn của mô hình của chúng ta, giống như cách chúng ta đã làm đối với hồi quy tuyến tính, bằng cách sử dụng coef_intercept_ tính chất:

logreg.coef_

Hiển thị các hệ số của mỗi trong số 12 tính năng:

array([[ 1.43726172, -1.03136968,  0.24099522, -0.61180768,  1.36538261,
        -1.45321951, -1.22826034,  0.98766966,  0.0438686 , -0.78687889,
         1.9601197 , -1.77226097]])
logreg.intercept_

Điều đó dẫn đến:

array([0.08735782])

Với các hệ số và giá trị chặn, chúng tôi có thể tính toán xác suất dự đoán của dữ liệu của chúng tôi. Hãy lấy cái đầu tiên X_test một lần nữa, làm ví dụ:

X_test[:1]

Điều này trả về hàng đầu tiên của X_test dưới dạng mảng NumPy:

array([[-1.09830823, -0.93651823, -0.60794138, -1.13255059, -1.0827684 ,
        -1.12235877,  0.45891056, -1.07825898,  0.56284738, -0.17604099,
         0.23661678, -0.36013424]])

Theo phương trình ban đầu:

$$
p {X} = frac {e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}} {1 + e ^ {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}}
$$

Trong python, chúng ta có:

import math

lin_reg = logreg.intercept_[0] + 
((logreg.coef_[0][0]* X_test[:1][0][0])+ 
(logreg.coef_[0][1]* X_test[:1][0][1])+ 
(logreg.coef_[0][2]* X_test[:1][0][2])+ 
(logreg.coef_[0][3]* X_test[:1][0][3])+ 
(logreg.coef_[0][4]* X_test[:1][0][4])+ 
(logreg.coef_[0][5]* X_test[:1][0][5])+ 
(logreg.coef_[0][6]* X_test[:1][0][6])+ 
(logreg.coef_[0][7]* X_test[:1][0][7])+ 
(logreg.coef_[0][8]* X_test[:1][0][8])+ 
(logreg.coef_[0][9]* X_test[:1][0][9])+ 
(logreg.coef_[0][10]* X_test[:1][0][10])+ 
(logreg.coef_[0][11]* X_test[:1][0][11]))

px = math.exp(lin_reg)/(1 +(math.exp(lin_reg)))
px

Kết quả này trong:

0.45273372469369133

Nếu chúng ta nhìn lại predict_proba kết quả của lần đầu tiên X_test dòng, chúng tôi có:

logreg.predict_proba(X_test[:1])


Điều này có nghĩa là phương trình hồi quy logistic ban đầu cho chúng ta xác suất của đầu vào liên quan đến lớp 1, để tìm ra xác suất nào dành cho lớp 0, chúng ta có thể đơn giản:

1 - px


Chú ý rằng cả hai px1-px giống hệt với predict_proba kết quả. Đây là cách tính toán hồi quy logistic và tại sao hồi quy là một phần của tên của nó. Nhưng những gì về thuật ngữ hậu cần?

Thuật ngữ hậu cần đến từ đăng nhập, đó là một chức năng mà chúng ta đã thấy:

$$
Ở bên trái (frac {p} {1-p} bên phải)
$$

Chúng tôi vừa tính toán nó với px1-px. Đây là logit, còn được gọi là log-tỷ lệ cược vì nó bằng logarit của tỷ lệ cược trong đó p là một xác suất.

Kết luận

Trong hướng dẫn này, chúng tôi đã nghiên cứu một trong những thuật toán phân loại học máy cơ bản nhất, tức là hồi quy logistic.

Ban đầu, chúng tôi triển khai hồi quy logistic như một hộp đen với thư viện máy học của Scikit-Learn, và sau đó, chúng tôi đã hiểu nó từng bước để có lý do rõ ràng và nguồn gốc của thuật ngữ hồi quy và logistic.

Chúng tôi cũng đã khám phá và nghiên cứu dữ liệu, hiểu rằng đó là một trong những phần quan trọng nhất của phân tích khoa học dữ liệu.

Từ đây, tôi khuyên bạn nên chơi với hồi quy logistic đa lớp, hồi quy logistic cho nhiều hơn hai lớp - bạn có thể áp dụng cùng một thuật toán hồi quy logistic cho các tập dữ liệu khác có nhiều lớp và diễn giải kết quả.

Lưu ý: Có sẵn một bộ dữ liệu tốt tại đây để bạn chơi cùng.

Tôi cũng khuyên bạn nên học L1 và L2 quy định, chúng là một cách để "phạt" dữ liệu cao hơn để dữ liệu trở nên gần với mức bình thường hơn, giữ lại độ phức tạp của mô hình, do đó thuật toán có thể đạt được kết quả tốt hơn. Việc triển khai Scikit-Learn mà chúng tôi đã sử dụng, đã có quy định L2 theo mặc định. Một điều khác để xem xét là sự khác biệt người giải quyết, Chẳng hạn như lbgs, tối ưu hóa hiệu suất thuật toán hồi quy logistic.

Nó cũng quan trọng để xem thống kê phương pháp tiếp cận hồi quy logistic. Nó có giả định về hoạt động của dữ liệu và về các số liệu thống kê khác phải có để đảm bảo kết quả thỏa đáng, chẳng hạn như:

  • các quan sát là độc lập;
  • không có đa cộng tuyến giữa các biến giải thích;
  • không có ngoại lệ cực đoan;
  • có mối quan hệ tuyến tính giữa các biến giải thích và logit của biến phản hồi;
  • kích thước mẫu đủ lớn.

Lưu ý rằng có bao nhiêu giả định trong số đó đã được đề cập trong phân tích và xử lý dữ liệu của chúng tôi.

Tôi hy vọng bạn tiếp tục khám phá những gì mà hồi quy logistic cung cấp trong tất cả các cách tiếp cận khác nhau của nó!

Dấu thời gian:

Thêm từ xếp chồng lên nhau