جمعية الإمارات للغوص من زاوية مختلفة

صورة

نحن لا نتحدث عن الطعام ، ولكن عن تحليل البيانات الاستكشافية (EDA ) ، والذي هو مقدمة إلزامية لأي ML قاسية.

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

الآن تخيل أننا كسولون للغاية (لكن فضوليون) وسنتابع هذا الافتراض طوال هذه المقالة.

بناءً على ذلك ، نطرح على أنفسنا السؤال التالي: هل هناك أداة خادعة في طبيعتها تسمح لك ببساطة بالضغط على CTRL + ENTER في بيئة IDE المفضلة لديك وعرضها على شاشة واحدة (بدون التمرير لأسفل وعدد لا يحصى من الجوانب المجهرية) صورة كاملة مع معلومات مفيدة حول مجموعة البيانات الخاصة بنا؟

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

هيكل هذه المادة:

  1. تجهيز صغير
  2. التصور التوقعي
  3. تقديرية المتغيرات
  4. Correlationfunnel
  5. المرتبة عبر الارتباطات
  6. easyalluvial

ننتهي من تمهيدية ونأخذ كأساس مثال عملي.

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


بدا لي تيتانيك الأكثر ملاءمة كمثال ، حجمه ليس صغيراً مثل Iris ، له متغيرات غير معلوماتية ، إنه مدروس جيدًا ولديه تنبؤات واضحة ، والأهم من ذلك ، أساس تاريخي.

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

رابط إلى المقالة باسم كبير لـ "Baseline_EDA" لدينا:
Titanic on Kaggle: لن تقرأ هذا المنشور حتى النهاية .

حتى لا تهتم بتنزيل / قراءة ملف CSV من الشبكة ، فإننا نلاحظ على الفور مجموعة البيانات الأصلية من CRAN

install.packages("titanic") data("titanic_train",package="titanic") 

