الدليل النهائي للانحدار اللوجستي في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

الدليل النهائي للانحدار اللوجستي في بايثون

المُقدّمة

في بعض الأحيان الخلط مع الانحدارالخطي من قبل المبتدئين - بسبب مشاركة المصطلح تراجع - الانحدار اللوجستي يختلف كثيرا عن الانحدارالخطي. بينما يتنبأ الانحدار الخطي بقيم مثل 2 أو 2.45 أو 6.77 أو القيم المستمرة، مما يجعلها أ تراجع خوارزمية ، الانحدار اللوجستي يتنبأ بقيم مثل 0 أو 1 أو 1 أو 2 أو 3 ، وهي قيم منفصلة، مما يجعلها أ تصنيف الخوارزمية. نعم ، إنها تسمى تراجع بل هو تصنيف الخوارزمية. المزيد عن ذلك في لحظة.

لذلك ، إذا كانت مشكلة علم البيانات الخاصة بك تتضمن قيمًا مستمرة ، فيمكنك تطبيق تراجع الخوارزمية (الانحدار الخطي هو واحد منهم). بخلاف ذلك ، إذا كان يتضمن تصنيف المدخلات أو القيم المنفصلة أو الفئات ، فيمكنك تطبيق تصنيف الخوارزمية (الانحدار اللوجستي واحد منهم).

في هذا الدليل ، سنقوم بتنفيذ الانحدار اللوجستي في Python باستخدام مكتبة Scikit-Learn. سوف نشرح أيضا لماذا الكلمة "تراجع" موجود في الاسم وكيف يعمل الانحدار اللوجستي.

للقيام بذلك ، سنقوم أولاً بتحميل البيانات التي سيتم تصنيفها وتصورها ومعالجتها مسبقًا. بعد ذلك ، سنبني نموذج انحدار لوجستي يفهم تلك البيانات. سيتم بعد ذلك تقييم هذا النموذج واستخدامه للتنبؤ بالقيم بناءً على المدخلات الجديدة.

التحفيز

قامت الشركة التي تعمل بها بشراكة مع مزرعة زراعية تركية. تتضمن هذه الشراكة بيع بذور اليقطين. بذور اليقطين مهمة جدا لتغذية الإنسان. تحتوي على نسبة جيدة من الكربوهيدرات والدهون والبروتين والكالسيوم والبوتاسيوم والفوسفور والمغنيسيوم والحديد والزنك.

في فريق علم البيانات ، تتمثل مهمتك في معرفة الفرق بين أنواع بذور اليقطين فقط باستخدام البيانات - أو تصنيف البيانات حسب نوع البذور.

تعمل المزرعة التركية بنوعين من بذور اليقطين ، أحدهما يسمى سيرجيفيلك والآخر أورغوب سيفريسي.

لتصنيف بذور اليقطين ، اتبع فريقك ورقة 2021 "استخدام أساليب التعلم الآلي في تصنيف بذور اليقطين (Cucurbita pepo L.). الموارد الوراثية وتطور المحاصيل " من Koklu و Sarigil و Ozbek - في هذه الورقة ، توجد منهجية لتصوير واستخراج قياسات البذور من الصور.

بعد الانتهاء من العملية الموضحة بالورقة ، تم استخلاص القياسات التالية:

  • المساحة - عدد البكسل داخل حدود بذرة اليقطين
  • محيط - محيط بذرة اليقطين بالبكسل
  • طول المحور الرئيسي - محيط بذرة اليقطين بالبكسل
  • طول المحور الصغرى - المسافة المحورية الصغيرة لبذور اليقطين
  • غرابة - غرابة بذور اليقطين
  • منطقة محدبة - عدد وحدات البكسل لأصغر قشرة محدبة في المنطقة التي تكونتها بذرة اليقطين
  • مدى - نسبة مساحة بذرة اليقطين إلى بكسل المربع المحيط
  • قطر مكافئ - الجذر التربيعي لضرب مساحة بذور اليقطين بأربعة مقسومًا على pi
  • الاكتناز - نسبة مساحة بذرة اليقطين بالنسبة لمساحة الدائرة بنفس المحيط
  • Solidity - الحالة المحدبة والمحدبة لبذور اليقطين
  • استدارة - بيضاوية بذور اليقطين دون النظر إلى تشوهات حوافها
  • نسبة الجانب - نسبة أبعاد بذور اليقطين

هذه هي القياسات التي عليك العمل بها. إلى جانب القياسات ، هناك أيضًا مبوبة تسمية لنوعين من بذور اليقطين.

لبدء تصنيف البذور ، دعنا نستورد البيانات ونبدأ في النظر إليها.

فهم مجموعة البيانات

ملحوظة: يمكنك تنزيل مجموعة بيانات اليقطين هنا.

بعد تنزيل مجموعة البيانات ، يمكننا تحميلها في بنية إطار البيانات باستخدام ملف pandas مكتبة. نظرًا لأنه ملف Excel ، فسنستخدم ملحق read_excel() الأسلوب:

import pandas as pd

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

بمجرد تحميل البيانات ، يمكننا إلقاء نظرة سريعة على الصفوف الخمسة الأولى باستخدام ملف head() الأسلوب:

df.head() 

وينتج عنه:

	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

هنا ، لدينا جميع القياسات في أعمدة كل منها ، لدينا ملامحو كذلك مبوبة العمود لدينا الهدف، وهو الأخير في إطار البيانات. يمكننا أن نرى عدد القياسات التي لدينا باستخدام shape صفة، عزا:

df.shape 

الناتج هو:

(2500, 13)

تخبرنا نتيجة الشكل أن هناك 2500 إدخال (أو صف) في مجموعة البيانات و 13 عمودًا. نظرًا لأننا نعلم أن هناك عمود هدف واحد - فهذا يعني أن لدينا 12 عمودًا للميزة.

