پیش بینی بقای مسافران تایتانیک

ساخت وبلاگ

در این پست وبلاگ ، من کل فرآیند ایجاد یک مدل یادگیری ماشین را در مجموعه داده های معروف تایتانیک ، که توسط بسیاری از افراد در سراسر جهان استفاده می شود ، طی می کنم. این اطلاعات در مورد سرنوشت مسافران در مورد تایتانیک ارائه می دهد ، که مطابق با وضعیت اقتصادی (کلاس) ، جنس ، سن و بقا خلاصه شده است.

من در ابتدا این پست را در Kaggle. com ، به عنوان بخشی از رقابت "تایتانیک: یادگیری ماشین از فاجعه" نوشتم. در این چالش از ما خواسته می شود پیش بینی کنیم که آیا یک مسافر در تایتانیک زنده مانده است یا نه.

RMS تایتانیک

RMS Titanic یک خط مسافر بریتانیایی بود که در ساعات اولیه صبح 15 آوریل 1912 در اقیانوس اطلس شمالی غرق شد ، پس از برخورد با یک کوه یخ در هنگام سفر دوشیزه خود از ساوتهمپتون به شهر نیویورک. تخمین زده می شود 2،224 مسافر و خدمه در کشتی در کشتی و بیش از 1500 نفر جان باختند که آن را به یکی از کشنده ترین بلایای دریایی صلح در تاریخ مدرن تبدیل کرد. RMS Titanic بزرگترین کشتی در زمان ورود به خدمت بود و دومین مورد از سه آستر اقیانوس کلاس المپیک بود که توسط خط ستاره سفید اداره می شدند. این تایتانیک توسط کشتی سازی هارلند و وولف در بلفاست ساخته شده است. توماس اندروز ، معمار او ، در این فاجعه درگذشت.

وارد کردن کتابخانه ها

# جبر خطیوارد كردناعماقمانندNP# پردازش داده هاوارد كردنپاندامانندPD# تجسم داده هاوارد كردندریاییماننداسنک٪ matplotlib درون خطیاز جانبمنگولهوارد کردن فیلهبه عنوان PLTاز جانبمنگولهسبک واردات# الگوریتماز جانبچلیکونوارد کردن linear_modelاز جانبsklea. linear_modelوارد کردن لجستیک رکوداز جانبsklea. ensembleوارد کردن RandomForestClassifierاز جانبsklea. linear_modelوارد کردن Perceptronاز جانبsklea. linear_modelوارد کردن sgdclassifierاز جانبsklea. treeوارد کردن تصمیم گیری تصمیم گیریاز جانبsklea. neighborsوارد کردن KneighborsClassiferاز جانبsklea. svmوارد کردن SVC ، Linearsvcاز جانبsklea. naive_bayesواردات گاوسیان

دریافت داده ها

test_df = pd. read_csv ("test. csv")train_df = pd. read_csv ("train. csv")

کاوش/تجزیه و تحلیل داده ها

train_df. info ()

مجموعه آموزش دارای 891 نمونه و 11 ویژگی + متغیر هدف (زنده مانده) است. 2 مورد از این ویژگی ها شناور ، 5 عدد صحیح و 5 مورد اشیاء هستند. در زیر ویژگی ها را با توضیحات کوتاه ذکر کرده ام:

بقا: بقامسافر: شناسه منحصر به فرد مسافر.PCLASS: کلاس بلیطرابطه جنسی: رابطه جنسیسن: سن سالهاsibsp: # خواهران و برادران / همسران در داخل تایتانیکپارچ: # والدین / فرزندان در داخل تایتانیکبلیط: شماره بلیطکرایه: کرایه مسافرکابین: شماره کابینسوار شده: بندر سوار شدنtrain_df. describ ()

در بالا می توانیم ببینیم که 38 ٪ از مجموعه آموزش از تایتانیک جان سالم به در برد. همچنین می توانیم ببینیم که سن مسافر از 0. 4 تا 80 متغیر است. در بالای آن می توانیم برخی از ویژگی ها را تشخیص دهیم ، که حاوی مقادیر گمشده ، مانند ویژگی "سن" است.

