المُقدّمة
في بعض الأحيان الخلط مع الانحدارالخطي من قبل المبتدئين - بسبب مشاركة المصطلح تراجع - الانحدار اللوجستي يختلف كثيرا عن الانحدارالخطي. بينما يتنبأ الانحدار الخطي بقيم مثل 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')
في المؤامرة أعلاه ، لاحظ ذلك 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)
في خريطة التمثيل اللوني هذه ، القيم الأقرب إلى 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')
يمكننا أخيرًا رؤية كل 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.
يمكننا استخدام الباندا 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و دقة.
- دقة: لفهم قيم التنبؤ الصحيحة التي اعتبرها المصنف صحيحًا. ستقسم الدقة هذه القيم الإيجابية الحقيقية على أي شيء تم توقعه على أنه إيجابي:
$$
الدقة = frac {text {true positive}} {text {true positive} + text {false إيجابي}}
$$
- تذكر: لفهم عدد الإيجابيات الحقيقية التي حددها المصنف لدينا. يتم حساب الاسترجاع بقسمة الإيجابيات الحقيقية على أي شيء كان ينبغي توقعه على أنه إيجابي:
$$
استدعاء = فارك {نص {صحيح إيجابي}} {نص {صحيح إيجابي} + نص {خطأ سلبي}}
$$
- نتيجة F1: هو متوازن ام الوسط التوافقي من الدقة والاستدعاء. أدنى قيمة هي 0 وأعلى قيمة هي 1. متى
f1-score
تساوي 1 ، فهذا يعني أنه تم توقع جميع الفئات بشكل صحيح - هذه درجة صعبة للغاية للحصول عليها باستخدام بيانات حقيقية:
$$
text {f1-score} = 2 * frac {text {دقة} * نص {استدعاء}} {نص {دقة} + نص {استدعاء}}
$$
- دقة: يصف عدد التنبؤات التي حصل عليها المصنف بشكل صحيح. أقل قيمة دقة هي 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')
- الارتباك مصفوفة: توضح المصفوفة عدد العينات التي حصل عليها النموذج بشكل صحيح أو خاطئ لكل فئة. يتم استدعاء القيم التي كانت صحيحة ومتوقعة بشكل صحيح ايجابيات حقيقية، وتلك التي تم توقعها على أنها إيجابية ولكنها لم تكن إيجابية تسمى ايجابيات مزيفة. نفس التسمية السلبيات الحقيقية و السلبيات الكاذبة يستخدم للقيم السالبة ؛
بالنظر إلى مخطط مصفوفة الارتباك ، يمكننا أن نرى أن لدينا 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 البيانات.
نتج عن هذه المعادلة خط مستقيم يستخدم للتنبؤ بالقيم الجديدة. عند تذكر المقدمة ، فإن الاختلاف الآن هو أننا لن نتوقع قيمًا جديدة ، بل فئة. لذلك يجب أن يتغير هذا الخط المستقيم. باستخدام الانحدار اللوجستي ، نقدم عدم الخطية ويتم التنبؤ الآن باستخدام منحنى بدلاً من الخط:
لاحظ أنه بينما يستمر خط الانحدار الخطي ويتكون من قيم لانهائية مستمرة ، يمكن تقسيم منحنى الانحدار اللوجستي في المنتصف وله قيم متطرفة في قيم 0 و 1. هذا الشكل "S" هو السبب في أنه يصنف البيانات - النقاط الأقرب أو الواقعة على الطرف الأعلى تنتمي إلى الفئة 1 ، بينما النقاط الموجودة في الربع السفلي أو الأقرب إلى 0 تنتمي إلى الفئة 0. "S" هو الوسط بين 0 و 1 ، 0.5 - وهو الحد الأدنى لنقاط الانحدار اللوجستي.
نحن نفهم بالفعل الفرق البصري بين الانحدار اللوجستي والخطي ، ولكن ماذا عن الصيغة؟ معادلة الانحدار اللوجستي هي كما يلي:
$$
ص = 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
، والتي تعمل على تحسين أداء خوارزمية الانحدار اللوجستي.
من المهم أيضًا إلقاء نظرة على ملف إحصائي نهج الانحدار اللوجستي. لديها الافتراضات حول سلوك البيانات ، وحول الإحصائيات الأخرى التي يجب أن تحمل لضمان نتائج مرضية ، مثل:
- الملاحظات مستقلة.
- لا توجد علاقة خطية متعددة بين المتغيرات التفسيرية ؛
- لا توجد قيم متطرفة ؛
- هناك علاقة خطية بين المتغيرات التفسيرية ولوجيت متغير الاستجابة ؛
- حجم العينة كبير بما فيه الكفاية.
لاحظ عدد هذه الافتراضات التي تمت تغطيتها بالفعل في تحليلنا ومعالجتنا للبيانات.
آمل أن تستمر في استكشاف ما يجب أن يقدمه الانحدار اللوجستي في جميع مناهجه المختلفة!