يمكننا الآن استكشاف المتغير المستهدف ، بذور اليقطين Class. نظرًا لأننا سنتوقع هذا المتغير ، فمن المثير للاهتمام أن نرى عدد عينات كل بذرة قرع لدينا. عادة ، كلما قل الفرق بين عدد الحالات في فصولنا ، كلما كانت العينة أكثر توازناً وكانت توقعاتنا أفضل.

يمكن إجراء هذا الفحص عن طريق حساب كل عينة بذرة باستخدام value_counts() الأسلوب:

df['Class'].value_counts() 

يعرض الكود أعلاه:

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

يمكننا أن نرى أن هناك 1300 عينة من سيرجيفيلك البذور و 1200 عينة من أورغوب سيفريسي بذرة. لاحظ أن الفرق بينهما هو 100 عينة ، فرق صغير جدًا ، وهو أمر جيد بالنسبة لنا ويشير إلى عدم الحاجة إلى إعادة توازن عدد العينات.

لنلقِ نظرة أيضًا على الإحصائيات الوصفية لميزاتنا باستخدام امتداد describe() طريقة لمعرفة مدى جودة توزيع البيانات. سنقوم أيضًا بتبديل الجدول الناتج باستخدام T لتسهيل المقارنة بين الإحصائيات:

df.describe().T

الجدول الناتج هو:

					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

من خلال النظر إلى الجدول ، عند مقارنة تعني و الانحراف المعياري (std) الأعمدة ، يمكن ملاحظة أن معظم الميزات لها وسيلة بعيدة عن الانحراف المعياري. يشير هذا إلى أن قيم البيانات ليست مركزة حول القيمة المتوسطة ، ولكنها أكثر انتشارًا حولها - بمعنى آخر ، لديهم تقلبية عالية.

أيضًا ، عند النظر إلى ملف الحد الأدنى (min) و أقصى (max) الأعمدة ، وبعض الميزات ، مثل Areaو Convex_Area، لديها اختلافات كبيرة بين القيم الدنيا والقصوى. هذا يعني أن هذه الأعمدة تحتوي على بيانات صغيرة جدًا وقيم بيانات كبيرة جدًا ، أو سعة أعلى بين قيم البيانات.

مع التباين العالي والسعة العالية والميزات بوحدات قياس مختلفة ، ستستفيد معظم بياناتنا من وجود نفس المقياس لجميع الميزات أو تحجيمها. سيؤدي قياس البيانات إلى توسيط البيانات حول المتوسط ​​وتقليل تباينها.

ربما يشير هذا السيناريو أيضًا إلى وجود قيم متطرفة وقيم متطرفة في البيانات. لذلك ، من الأفضل أن يكون لديك البعض معاملة خارجية إلى جانب تحجيم البيانات.

هناك بعض خوارزميات التعلم الآلي ، على سبيل المثال ، الخوارزميات القائمة على الأشجار مثل تصنيف الغابات العشوائية، التي لا تتأثر بالتباين العالي في البيانات ، والقيم المتطرفة ، والقيم المتطرفة. الانحدار اللوجستي يختلف ، فهو يعتمد على وظيفة تصنف قيمنا ، ويمكن أن تتأثر معلمات هذه الوظيفة بالقيم الخارجة عن اتجاه البيانات العام والتي لها تباين كبير.

سوف نفهم المزيد عن الانحدار اللوجستي بعد قليل عندما نبدأ في تنفيذه. في الوقت الحالي ، يمكننا الاستمرار في استكشاف بياناتنا.

ملحوظة: هناك مقولة شائعة في علوم الكمبيوتر: "إدخال القمامة ، إخراج القمامة" (GIGO)، هذا مناسب تمامًا للتعلم الآلي. هذا يعني أنه عندما يكون لدينا بيانات غير صحيحة - القياسات التي لا تصف الظواهر في حد ذاتها ، فإن البيانات التي لم يتم فهمها وإعدادها جيدًا وفقًا لنوع الخوارزمية أو النموذج ، من المحتمل أن تولد مخرجات غير صحيحة لن تعمل على على أساس يومي.
هذا هو أحد أسباب أهمية استكشاف البيانات وفهمها وكيفية عمل النموذج المختار. من خلال القيام بذلك ، يمكننا تجنب وضع القمامة في نموذجنا - وضع القيمة فيه بدلاً من ذلك ، والاستفادة من القيمة.

تصور البيانات

حتى الآن ، مع الإحصاء الوصفي ، لدينا لقطة مجردة إلى حد ما لبعض صفات البيانات. خطوة مهمة أخرى هي تصور ذلك وتأكيد فرضيتنا الخاصة بالتباين العالي والسعة والقيم المتطرفة. لمعرفة ما إذا كان ما لاحظناه حتى الآن يظهر في البيانات ، يمكننا رسم بعض الرسوم البيانية.

من المثير للاهتمام أيضًا معرفة كيفية ارتباط الميزات بالفئتين اللتين سيتم توقعهما. للقيام بذلك ، دعنا نستورد ملف seaborn الحزمة واستخدام pairplot رسم بياني لإلقاء نظرة على توزيع كل ميزة ، وفصل كل فئة لكل ميزة:

import seaborn as sns


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

ملحوظة: قد يستغرق تشغيل الكود أعلاه بعض الوقت ، نظرًا لأن المزاوجة المزدوجة تجمع بين مخططات مبعثرة لجميع الميزات (يمكنها) ، وتعرض أيضًا توزيعات الميزات.

بالنظر إلى حبكة الزوج ، يمكننا أن نرى أنه في معظم الحالات ، فإن نقاط Çerçevelik يتم فصل الطبقة بوضوح عن نقاط Ürgüp Sivrisi صف دراسي. إما أن تكون نقاط أحد الصفوف على اليمين عندما يكون الآخرون على اليسار ، أو أن بعضها لأعلى والبعض الآخر أسفل. إذا أردنا استخدام نوع من المنحنى أو الخط لفصل الفئات ، فهذا يدل على أنه من الأسهل فصلها ، إذا كانت مختلطة ، فإن التصنيف سيكون مهمة أصعب.