train_df. head (8)

از جدول بالا می توانیم چند مورد را یادداشت کنیم. اول از همه ، که ما باید بعداً ویژگی های زیادی را به موارد عددی تبدیل کنیم تا الگوریتم های یادگیری ماشین بتوانند آنها را پردازش کنند. علاوه بر این ، می توانیم ببینیم که این ویژگی ها دارای محدوده های گسترده ای هستند ، که باید تقریباً به همان مقیاس تبدیل شویم. ما همچنین می توانیم برخی از ویژگی های دیگر را که حاوی مقادیر گمشده است (NAN = نه یک عدد) مشاهده کنیم ، که باید با آنها مقابله کنیم.

بیایید نگاهی دقیق تر به آنچه داده ها در واقع وجود ندارد ، بیندازیم:

Total = train_df. isnull (). جمع (). sort_values (صعودی =نادرست)درصد_1 = train_df. isnull (). جمع ()/train_df. isnull (). count ()*100درصد_2 = (دور (درصد_1 ، 1)). sort_values (صعودی =نادرست)Mission_data = pd. concat ([کل ، درصد_2] ، محور = 1 ، کلیدها = ['Total' ، '٪'])Missing_data. head (5)

ویژگی سوار شده فقط 2 مقدار گمشده دارد که به راحتی می توان آن را پر کرد. مقابله با ویژگی "سن" ، که دارای 177 ارزش از دست رفته است ، بسیار دشوار خواهد بود. ویژگی "کابین" نیاز به تحقیقات بیشتر دارد ، اما به نظر می رسد که ممکن است بخواهیم آن را از مجموعه داده رها کنیم ، زیرا 77 ٪ از آن از دست رفته است.

train_df. columns. values

در بالا می توانید 11 ویژگی + متغیر هدف (زنده مانده) را مشاهده کنید. چه ویژگی هایی می تواند به میزان بقا بالا کمک کند؟

برای من این امر منطقی خواهد بود اگر همه چیز به جز "مسافر" ، "بلیط" و "نام" با نرخ بقا بالا ارتباط داشته باشد.

1. سن و جنس:

زنده مانده = "زنده مانده"not_survived = "زنده مانده نیست"شکل ، محورها = plt. subplots (nrows = 1 ، ncols = 2 ، figsize = (10 ، 4))زنان = train_df [train_df ['sex'] == 'زن']مردان = train_df [train_df ['sex'] == 'مرد']ax = sns. distplot (زنان [زنان ["زنده مانده"] == 1] . Age. Dropna () ، سطل = 18 ، برچسب = زنده مانده ، AX = محورها [0] ، kde =نادرست)ax = sns. distplot (زنان [زنان ["زنده مانده"] == 0] . Age. Dropna () ، سطل = 40 ، برچسب = not_survived ، ax = محورها [0] ، kde =نادرست)ax. legend ()ax. set_title ("زن")ax = sns. distplot (مردان [مردان ['زنده مانده'] == 1] . Age. Dropna () ، سطل = 18 ، برچسب = زنده مانده ، AX = محورها [1] ، kde =نادرست)ax = sns. distplot (مردان [مردان ["زنده مانده"] == 0] . Age. Dropna () ، سطل = 40 ، برچسب = not_survived ، ax = محورها [1] ، kde =نادرست)ax. legend ()_ = ax. set_title ('مرد')

می بینید که مردان در سن 18 تا 30 سال احتمال زنده ماندن زیادی دارند ، که برای زنان نیز کمی صادق است اما به طور کامل نیست. برای زنان احتمال بقا بین 14 تا 40 بیشتر است.

برای مردان احتمال بقا بین 5 تا 18 سالگی بسیار کم است ، اما این برای زنان صادق نیست. نکته دیگری که باید به آن توجه داشت این است که نوزادان نیز احتمال بقا کمی بالاتر دارند.

از آنجا که به نظر می رسد سنین خاصی وجود دارد که شانس بقا را افزایش داده است و از آنجا که می خواهم هر ویژگی تقریباً در همان مقیاس باشد ، بعداً گروه های سنی ایجاد می کنم.