المعالجة المسبقة وجيزة


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

 library(tidyverse) titanic_train %>% str d <- titanic_train %>% as_tibble %>% mutate(title=str_extract(Name,"\\w+\\.") %>% str_replace(fixed("."),"")) %>% mutate(title=case_when(title %in% c('Mlle','Ms')~'Miss', #   title=='Mme'~ 'Mrs', title %in% c('Capt','Don','Major','Sir','Jonkheer', 'Col')~'Sir', title %in% c('Dona', 'Lady', 'Countess')~'Lady', TRUE~title)) %>% mutate(title=as_factor(title), Survived=factor(Survived,levels = c(0,1),labels=c("no","yes")), Sex=as_factor(Sex), Pclass=factor(Pclass,ordered = T)) %>% group_by(title) %>% #  -      mutate(Age=replace_na(Age,replace = median(Age,na.rm = T))) %>% ungroup #             table(d$title,d$Sex) 

لقبذكرأنثى
السيد5170
السيدة0126
ملكة جمال0185
سيد400
سيدي80
تزيد السرعة60
الدكتور61
سيدة02

ليس كل الزبادي يتمتعون بصحة جيدة ...


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

مقاييس تقييم "الأداة المساعدة" للمتغير هي freqRatio (نسبة ترددات القيمة الأكثر شيوعًا بالنسبة إلى القيمة الثانية في التردد) والنسبة المئوية الفريدة (الطاقة أو العلاقة الرئيسية - نسبة عدد فريد من القيم من إجمالي عدد القيم)
مساعدة مفصلة يمكن أن ينظر إليه من حزمة الإقحام
?caret::nearZeroVar

 (feat.scan <- caret::nearZeroVar(x = d,saveMetrics = T) %>% rownames_to_column("featName") %>% as_tibble) 

صورة

من الأنسب بالنسبة لي أن أراقب المتغيرات في مستوى ثنائي الأبعاد (عن طريق تسجيل كلا المحورين بحيث لا تنقسم النقاط إلى كومة صغيرة واحدة بسبب نقاط خارجية).
لم أتساءل أبدًا ما إذا كانت هذه الخطوة هي EDA ، لكن أثناء كتابة هذا المقال ، اعتقدت: نحن نجري الآن تحليلًا استكشافيًا لبعض فائدة المتنبئين ، وتقييمهم البصري ، فلماذا لا تكون EDA؟

 # install.packages("ggrepel") library(ggrepel) ggplot(feat.scan,aes(x=percentUnique,y=freqRatio,label=featName,col=featName))+ geom_point(size=2)+ geom_text_repel(data = feat.scan,size=5)+scale_x_log10()+scale_y_log10()+theme_bw() 

صورة

نحن نعتبر أن المتنبئين الخارجيين غير مُعلمين سواء من حيث القدرة (المحور X) أو نسبة التردد (المحور Y) ، وبالتالي ، نضعها جانباً:
PassengerId. اسم. تذكرة. قمرة

 useless.feature <- c("PassengerId","Name","Ticket","Cabin") d <- d %>% select_at(vars(-useless.feature)) 

هذا الكون منفصل


لفهم كيف تعد المكتبات المدرجة أدناه البيانات - في هذا القسم نعرض مع أمثلة صغيرة ما يحدث في هذه المكتبات في مرحلة إعداد البيانات.

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

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

أبسط مثال على التحلل إلى 5 بن:

 iris %>% as_tibble %>% mutate_if(is.numeric,.funs = ggplot2::cut_number,n=5) 

صورة

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

 library(recipes) iris %>% as_tibble %>% mutate_if(is.numeric,cut_number,n=5) %>% recipe(x = .) %>% step_dummy(all_nominal(),one_hot = T) %>% prep %>% juice %>% glimpse 

بدلاً من 5 تنبؤات ، لدينا الآن 23 منهم ، ولكن لدينا تنبؤات ثنائية:

صورة

بشكل عام ، تنتهي حيل التحويل هناك ، لكن عمل مكتبتين من أصل 3 مكتبات من أجل EDA "غير التقليدي" الخاص بنا يبدأ بهذه المراحل.

بعد ذلك ، أقدم وظيفة 3 مكتبات للتصور:

  1. Correlationfunnel - يُظهر تأثير قيم تنبؤية فردية على الهدف (على سبيل المثال ، يمكنك تسميته بالتعليم الخاضع للإشراف EDA)
  2. لاريس - يوضح تأثير قيم التوقع الفردية على القيم الفردية الأخرى للتنبؤات الأخرى (على سبيل المثال ، يمكنك تسميتها EDA تعلم غير محسن)
  3. easyalluvial - يوضح العلاقة التراكمية للقيم المجمعة لأعلى تنبؤات "X" لكل هدف (على سبيل المثال ، يمكنك تسميتها بالتعليم الفائق الذي تعتمده EDA)

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

المكتبة الأولى على المسرح.

correlationfunnel


علاقة الارتباط هي تسريع تحليل البيانات الاستكشافية (EDA)
صورة

يتم وصف المنهجية بشكل جيد في المقالة القصيرة للمكتبة ؛ وسأقدم جزءًا من حساب العلاقة حسب القيم الثنائية

صورة

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

تسمح لك وظائف binarization المضمنة في المكتبة بتقليل الفئات الصغيرة إلى أخرى.

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

 #install.packages("correlationfunnel") library(correlationfunnel) d <- d %>% mutate_if(is.integer,as.numeric) d %>% binarize(n_bins = 5,thresh_infreq = .02,one_hot = T) %>% #    correlate(target = Survived__yes) %>% plot_correlation_funnel() # "interactive = T" - plotly! 

صورة

على المحور X ، لدينا قوة واتجاه الارتباط ، على المحور ص ، يتم ترتيب تنبؤاتنا بترتيب تنازلي. أول واحد يعكس دائما الهدف كما لديه أقوى علاقة مع نفسه (-1 ؛ 1).

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

(بشكل عام ، يمكننا أن نقول بالفعل أن العوامل الرئيسية للنموذج ستكون جنس الراكب)

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

كما ترون ، الاعتماد الصريح غير مرئي هنا.

يتحدث القمع حقًا عن الأهمية الضعيفة لهذا المتنبئ (أذكر أن النصاب / العنوان يحتوي على العمر ، وهذا هو السبب في أن العمر ليس مهمًا جدًا) ، ولكن حتى هنا يوضح القمع أن هناك فرصًا أكبر للبقاء في فئات "ناقص اللانهاية - 20 عامًا" (أي الأطفال ) و30-38 (الأثرياء ، وربما 1 الطبقة).
دعنا نقدم مؤشرًا مثل Survival Percentage وننظر في اعتماده على المجموعات التي ظهرت في المرحلة السابقة

(تعني مجموعة المؤلف العنوان).

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

من المحتمل جدًا أن يؤثر غياب الأقارب ، وكذلك عدد كبير ، سلبًا على البقاء.

SibSP في القمع يقول بوضوح نفس الشيء.

وبالطبع ، بالإضافة إلى استنتاجات المؤلف ، هنا يمكنك أن ترى أنماطًا أخرى ، سأترك متعة التأمل للقارئ

الإله الحارس للبيت


العثور على رؤى مع تصنيف العلاقات المتبادلة

صورة

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

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

يقوم تلقائيًا بتحويل الأعمدة الفئوية إلى عددية باستخدام ترميز واحد ساخن (1 ثانية و 0 ثانية) ومجموعات ذكية أخرى مثل تسميات "الآخرين" لقيم غير متكررة جدًا وميزات جديدة خارج الميزات القديمة.


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

لنجرب مثالنا.

 # ,     : # devtools::install_github("laresbernardo/lares") library(lares) corr_cross(df = d,top = 30) 

صورة

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

في الاقتباس أعلاه ، يستخلص المؤلف مثل هذا الاستنتاج حول تحليل الارتباط لحقلين في المجمل ، ولكن مع ترميز One-Hot-Encoding ، يتضح هذا من الارتباط الإيجابي القوي بين Age + P_Class_1.
بالإضافة إلى ذلك ، يرتبط سعر التذكرة والفئة ارتباطًا وثيقًا (معامل الارتباط العالي) ، وهو أمر متوقع تمامًا.

السطر الثالث أعلاه: Fare + P_Class_1

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

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

 corr_cross(df = d,type=2) 

صورة

easyalluvial


استكشاف البيانات مع المؤامرات الغرينية

صورة

هنا ، كما في الحزمتين السابقتين ، ينفّذ المؤلف ترميزًا مزدوجًا للمتغيرات الرقمية في البداية ، ولكن بعد ذلك تتباعد مساراته مع تلك المكتبات: بدلاً من {One-HotEncoding + correlation} ، تضع المكتبة أعلى X من المتنبئين الأكثر إثارة للاهتمام (يقرر المستخدم المتغيرات التي تنقلها) ) من خلال القيم ، تكوين التدفقات التي يعتمد لونها على الهدف ، وعرض الدفق على عدد المشاهدات في هذا الدفق.

يتم تحليل المتغيرات الرقمية إلى فئات HH (High High) و MH (Medium High) و M (Medium) و ML (Medium Low) و LL (Low Low)

أولاً ، دعنا نأخذ أهم المتنبئين على أساس الرسم البياني من قناة الارتباط:

 cor.feat <- c("title","Sex","Pclass","Fare") 

بعد ذلك ، نجعل جدول زمني

 # install.packages("easyalluvial") library(easyalluvial) al <- d %>% select(Survived,cor.feat) %>% alluvial_wide(fill_by = "first_variable") add_marginal_histograms(p = al,data_input = d,keep_labels = F) 

صورة

بالنسبة إلى اقتباسات المؤلف ، نعيد رسم المخطط باستخدام تنبؤات مناسبة.

 cor.feat <- c("Sex","Pclass","Age") al <- d %>% select(Survived,cor.feat) %>% alluvial_wide(fill_by = "first_variable") add_marginal_histograms(p = al,data_input = d,keep_labels = F) 

صورة

على سبيل المثال ، يوضح الرسم البياني التالي بوضوح أن الفئات الرئيسية من الناجين هم نساء من الصف الأول والثاني من جميع الأعمار.

يوضح الرسم البياني أيضًا أن النساء الباقين على قيد الحياة في الصف الثالث ليسن أيضًا مجموعة صغيرة

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

تم تأكيد ما سبق ذكره ، ولكن مرة أخرى نرى تدفقات فئة 3 من الرجال الباقين على قيد الحياة في الفئة العمرية LL ، ML.

كل ما سبق كان حول الحزمة "easyalluvial" ، لكن المؤلف كتب حزمة ثانية "parcats" والتي تجعل الرسم البياني أعلاه تفاعليًا (كما في عنوان هذا القسم).
هذا يجعل من الممكن ليس فقط رؤية سياق تلميح الأدوات ، ولكن أيضًا لإعادة توجيه التدفقات للحصول على تصور مرئي أفضل. (لسوء الحظ ، على الرغم من أن المكتبة ليست مُحسّنة للغاية وأنها تبطئ من تيتانيك)

 # install.packages("parcats") library(parcats) cor.feat <- c("title","Sex","Pclass","Fare") a <- d %>% select(Survived,cor.feat) %>% alluvial_wide(fill_by = "first_variable") parcats(p = a,marginal_histograms = T,data_input = d) 

صورة

علاوة


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

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

تسمح لك مكتبة easyalluvial بالقيام بذلك على أكثر من متنبئين في نفس الوقت (بالطبع ، من الأفضل عدم الابتعاد).

على سبيل المثال ، دعنا ندرب مجموعة عشوائية على مجموعة البيانات الخاصة بنا ونعكس شرح مجموعة عشوائية باستخدام 3 تنبؤات.

 library(ranger) m <- ranger(formula = Survived~.,data = d,mtry = 6,min.node.size = 5, num.trees = 600, importance = "permutation") library(easyalluvial) (imp <- importance(m) %>% as.data.frame %>% easyalluvial::tidy_imp(imp = .,df=d)) #      #  N-     (   .  !)   dspace <- get_data_space(df = d,imp,degree = 3) #     pred = predict(m, data = dspace) alluvial_model_response(pred$predictions, dspace, imp, degree = 3) 

بالإضافة إلى ذلك ، يحتوي المؤلف على رابط لنماذج CARET (لا أعرف مدى أهمية ذلك الآن في التفكير في نماذج السيارات)

 library(caret) trc <- trainControl(method = "none") m <- train(Survived~.,data = d,method="rf",trControl=trc,importance=T) alluvial_model_response_caret(train = m,degree = 4,bins=5,stratum_label_size = 2.8) 

صورة

استنتاج


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

Source: https://habr.com/ru/post/ar480532/


All Articles