في مجلة Eccentricity, Compactness و Aspect_Ration بعض النقاط "المعزولة" أو المنحرفة عن اتجاه البيانات العام - القيم المتطرفة - يتم رصدها بسهولة أيضًا.

عند النظر إلى القطر من أعلى اليسار إلى أسفل يمين الرسم البياني ، لاحظ أن توزيعات البيانات أيضًا مشفرة بالألوان وفقًا لفئاتنا. أشكال التوزيع والمسافة بين كلا المنحنيين هي مؤشرات أخرى على مدى إمكانية فصلها - كلما كان بعضها بعيدًا عن الآخر ، كان ذلك أفضل. في معظم الحالات ، لا يتم فرضها ، مما يعني أنه من الأسهل فصلها ، كما أنها تساهم في مهمتنا.

بالتسلسل ، يمكننا أيضًا رسم مخططات المربع لجميع المتغيرات باستخدام sns.boxplot() طريقة. في معظم الأوقات ، من المفيد توجيه مخططات boxplots أفقيًا ، بحيث تكون أشكال boxplots مماثلة لأشكال التوزيع ، ويمكننا فعل ذلك باستخدام orient حجة:


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

الدليل النهائي للانحدار اللوجستي في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

في المؤامرة أعلاه ، لاحظ ذلك Area و Convex_Area لها مثل هذا الحجم الكبير عند مقارنتها بأحجام الأعمدة الأخرى ، لدرجة أنها تسحق مخططات الصندوق الأخرى. لكي نتمكن من إلقاء نظرة على جميع boxplots ، يمكننا توسيع نطاق الميزات ورسمها مرة أخرى.

قبل القيام بذلك ، دعنا نفهم فقط أنه إذا كانت هناك قيم للميزات ترتبط ارتباطًا وثيقًا بقيم أخرى ، على سبيل المثال - إذا كانت هناك قيم تزداد أيضًا عندما تكبر قيم الميزات الأخرى ، فإن وجود علاقة إيجابية؛ أو إذا كانت هناك قيم تفعل العكس ، اصغر بينما تصبح القيم الأخرى أصغر ، مع وجود a علاقة سلبية.

من المهم النظر إلى هذا لأن وجود علاقات قوية في البيانات قد يعني أن بعض الأعمدة مشتقة من أعمدة أخرى أو يكون لها معنى مشابه لنموذجنا. عندما يحدث ذلك ، قد يتم المبالغة في تقدير نتائج النموذج ونريد نتائج أقرب إلى الواقع. إذا كانت هناك ارتباطات قوية ، فهذا يعني أيضًا أنه يمكننا تقليل عدد الميزات ، واستخدام عدد أقل من الأعمدة مما يجعل النموذج أكثر شديد البخل.

ملحوظة: الارتباط الافتراضي المحسوب مع corr() الطريقة هي معامل ارتباط بيرسون. يشار إلى هذا المعامل عندما تكون البيانات كمية ، ويتم توزيعها بشكل طبيعي ، ولا تحتوي على قيم متطرفة ، ولها علاقة خطية.

سيكون الخيار الآخر هو الحساب معامل ارتباط سبيرمان. يتم استخدام معامل سبيرمان عندما تكون البيانات ترتيبية وغير خطية ولها أي توزيع ولها قيم متطرفة. لاحظ أن بياناتنا لا تتناسب تمامًا مع افتراضات بيرسون أو سبيرمان (هناك أيضًا المزيد من طرق الارتباط ، مثل كيندال). نظرًا لأن بياناتنا كمية ومن المهم بالنسبة لنا قياس علاقتها الخطية ، فسوف نستخدم معامل بيرسون.

دعنا نلقي نظرة على الارتباطات بين المتغيرات ومن ثم يمكننا الانتقال إلى المعالجة المسبقة للبيانات. سنحسب الارتباطات مع corr() طريقة وتصور لهم مع Seaborn heatmap(). يميل الحجم القياسي لخريطة الحرارة إلى أن يكون صغيرًا ، لذلك سنستورد matplotlib (محرك / مكتبة التصور العام التي تم إنشاء Seaborn فوقها) وقم بتغيير الحجم باستخدام figsize:

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

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

الدليل النهائي للانحدار اللوجستي في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

في خريطة التمثيل اللوني هذه ، القيم الأقرب إلى 1 أو -1 هي القيم التي يجب الانتباه إليها. تشير الحالة الأولى إلى ارتباط إيجابي مرتفع بينما تشير الحالة الثانية إلى ارتباط سلبي مرتفع. كلتا القيمتين ، إن لم تكن أعلى من 0.8 أو -0.8 ، ستكون مفيدة لنموذج الانحدار اللوجستي الخاص بنا.

عندما تكون هناك ارتباطات عالية مثل ارتباط 0.99 ما بين Aspec_Ration و Compactness، هذا يعني أنه يمكننا اختيار الاستخدام فقط Aspec_Ration أو فقط Compactness، بدلاً من كليهما (نظرًا لأنهما متساويان تقريبًا تنبؤ من بعضها البعض). نفس الشيء ينطبق على Eccentricity و Compactness مع -0.98 الارتباط Area و Perimeter مع 0.94 الارتباط وبعض الأعمدة الأخرى.

المعالجة المسبقة للبيانات

نظرًا لأننا اكتشفنا البيانات بالفعل لفترة من الوقت ، يمكننا البدء في معالجتها مسبقًا. في الوقت الحالي ، دعنا نستخدم جميع الميزات للتنبؤ بالفئة. بعد الحصول على النموذج الأول ، خط الأساس ، يمكننا بعد ذلك إزالة بعض الأعمدة شديدة الارتباط ومقارنتها بخط الأساس.