3. SHARNED ، PCLASS و SEX:

faceTgrid = sns. facetgrid (train_df ، row = 'justked' ، size = 4. 5 ، Aspect = 1. 6)facetgrid. map (sns. pointplot ، "pclass" ، "زنده مانده" ، "جنس" ، پالت =هیچ کدام ، سفارش =هیچکدام ، hue_order =هیچ یک )facetgrid. add_legend ()

به نظر می رسد بسته به جنسیت ، با بقا ارتباط دارد.

زنان در بندر Q و بندر S شانس بیشتری برای بقا دارند. معکوس صحیح است ، اگر آنها در بندر C. باشند ، مردان در صورت وجود در بندر C احتمال بقا بالایی دارند ، اما اگر در بندر Q یا S. قرار بگیرند ، احتمال کمتری دارند.

همچنین به نظر می رسد PCLASS با بقا ارتباط دارد. ما در زیر طرح دیگری از آن ایجاد خواهیم کرد.

4. PCLASS:

sns. barplot (x = 'pclass' ، y = 'زنده مانده' ، data = train_df)

در اینجا به وضوح می بینیم که PCLASS در شانس بقا به افراد کمک می کند ، به خصوص اگر این شخص در کلاس 1 باشد. ما یک طرح PCLASS دیگری را در زیر ایجاد خواهیم کرد.

grid = sns. facetgrid (train_df ، col = 'survived' ، row = 'pclass' ، size = 2. 2 ، Aspect = 1. 6)grid. map (plt. hist ، "سن" ، alpha = . 5 ، سطل ها = 20)grid. add_legend () ؛

طرح بالا فرض ما در مورد PCLASS 1 را تأیید می کند ، اما ما همچنین می توانیم احتمال بالایی را نشان دهیم که فرد در PCLASS 3 زنده نخواهد ماند.

5. sibsp و parch:

Sibsp و Parch به عنوان یک ویژگی ترکیبی بیشتر حس می کنند ، که نشان می دهد تعداد کل اقوام ، شخص در تایتانیک دارد. من آن را در زیر ایجاد می کنم و همچنین ویژگی ای که اگر کسی تنها نباشد ، می گذارد.

data = [train_df ، test_df]برای مجموعه دادهدر داده ها:مجموعه داده ['بستگان'] = مجموعه داده ['sibsp'] + مجموعه داده ['parch']dataset.loc[dataset['relatives']>0 ، 'not_alone'] = 0dataSet. loc [DataSet ['Noties'] == 0 ، 'not_alone'] = 1DataSet ['not_alone'] = DataSet ['not_alone']. Astype (int)train_df ['not_alone']. value_counts ()
محورها = sns. factorplot ("بستگان" ، "زنده مانده" ،data = train_df ، Aspect = 2. 5 ،)

در اینجا می توانیم ببینیم که شما با 1 تا 3 واقعی ، احتمال زنده ماندن زیادی داشته اید ، اما اگر کمتر از 1 یا بیشتر از 3 داشته باشید (به جز برخی موارد با 6 بستگان) پایین تر.

پیش پردازش داده ها

اول ، من "مسافر" را از مجموعه قطار رها می کنم ، زیرا این امر به احتمال بقا در افراد کمک نمی کند. من آن را از مجموعه آزمون رها نمی کنم ، زیرا برای ارسال در آنجا لازم است.

train_df = train_df. drop (['asperengerid'] ، محور = 1)

داده های گمشده:

کابین: به عنوان یادآوری ، ما باید با کابین (687) ، سوار شدن (2) و سن (177) سر و کار داشته باشیم. ابتدا فکر کردم ، ما باید متغیر "کابین" را حذف کنیم اما بعد چیز جالبی پیدا کردم. یک شماره کابین مانند "C123" به نظر می رسد و نامه به عرشه اشاره دارد. بنابراین ما می خواهیم اینها را استخراج کنیم و یک ویژگی جدید ایجاد کنیم ، که حاوی یک عرشه افراد است. AfterWords ما ویژگی را به یک متغیر عددی تبدیل خواهیم کرد. مقادیر گمشده به صفر تبدیل می شوند. در تصویر زیر می توانید عرشه های واقعی تایتانیک را مشاهده کنید ، از A تا G.