ستكون أعمدة الميزات الخاصة بنا X البيانات وعمود الفصل ، لدينا y البيانات الهدف:

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

تحويل السمات الفئوية إلى سمات رقمية

فيما يتعلق بنا Class العمود - قيمه ليست أرقامًا ، وهذا يعني أننا بحاجة أيضًا إلى تحويلها. هناك طرق عديدة للقيام بهذا التحول ؛ هنا ، سوف نستخدم ملف replace() الطريقة والاستبدال Çerçevelik إلى 0 و Ürgüp Sivrisi إلى 1.

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

ضع في اعتبارك رسم الخرائط! عند قراءة النتائج من النموذج الخاص بك ، سترغب في إعادة تحويلها مرة أخرى في ذهنك على الأقل ، أو العودة إلى اسم الفئة للمستخدمين الآخرين.

تقسيم البيانات إلى تدريب ومجموعات اختبار

في استكشافنا ، لاحظنا أن الميزات تحتاج إلى توسيع. إذا قمنا بإجراء القياس الآن ، أو بطريقة تلقائية ، فسنقوم بتوسيع نطاق القيم مع الكل X و y. في هذه الحالة ، سنقدم تسرب البيانات، حيث إن قيم مجموعة الاختبار التي سيتم اختبارها قريبًا قد أثرت على القياس. يعد تسرب البيانات سببًا شائعًا للنتائج غير القابلة للتكرار والأداء العالي الوهمي لنماذج ML.

التفكير في القياس يظهر أننا بحاجة إلى الانقسام أولاً X و y مزيد من البيانات في مجموعات التدريب والاختبار ثم إلى تناسب قشارة على مجموعة التدريب ، و تحول كل من مجموعة التدريب والاختبار (بدون أن يكون هناك تأثير لمجموعة الاختبار على القشارة التي تقوم بذلك). لهذا ، سوف نستخدم Scikit-Learn's train_test_split() الأسلوب:

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)

الضبط test_size=.25 تضمن أننا نستخدم 25٪ من البيانات للاختبار و 75٪ للتدريب. يمكن حذف هذا ، بمجرد أن يكون التقسيم الافتراضي ، ولكن بيثونيك طريقة كتابة التعليمات البرمجية تنصح بأن كونك "صريحًا أفضل من ضمني".

ملحوظة: الجملة "صريح أفضل من ضمني" هي إشارة إلى زن بايثون، أو PEP20. يضع بعض الاقتراحات لكتابة كود بايثون. إذا تم اتباع هذه الاقتراحات ، فسيتم النظر في الكود بيثونيك. يمكنك معرفة المزيد عنها هنا.

بعد تقسيم البيانات إلى مجموعات تدريب واختبار ، من الجيد النظر إلى عدد السجلات في كل مجموعة. يمكن أن يتم ذلك مع shape صفة، عزا:

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

يعرض هذا:

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

يمكننا أن نرى أنه بعد الانقسام ، لدينا 1875 رقمًا قياسيًا للتدريب و 625 رقمًا للاختبار.

تحجيم البيانات

بمجرد تجهيز مجموعات التدريب والاختبار لدينا ، يمكننا المضي قدمًا في توسيع نطاق البيانات باستخدام Scikit-Learn StandardScaler كائن (أو غيرها من أدوات القياس التي توفرها المكتبة). لتجنب التسرب ، يتم تركيب القشارة على X_train ثم تُستخدم البيانات وقيم القطار لتوسيع نطاق - أو تحويل - بيانات القطار والاختبار:

from sklearn.preprocessing import StandardScaler

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

نظرًا لأنك ستتصل عادةً بـ:

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

يمكن طي أول سطرين بمفرد fit_transform() المكالمة ، التي تلائم قشارة على المجموعة ، وتحولها دفعة واحدة. يمكننا الآن إعادة إنتاج الرسوم البيانية boxplot لمعرفة الفرق بعد قياس البيانات.

بالنظر إلى أن القياس يزيل أسماء الأعمدة ، قبل التخطيط ، يمكننا تنظيم بيانات التدريب في إطار بيانات بأسماء الأعمدة مرة أخرى لتسهيل التصور:

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

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

الدليل النهائي للانحدار اللوجستي في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

يمكننا أخيرًا رؤية كل Boxplots لدينا! لاحظ أن كل منهم لديه قيم متطرفة ، والميزات التي تقدم توزيعًا بعيدًا عن الوضع الطبيعي (التي لها منحنيات إما منحنية إلى اليسار أو اليمين) ، مثل Solidity, Extent, Aspect_Rationو Compactedness، هي نفسها التي كانت لها ارتباطات أعلى.

إزالة القيم المتطرفة باستخدام طريقة IQR

نحن نعلم بالفعل أن الانحدار اللوجستي يمكن أن يتأثر بالقيم المتطرفة. إحدى طرق معالجتها هي استخدام طريقة تسمى النطاق الربيعي or معدل الذكاء. تتمثل الخطوة الأولى في طريقة IQR في تقسيم بيانات القطار لدينا إلى أربعة أجزاء ، تسمى الرباعية. الربع الأول Q1، تصل إلى 25٪ من البيانات ، والثانية ، Q2، إلى 50٪ ، الثالث ، Q3، إلى 75٪ ، والأخيرة ، Q4إلى 100٪. يتم تحديد المربعات الموجودة في boxplot بواسطة طريقة IQR وهي تمثيل مرئي لها.

بالنظر إلى مخطط الصندوق الأفقي ، يشير الخط العمودي الموجود على اليسار إلى 25٪ من البيانات ، والخط العمودي في المنتصف ، و 50٪ من البيانات (أو الوسيط) ، وآخر خط عمودي على اليمين ، 75٪ من البيانات . كلما زاد حجم كل من المربعات المحددة بواسطة الخطوط العمودية - أو كلما كان الخط العمودي المتوسط ​​في المنتصف - يعني أن بياناتنا أقرب إلى التوزيع الطبيعي أو أقل انحرافًا ، وهو أمر مفيد لتحليلنا.

إلى جانب صندوق IQR ، توجد أيضًا خطوط أفقية على جانبيها. تحدد هذه الخطوط قيم التوزيع الدنيا والقصوى المحددة بواسطة

$$
الحد الأدنى = Q1 - 1.5 * IQR
$$

و

$$
الحد الأقصى = Q3 + 1.5 * IQR
$$

معدل الذكاء هو بالضبط الفرق بين Q3 و Q1 (أو Q3 - Q1) وهو أكثر نقطة مركزية للبيانات. لهذا السبب عند العثور على معدل الذكاء ، ينتهي بنا الأمر بتصفية القيم المتطرفة في أطراف البيانات ، أو في الحد الأدنى والحد الأقصى من النقاط. تعطينا مخططات الصندوق نظرة خاطفة على نتيجة طريقة IQR.

الدليل النهائي للانحدار اللوجستي في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

يمكننا استخدام الباندا quantile() طريقة للعثور على الكميات لدينا ، و iqr من scipy.stats الحزمة للحصول على نطاق البيانات بين الشرائح الربعية لكل عمود:

from scipy.stats import iqr

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

IQR = X_train.apply(iqr)

الآن لدينا Q1 و Q3 و IQR ، يمكننا تصفية القيم الأقرب إلى المتوسط:


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]

بعد تصفية صفوف التدريب الخاصة بنا ، يمكننا معرفة عدد الصفوف التي لا تزال موجودة في البيانات مع shape:

X_train.shape

وينتج عنه:

(1714, 12)

يمكننا أن نرى أن عدد الصفوف ارتفع من 1875 إلى 1714 بعد التصفية. هذا يعني أن 161 صفاً تحتوي على قيم متطرفة أو 8.5٪ من البيانات.

ملحوظة: يُنصح بأن تظل تصفية القيم المتطرفة وإزالة قيم NaN والإجراءات الأخرى التي تتضمن تصفية البيانات وتنظيفها أقل من أو تصل إلى 10٪ من البيانات. حاول التفكير في حلول أخرى إذا تجاوزت التصفية أو الإزالة 10٪ من بياناتك.

بعد إزالة القيم المتطرفة ، نحن جاهزون تقريبًا لتضمين البيانات في النموذج. بالنسبة لتركيب النموذج ، سنستخدم بيانات القطار. X_train يتم تصفيته ، ولكن ماذا عن y_train?

y_train.shape

هذا ينتج:

(1875,)

لاحظ أن y_train لا يزال يحتوي على 1875 صفا. نحن بحاجة لمطابقة عدد y_train من الصفوف إلى عدد X_train الصفوف وليس فقط بشكل تعسفي. نحتاج إلى إزالة قيم y لمثيلات بذور اليقطين التي أزلناها ، والتي من المحتمل أن تكون مبعثرة في y_train تعيين. تمت تصفيته X_train stil مؤشراته الأصلية والفهرس به فجوات حيث أزلنا القيم المتطرفة! يمكننا بعد ذلك استخدام فهرس X_train DataFrame للبحث عن القيم المقابلة بتنسيق y_train:

y_train = y_train.iloc[X_train.index]

بعد القيام بذلك ، يمكننا إلقاء نظرة على ملف y_train الشكل مرة أخرى:

y_train.shape

أي نواتج:

(1714,)

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

الآن، y_train يحتوي أيضًا على 1714 صفًا وهم نفس ملف X_train صفوف. أخيرًا ، نحن جاهزون لإنشاء نموذج الانحدار اللوجستي الخاص بنا!

تطبيق نموذج الانحدار اللوجستي

الجزء الصعب انتهى! عادة ما تكون المعالجة المسبقة أكثر صعوبة من تطوير النموذج ، عندما يتعلق الأمر باستخدام مكتبات مثل Scikit-Learn ، التي بسّطت تطبيق نماذج ML على سطرين فقط.

أولاً ، نقوم باستيراد ملف LogisticRegression فئة وإنشاء مثيل لها ، مما يؤدي إلى إنشاء ملف LogisticRegression موضوع:

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

ثانيًا ، نلائم بيانات القطار الخاصة بنا مع ملف logreg النموذج مع fit() الطريقة ، وتوقع بيانات الاختبار الخاصة بنا باستخدام predict() طريقة تخزين النتائج على شكل y_pred:



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

لقد توصلنا بالفعل إلى تنبؤات مع نموذجنا! دعونا نلقي نظرة على الصفوف الثلاثة الأولى في X_train لمعرفة البيانات التي استخدمناها:

X_train[:3]

الكود أعلاه المخرجات:

       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

وفي أول 3 تنبؤات في y_pred لرؤية النتائج:

y_pred[:3] 

وينتج عنه:

array([0, 0, 0])

بالنسبة لهذه الصفوف الثلاثة ، كانت تنبؤاتنا أنها بذور من الدرجة الأولى ، Çerçevelik.

بدافع الانحدار اللوجستي، بدلاً من التنبؤ بالفئة النهائية ، مثل 0، يمكننا أيضًا التنبؤ باحتمالية ارتباط الصف بـ 0 صف دراسي. هذا ما يحدث بالفعل عندما يصنف الانحدار اللوجستي البيانات ، و predict() ثم يمرر هذا التوقع من خلال عتبة لإرجاع فئة "صعبة". للتنبؤ باحتمالية تتعلق بفصل ما ، predict_proba() يستخدم:

y_pred_proba = logreg.predict_proba(X_test)