وارد كردندوبارهعرشه =data = [train_df ، test_df]برای مجموعه دادهدر داده ها:DataSet ['Cabin'] = DataSet ['Cabin']. Fillna ("U0")DataSet ['Deck'] = DataSet ['Cabin']. نقشه (Lambda X: re. compile ("([[a-za-z]+)"). جستجو (x) . Group ())DataSet ['Deck'] = DataSet ['Deck']. نقشه (عرشه)DataSet ['Deck'] = DataSet ['Deck']. Fillna (0)DataSet ['Deck'] = DataSet ['Deck']. Astype (int)# اکنون می توانیم ویژگی کابین را رها کنیمtrain_df = train_df. drop (['کابین'] ، محور = 1)test_df = test_df. drop (['کابین'] ، محور = 1)

سن: اکنون می توانیم با ویژگی های سن از دست رفته ، مسئله را حل کنیم. من آرایه ای را ایجاد می کنم که حاوی اعداد تصادفی باشد ، که بر اساس میانگین سنی در رابطه با انحراف استاندارد و is_null محاسبه می شوند.

data = [train_df ، test_df]برای مجموعه دادهدر داده ها:میانگین = train_df ["سن"]. میانگین ()std = test_df ["سن"]. std ()is_null = مجموعه داده ["سن"]. isnull (). جمع ()# تعداد تصادفی بین میانگین ، STD و IS_NULL محاسبه کنیدRAND_AGE = NP. RANDOM. RANDINT (میانگین - STD ، میانگین + STD ، اندازه = is_null)# مقادیر نان را در ستون سنی با مقادیر تصادفی تولید شده پر کنیدAge_slice = مجموعه داده ["سن"]. کپی ()Age_slice [np. isnan (Age_slice)] = RAND_AGEمجموعه داده ["سن"] = AGE_SLICEمجموعه داده ["سن"] = train_df ["سن"]. Astype (int)train_df ["سن"]. isnull (). جمع ()

سوار شده:

از آنجا که ویژگی سوار شده فقط 2 مقدار گمشده دارد ، ما فقط این موارد را با رایج ترین آنها پر خواهیم کرد.

train_df ['justed']. توصیف ()
common_value = 's'data = [train_df ، test_df]برای مجموعه دادهدر داده ها:DataSet ['justed'] = DataSet ['justed']. fillna (common_value)

تبدیل ویژگی ها:

train_df. info ()

در بالا می بینید که "کرایه" یک شناور است و ما باید با 4 ویژگی طبقه بندی شده مقابله کنیم: نام ، رابطه جنسی ، بلیط و شروع شده. بیایید یکی پس از دیگری تحقیق کنیم و از آن عبور کنیم.

کرایه: تبدیل "کرایه" از Float به Int64 ، با استفاده از عملکرد "ASTYPE ()" Pandas فراهم می کند:

data = [train_df ، test_df]برای مجموعه دادهدر داده ها:مجموعه داده ['کرایه'] = مجموعه داده ['کرایه']. fillna (0)مجموعه داده ['کرایه'] = مجموعه داده ['کرایه']. Astype (int)

نام: ما از ویژگی نام برای استخراج عناوین از نام استفاده خواهیم کرد تا بتوانیم یک ویژگی جدید از آن بسازیم.