لنلقِ نظرة أيضًا على القيم الثلاث الأولى لتنبؤات احتمالات y:

y_pred_proba[:3] 

أي نواتج:

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

الآن ، بدلًا من ثلاثة أصفار ، لدينا عمود واحد لكل فئة. في العمود الموجود على اليسار ، بدءًا من 0.54726628، هي احتمالات البيانات المتعلقة بالفصل 0؛ وفي العمود الأيمن ، بدءًا من 0.45273372، هي احتمالية أن تتعلق بالفئة 1.

ملحوظة: يُعرف هذا الاختلاف في التصنيف أيضًا باسم الصعب و ناعم تنبؤ. يقوم التنبؤ الصعب بتقسيم التنبؤ إلى فصل دراسي ، بينما تؤدي التنبؤات الناعمة إلى إخراج الاحتمالات من المثيل الذي ينتمي إلى فئة.

هناك المزيد من المعلومات حول كيفية عمل المخرجات المتوقعة. لم يكن الأمر كذلك في الواقع 0، ولكن فرصة بنسبة 55٪ للانضمام إلى الصف 0، وفرصة 45٪ في الصف 1. هذا يبرز كيف الثلاثة الأولى X_test نقاط البيانات المتعلقة بالفصل 0، واضحة حقًا فقط فيما يتعلق بنقطة البيانات الثالثة ، مع احتمال 86 ٪ - وليس كثيرًا بالنسبة لنقطتي البيانات الأولين.

عند توصيل النتائج باستخدام طرق تعلم الآلة - من الأفضل عادةً إرجاع فئة ناعمة والاحتمال المرتبط بها "الثقة" من هذا التصنيف.

سنتحدث أكثر عن كيفية حساب ذلك عندما نتعمق في النموذج. في هذا الوقت ، يمكننا المتابعة إلى الخطوة التالية.

تقييم النموذج بتقارير التصنيف

الخطوة الثالثة هي معرفة كيفية أداء النموذج على بيانات الاختبار. يمكننا استيراد Scikit-Learn classification_report() وتمرير y_test و y_pred كحجج. بعد ذلك ، يمكننا طباعة ردها.

يحتوي تقرير التصنيف على مقاييس التصنيف الأكثر استخدامًا ، مثل دقة, تذكر, درجة f1و دقة.

  1. دقة: لفهم قيم التنبؤ الصحيحة التي اعتبرها المصنف صحيحًا. ستقسم الدقة هذه القيم الإيجابية الحقيقية على أي شيء تم توقعه على أنه إيجابي:

$$
الدقة = frac {text {true positive}} {text {true positive} + text {false إيجابي}}
$$

  1. تذكر: لفهم عدد الإيجابيات الحقيقية التي حددها المصنف لدينا. يتم حساب الاسترجاع بقسمة الإيجابيات الحقيقية على أي شيء كان ينبغي توقعه على أنه إيجابي:

$$
استدعاء = فارك {نص {صحيح إيجابي}} {نص {صحيح إيجابي} + نص {خطأ سلبي}}
$$

  1. نتيجة F1: هو متوازن ام الوسط التوافقي من الدقة والاستدعاء. أدنى قيمة هي 0 وأعلى قيمة هي 1. متى f1-score تساوي 1 ، فهذا يعني أنه تم توقع جميع الفئات بشكل صحيح - هذه درجة صعبة للغاية للحصول عليها باستخدام بيانات حقيقية:

$$
text {f1-score} = 2 * frac {text {دقة} * نص {استدعاء}} {نص {دقة} + نص {استدعاء}}
$$

  1. دقة: يصف عدد التنبؤات التي حصل عليها المصنف بشكل صحيح. أقل قيمة دقة هي 0 وأعلى قيمة هي 1. عادةً ما يتم ضرب هذه القيمة في 100 للحصول على نسبة مئوية:

$$
دقة = فارك {نص {عدد التنبؤات الصحيحة}} {نص {العدد الإجمالي للتنبؤات}}
$$

ملحوظة: من الصعب للغاية الحصول على دقة بنسبة 100٪ لأي بيانات حقيقية ، إذا حدث ذلك ، فاحذر من حدوث بعض التسرب أو حدوث خطأ ما - لا يوجد إجماع على قيمة الدقة المثالية كما أنها تعتمد على السياق. قيمة 70٪ ، مما يعني أن المصنف سيرتكب أخطاء في 30٪ من البيانات ، أو أعلى من 70٪ يميل إلى أن يكون كافيًا لمعظم النماذج.

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

يمكننا بعد ذلك إلقاء نظرة على مخرجات تقرير التصنيف:

				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

هذه هي نتيجتنا. لاحظ أن precision, recall, f1-scoreو accuracy جميع المقاييس عالية جدًا ، أعلى من 80٪ ، وهو أمر مثالي - ولكن ربما تكون هذه النتائج متأثرة بالارتباطات العالية ولن تستمر على المدى الطويل.

تبلغ دقة النموذج 86٪ ، أي أنه حصل على تصنيف خاطئ بنسبة 14٪ من الوقت. لدينا هذه المعلومات الإجمالية ، ولكن سيكون من المثير للاهتمام معرفة ما إذا كانت أخطاء 14٪ تحدث فيما يتعلق بتصنيف الفصل 0 أو فئة 1. لتحديد الفئات التي تم تعريفها بشكل خاطئ على أنها وفي أي تردد - يمكننا حساب ورسم أ الارتباك مصفوفة لتوقعات نموذجنا.

تقييم النموذج بمصفوفة الارتباك

لنحسب مصفوفة الارتباك ثم نرسمها. بعد القيام بذلك ، يمكننا فهم كل جزء منه. لرسم مصفوفة الارتباك ، سنستخدم Scikit-Learn confusion_matrix()، والتي سنستوردها من ملف metrics وحدة.

من السهل تصور مصفوفة الارتباك باستخدام Seaborn heatmap(). لذلك ، بعد إنشائها ، سنقوم بتمرير مصفوفة الارتباك الخاصة بنا كحجة لخريطة الحرارة:

from sklearn.metrics import confusion_matrix

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

الدليل النهائي للانحدار اللوجستي في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

  1. الارتباك مصفوفة: توضح المصفوفة عدد العينات التي حصل عليها النموذج بشكل صحيح أو خاطئ لكل فئة. يتم استدعاء القيم التي كانت صحيحة ومتوقعة بشكل صحيح ايجابيات حقيقية، وتلك التي تم توقعها على أنها إيجابية ولكنها لم تكن إيجابية تسمى ايجابيات مزيفة. نفس التسمية السلبيات الحقيقية و السلبيات الكاذبة يستخدم للقيم السالبة ؛

بالنظر إلى مخطط مصفوفة الارتباك ، يمكننا أن نرى أن لدينا 287 القيم التي كانت 0 وتوقع باسم 0 - أو ايجابيات حقيقية للصف 0 (بذور شيرشفيليك). نحن ايضا لدينا 250 الإيجابيات الحقيقية للفصل 1 (بذور Ürgüp Sivrisi). توجد الإيجابيات الحقيقية دائمًا في قطري المصفوفة الذي يمتد من أعلى اليسار إلى أسفل اليمين.

لدينا أيضا 29 القيم التي كان من المفترض أن تكون 0، ولكن توقعت 1 (ايجابيات مزيفة) و 59 القيم التي كانت 1 وتوقع باسم 0 (السلبيات الكاذبة). بهذه الأرقام ، يمكننا أن نفهم أن الخطأ الذي يرتكبه النموذج أكثر من غيره هو أنه يتنبأ بسلبيات خاطئة. لذلك ، يمكن أن ينتهي الأمر في الغالب بتصنيف بذور Ürgüp Sivrisi على أنها بذرة Çerçevelik.

يتم تفسير هذا النوع من الخطأ أيضًا من خلال استدعاء 81 ٪ للفئة 1. لاحظ أن المقاييس متصلة. والفرق في عملية الاسترجاع يأتي من وجود 100 عينة أقل من فئة Ürgüp Sivrisi. هذا هو أحد الآثار المترتبة على وجود عدد قليل من العينات أقل من الفصل الآخر. لزيادة تحسين الاسترجاع ، يمكنك إما تجربة أوزان الفصل أو استخدام المزيد من عينات Ürgüp Sivrisi.

حتى الآن ، قمنا بتنفيذ معظم الخطوات التقليدية لعلم البيانات واستخدمنا نموذج الانحدار اللوجستي كصندوق أسود.

ملحوظة: إذا كنت تريد أن تذهب أبعد من ذلك ، استخدم عبر التحقق من الصحة (CV) والبحث الشبكي للبحث عن النموذج الذي يعمم معظم البيانات المتعلقة بالبيانات وأفضل معلمات النموذج التي تم اختيارها قبل التدريب ، أو معلمات مفرطة.

من الناحية المثالية ، باستخدام CV و Grid Search ، يمكنك أيضًا تنفيذ طريقة متسلسلة للقيام بخطوات المعالجة المسبقة للبيانات ، وتقسيم البيانات ، والنمذجة ، والتقييم - والتي أصبحت سهلة مع Scikit-Learn خطوط الأنابيب.

حان الوقت الآن لفتح الصندوق الأسود والنظر بداخله ، للتعمق في فهم كيفية عمل الانحدار اللوجستي.

التعمق في كيفية عمل الانحدار اللوجستي حقًا

تراجع الكلمة ليست موجودة عن طريق الصدفة ، لفهم ما يفعله الانحدار اللوجستي ، يمكننا أن نتذكر ما يفعله شقيقه ، الانحدار الخطي للبيانات. كانت صيغة الانحدار الخطي كما يلي:

$$
ص = b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + نقاط + b_n * x_n
$$

فيه ب0 كان الانحدار اعتراض ، ب1 المعامل و x1 البيانات.

نتج عن هذه المعادلة خط مستقيم يستخدم للتنبؤ بالقيم الجديدة. عند تذكر المقدمة ، فإن الاختلاف الآن هو أننا لن نتوقع قيمًا جديدة ، بل فئة. لذلك يجب أن يتغير هذا الخط المستقيم. باستخدام الانحدار اللوجستي ، نقدم عدم الخطية ويتم التنبؤ الآن باستخدام منحنى بدلاً من الخط:

الدليل النهائي للانحدار اللوجستي في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

لاحظ أنه بينما يستمر خط الانحدار الخطي ويتكون من قيم لانهائية مستمرة ، يمكن تقسيم منحنى الانحدار اللوجستي في المنتصف وله قيم متطرفة في قيم 0 و 1. هذا الشكل "S" هو السبب في أنه يصنف البيانات - النقاط الأقرب أو الواقعة على الطرف الأعلى تنتمي إلى الفئة 1 ، بينما النقاط الموجودة في الربع السفلي أو الأقرب إلى 0 تنتمي إلى الفئة 0. "S" هو الوسط بين 0 و 1 ، 0.5 - وهو الحد الأدنى لنقاط الانحدار اللوجستي.

الدليل النهائي للانحدار اللوجستي في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

نحن نفهم بالفعل الفرق البصري بين الانحدار اللوجستي والخطي ، ولكن ماذا عن الصيغة؟ معادلة الانحدار اللوجستي هي كما يلي:

$$
ص = b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + نقاط + b_n * x_n
$$

يمكن كتابتها أيضًا على النحو التالي:

$$
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)}}
$$

أو حتى أن تكتب على النحو التالي:

$$
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)}}
$$