data = [train_df ، test_df]عناوین =برای مجموعه دادهدر داده ها:# استخراج عناوینDataSet ['title'] = dataSet. name. str. extract ('([A-za-z]+) .' ، Expand =نادرست)# عناوین را با عنوان متداول تر جایگزین کنید یا به عنوان نادرDataSet ['TITLE'] = DATASET ['TITLE']. جایگزین (["بانوی" ، "Countess" ، "Capt" ، "Col" ، "Don" ، "DR" ، 
n"عمده" ، "Rev" ، "آقا" ، "Jonkheer" ، "Dona"] ، "نادر")DataSet ['title'] = DataSet ['title']. جایگزین ('Mlle' ، 'Miss')DataSet ['title'] = DataSet ['title']. جایگزین ('MS' ، 'Miss')DataSet ['TITE'] = DATASET ['TITLE']. جایگزین ('MME' ، 'MRS')# عناوین را به اعداد تبدیل کنیدDataSet ['title'] = DataSet ['Title']. نقشه (عناوین)# پر کردن نان با 0 ، برای ایمن شدنDataSet ['TITE'] = DATASET ['TITLE']. FILLNA (0)train_df = train_df. drop (['name'] ، محور = 1)test_df = test_df. drop (['name'] ، محور = 1)

سکس: ویژگی "جنس" را به عددی تبدیل کنید.

جنس =data = [train_df ، test_df]برای مجموعه دادهدر داده ها:DataSet ['Sex'] = DataSet ['Sex']. نقشه (جنس)

بلیط:

train_df ['بلیط']. توصیف ()

از آنجا که ویژگی بلیط دارای 681 بلیط منحصر به فرد است ، تبدیل آنها به دسته های مفید کمی دشوار خواهد بود. بنابراین ما آن را از مجموعه داده رها خواهیم کرد.

train_df = train_df. drop (['بلیط'] ، محور = 1)test_df = test_df. drop (['بلیط'] ، محور = 1)

سوار شده: ویژگی "شروع شده" را به عددی تبدیل کنید.

درگاه ها =data = [train_df ، test_df]برای مجموعه دادهدر داده ها:DataSet ['justed'] = DataSet ['justed']. نقشه (پورت ها)

ایجاد دسته بندی ها:

اکنون در ویژگی های زیر دسته هایی ایجاد خواهیم کرد:

سن: اکنون باید ویژگی "سن" را تبدیل کنیم. ابتدا آن را از شناور به عدد صحیح تبدیل خواهیم کرد. سپس با طبقه بندی هر سنی در یک گروه ، متغیر جدید ‘Agegroup" را ایجاد خواهیم کرد. توجه داشته باشید که توجه به نحوه تشکیل این گروه ها بسیار مهم است ، زیرا به عنوان مثال نمی خواهید 80 ٪ از داده های شما در گروه 1 قرار می گیرد.