في المعادلة أعلاه ، لدينا احتمال الإدخال ، بدلاً من قيمته. يحتوي على 1 كبسط ، لذا يمكن أن ينتج عنه قيمة بين 0 و 1 ، و 1 زائد قيمة في مقامه ، بحيث تكون قيمته 1 وشيء ما - وهذا يعني أن نتيجة الكسر بأكملها لا يمكن أن تكون أكبر من 1 .

وما هي القيمة الموجودة في المقام؟ إنها e، قاعدة اللوغاريتم الطبيعي (حوالي 2.718282) ، مرفوعة إلى قوة الانحدار الخطي:

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

طريقة أخرى لكتابتها ستكون:

$$
ln يسار (frac {p} {1-p} يمين) = {(b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)}
$$

في تلك المعادلة الأخيرة ، ln هو اللوغاريتم الطبيعي (الأساس e) و 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)}}
$$

$$
ص (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 + نقاط + 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 + نقاط + 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 يسار (frac {p} {1-p} يمين) = (b_0 + b_1 * x_1 + b_2 * x_2 + b_3 * x_3 + ldots + b_n * x_n)
$$

هذا يعني أن نموذج الانحدار اللوجستي له أيضًا معاملات وقيمة تقاطع. لأنه يستخدم انحدارًا خطيًا ويضيف إليه مكونًا غير خطي باستخدام اللوغاريتم الطبيعي (e).

يمكننا أن نرى قيم المعاملات وتقاطع نموذجنا ، بنفس الطريقة التي فعلنا بها مع الانحدار الخطي ، باستخدام coef_ و intercept_ الخصائص:

logreg.coef_

الذي يعرض معاملات كل ميزة من الميزات الـ 12:

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_

ينتج عن ذلك:

array([0.08735782])

باستخدام المعاملات وقيم التقاطع ، يمكننا حساب الاحتمالات المتوقعة لبياناتنا. دعنا نحصل على الأول X_test القيم مرة أخرى ، كمثال:

X_test[:1]

هذا ما يعيد الصف الأول من X_test كمصفوفة 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]])

بعد المعادلة الأولية:

$$
ص {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)}}
$$

في Python ، لدينا:

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

وينتج عنه:

0.45273372469369133

إذا نظرنا مرة أخرى إلى predict_proba نتيجة الأول X_test الخط لدينا:

logreg.predict_proba(X_test[:1])


هذا يعني أن معادلة الانحدار اللوجستي الأصلية تعطينا احتمالية الإدخال فيما يتعلق بالفئة 1، لمعرفة الاحتمال الخاص بالفئة 0، يمكننا ببساطة:

1 - px


لاحظ أن كليهما px و 1-px متطابقة مع predict_proba النتائج. هذه هي الطريقة التي يتم بها حساب الانحدار اللوجستي ولماذا تراجع وهو جزء من اسمه. لكن ماذا عن المصطلح سوقي?

على المدى سوقي يأتي من تسجيل الدخول، وهي وظيفة رأيناها بالفعل:

$$
ln يسار (frac {p} {1-p} يمين)
$$

لقد حسبناها للتو px و 1-px. هذا هو السجل ، ويسمى أيضًا سجل الاحتمالات لأنه يساوي لوغاريتم الاحتمالات حيث p هو احتمال.

وفي الختام

في هذا الدليل ، درسنا واحدة من خوارزميات تصنيف التعلم الآلي الأساسية ، أي الانحدار اللوجستي.

في البداية ، قمنا بتنفيذ الانحدار اللوجستي كصندوق أسود مع مكتبة التعلم الآلي الخاصة بـ Scikit-Learn ، وفهمناها لاحقًا خطوة بخطوة للحصول على سبب واضح ومن أين تأتي المصطلحات الانحدارية واللوجستية.

لقد اكتشفنا أيضًا البيانات ودرسناها ، وفهمنا أن هذا هو أحد الأجزاء الأكثر أهمية في تحليل علم البيانات.

من هنا ، أنصحك باللعب مع الانحدار اللوجستي متعدد الطبقات، الانحدار اللوجستي لأكثر من فئتين - يمكنك تطبيق نفس خوارزمية الانحدار اللوجستي لمجموعات البيانات الأخرى التي تحتوي على فئات متعددة ، وتفسير النتائج.

ملحوظة: تتوفر مجموعة جيدة من مجموعات البيانات هنا لتلعب بها.

أنصحك أيضًا بدراسة L1 و L2 التسويات، فهي طريقة "لمعاقبة" البيانات الأعلى من أجل أن تصبح أقرب إلى الوضع الطبيعي ، مع الحفاظ على تعقيد النموذج ، وبالتالي يمكن للخوارزمية الوصول إلى نتيجة أفضل. تطبيق Scikit-Learn الذي استخدمناه ، يحتوي بالفعل على تسوية L2 افتراضيًا. شيء آخر يجب النظر إليه هو الاختلاف المحاليل، مثل lbgs، والتي تعمل على تحسين أداء خوارزمية الانحدار اللوجستي.

من المهم أيضًا إلقاء نظرة على ملف إحصائي نهج الانحدار اللوجستي. لديها الافتراضات حول سلوك البيانات ، وحول الإحصائيات الأخرى التي يجب أن تحمل لضمان نتائج مرضية ، مثل:

  • الملاحظات مستقلة.
  • لا توجد علاقة خطية متعددة بين المتغيرات التفسيرية ؛
  • لا توجد قيم متطرفة ؛
  • هناك علاقة خطية بين المتغيرات التفسيرية ولوجيت متغير الاستجابة ؛
  • حجم العينة كبير بما فيه الكفاية.

لاحظ عدد هذه الافتراضات التي تمت تغطيتها بالفعل في تحليلنا ومعالجتنا للبيانات.

آمل أن تستمر في استكشاف ما يجب أن يقدمه الانحدار اللوجستي في جميع مناهجه المختلفة!

الطابع الزمني:

اكثر من ستاكابوز