data = [train_df ، test_df]برای مجموعه دادهدر داده ها:DataSet ['Age'] = DataSet ['Age']. Astype (int)dataset.loc[ dataset['Age'] dataset.loc[(dataset['Age']> 11) & (dataset['Age'] dataset.loc[(dataset['Age']> 18) & (dataset['Age'] dataset.loc[(dataset['Age']> 22) & (dataset['Age'] dataset.loc[(dataset['Age']> 27) & (dataset['Age'] dataset.loc[(dataset['Age']> 33) & (dataset['Age'] dataset.loc[(dataset['Age']> 40) & (dataset['Age'] dataset.loc[ dataset['Age']>66 ، 'سن'] = 6# بیایید ببینیم که چگونه Train_df ['Age'] توزیع شده است. Value_Counts ()

کرایه: برای ویژگی "کرایه" ، ما باید همان کار را با ویژگی "سن" انجام دهیم. اما این کار ساده ای نیست ، زیرا اگر دامنه مقادیر کرایه را به چند دسته به همان اندازه بزرگ کاهش دهیم ، 80 ٪ از مقادیر در رده اول قرار می گیرند. خوشبختانه ، ما می توانیم از عملکرد Sklea "qcut ()" استفاده کنیم ، که می توانیم از آن برای دیدن استفاده کنیم ، چگونه می توانیم دسته بندی ها را تشکیل دهیم.

train_df. head (10)
data = [train_df ، test_df]برای مجموعه دادهدر داده ها:dataset.loc[ dataset['Fare'] dataset.loc[(dataset['Fare']> 7.91) & (dataset['Fare'] dataset.loc[(dataset['Fare']> 14.454) & (dataset['Fare'] dataset.loc[(dataset['Fare']> 31) & (dataset['Fare'] dataset.loc[(dataset['Fare']> 99) & (dataset['Fare'] dataset.loc[ dataset['Fare']>250 ، 'کرایه'] = 5مجموعه داده ['کرایه'] = مجموعه داده ['کرایه']. Astype (int)

ایجاد ویژگی های جدید

من دو ویژگی جدید را به مجموعه داده اضافه می کنم ، که من از سایر ویژگی ها محاسبه می کنم.

1. کلاس سن

data = [train_df ، test_df]برای مجموعه دادهدر داده ها:DataSet ['Age_Class'] = DataSet ['Age']* DataSet ['PClass']

2. کرایه برای هر نفر

برای مجموعه دادهدر داده ها:DataSet ['fare_per_person'] = مجموعه داده ['کرایه']/(مجموعه داده ['بستگان']+1)DataSet ['fare_per_person'] = DataSet ['fare_per_person']. Astype (int)# بیایید قبل از شروع آموزش مدل ها ، آخرین نگاهی به مجموعه آموزش بیندازیم.train_df. head (10)

ساخت مدل های یادگیری ماشین

اکنون ما چندین مدل یادگیری ماشین را آموزش خواهیم داد و نتایج آنها را مقایسه خواهیم کرد. توجه داشته باشید که از آنجا که مجموعه داده ها برچسب هایی را برای مجموعه آزمایش خود ارائه نمی دهد ، ما باید از پیش بینی های موجود در مجموعه آموزش استفاده کنیم تا الگوریتم ها را با یکدیگر مقایسه کنیم. بعداً ، ما از اعتبار سنجی متقاطع استفاده خواهیم کرد.

x_train = train_df. drop ("زنده مانده" ، محور = 1)y_train = train_df ["زنده مانده"]x_test = test_df. drop ("PassengerId" ، محور = 1) . copy ()

نزول شیب تصادفی (SGD):

sgd = linear_model. sgdclassifer (max_iter = 5 ، tol =هیچ یک )sgd. fit (x_train ، y_train)y_pred = sgd. predict (x_test)sgd. score (x_train ، y_train)acc_sgd = دور (sgd. score (x_train ، y_train) * 100 ، 2)

جنگل تصادفی:

Random_forest = RandomForestClassifier (n_estimators = 100)random_forest. fit (x_train ، y_train)y_prediction = random_forest. predict (x_test)random_forest. score (x_train ، y_train)acc_random_forest = دور (random_forest. score (x_train ، y_train) * 100 ، 2)

رگرسیون لجستیک:

logreg = LogisticRegression ()logreg. fit (x_train ، y_train)y_pred = logreg. predict (x_test)acc_log = دور (logreg. score (x_train ، y_train) * 100 ، 2)

K نزدیکترین همسایه:

# k k = kneighborsclassifier (n_neighbors = 3) k. fit (x_train ، y_train) y_pred = k. predict (x_test) acc_k = دور (k. score (x_train ، y_train) * 100 ، 2)

Bayes ساده لووی گاوسی:

Gaussian = Gaussiab () gaussian. fit (x_train ، y_train) y_pred = gaussian. predict (x_test) acc_gaussian = دور (gaussian. score (x_train ، y_train) * 100 ، 2)

Perceptron:

Perceptron = Perceptron (max_iter = 5)perceptron. fit (x_train ، y_train)y_pred = perceptron. predict (x_test)acc_perceptron = دور (perceptron. score (x_train ، y_train) * 100 ، 2)

دستگاه بردار پشتیبانی خطی:

linear_svc = linearsvc ()linear_svc. fit (x_train ، y_train)y_pred = linear_svc. predict (x_test)acc_linear_svc = دور (linear_svc. score (x_train ، y_train) * 100 ، 2)

AMarkets

ما را در سایت دوره ی فارکس دنبال می کنید

برچسب : نویسنده : پرویز حبّی بازدید : <-PostHit-> تاريخ : چهارشنبه 18 مرداد 1402 ساعت: 23:32