জুপিটারে প্রজেক্ট টাইটানিক
Python has been an important part of Google since the beginning, and remains so as the system grows and evolves. Today dozens of Google engineers use Python, and we're looking for more people with skills in this language.
-- Peter Norvig, Director of search quality at Google, Inc.
"আর" প্রোগ্রামিং এনভায়রনমেন্টএর পাশাপাশি আমরা পুরো এক্সারসাইজটা দেখাবো পাইথনে। এর মানে এই নয় যে আমরা "আর"এ করা এক্সারসাইজটা দেখবো না। এই পাইথনে করা এক্সারসাইজ বুঝতে আমাদের দেখে আসতে হবে পুরো টাইটানিক প্রজেক্ট "আর" এনভায়রনমেন্টে। সব জায়গায় বেসিক কনসেপ্ট একই। তবে, 'আর' দিয়ে বোঝা যায় ভালো। আগেই বলেছি যারা কম্পিউটার প্রযুক্তিতে পড়েননি অথবা মেশিন লার্নিং একদম ভেতর থেকে হাতেকলমে শিখতে চান, তাদের জন্য 'আর' অন্য লেভেলের জিনিস।
কম্পিউটার প্রযুক্তিতে পড়েছেন আর পাইথন জানেন বলে 'মেশিন লার্নিং' শিখে যাবেন সেটাও ভ্রান্ত ধারণা। পাইথন একটা ভালো ফ্রেমওয়ার্ক, প্রায় অনেককিছুই করা যায়। তাই বলে মেশিন লার্নিং আর পাইথন পাশাপাশি সমার্থক শব্দ সেটা বলা যাবে না। সেটা সামনে গেলে দেখতে পাবেন।
আমার কথা বললে বলবো, আমি দুটোই শিখেছি কারণ - দুটো 'দুই' জায়গায় ভালো। মেশিন লার্নিং শেখার শুরুতে 'আর' ভালো, প্রোডাকশন লেভেলে পাইথন ভালো। যেখানে যেটা লাগে। ছোট দূরত্বে রিকশা ভালো, বড় দূরত্বে হয়তোবা মোটর সাইকেল ভালো। আমাদের জানতে হবে কোথায় কি লাগবে? যুগটা অপটিমাইজেশনের যুগ। দরকার মতো আরো কিছু জিনিস শিখতে হতে পারে। লজ্জা করলেই ক্ষতি। কিছুই শেখা যাবে না। এই পঞ্চাশ বছরের কাছাকাছি বয়সেও আমাকে শিখতে হচ্ছে অনেককিছু। না শিখলে - ঝরে পড়ে যাবেন যে কেউ।

১. জুপিটার নোটবুক ইনস্টলেশন

আমরা যারা পাইথন নিয়ে কাজ করি তাদের একটা ডেভেলপমেন্ট ইন্টারফেস দরকার। আর স্টুডিওর মতো কিছু একটা। সেখানে আমরা একটা ওয়েববেসড ইন্টারফেস দিয়ে তৈরি জুপিটার নোটবুক ব্যবহার করবো। পাইথন, আর থেকে শুরু করে এমন কোন নামকরা প্রোগ্রামিং এনভায়রনমেন্ট নেই যেখানে জুপিটার ফ্রেমওয়ার্ক কাজ করে না। মজার কথা হচ্ছে পুরো এনভায়রনমেন্ট ভ্যারিয়েবলসহ আপনার কাজ শেয়ার করা যায় সব জায়গায়, এমনকি গিট্হাবেও।

১.১ জুপিটার ইনস্টলেশন - অ্যানাকোন্ডা

জুপিটারের উইন্ডোজ ইনস্টলেশন একেবারে পানি ভাত। মানে ১. ডাউনলোড করে নিন অ্যানাকোন্ডা, নিচের সাইট থেকে। ২. এরপর ক্লিক, ক্লিক আর ক্লিক। শুধু একটা জিনিস খেয়াল রাখবেন, ইনস্টলেশন পাথে যাতে স্পেস দিয়ে কোন ফোল্ডার না থাকে। উদাহরণ হিসেবে বলা যায় "C:\Users\Test\Anaconda3", ঠিক আছে তো?

১.২ জুপিটার নোটবুক চালু

উইন্ডোজের রান অথবা কমান্ড প্রম্পটে লিখুন, পুরোটা লিখতে হয়না। তার আগেই চলে আসে ডেস্কটপ অ্যাপের নাম।
jupyter notebook
খেয়াল রাখবেন - প্রতিটা কমান্ড লিখবেন In [সংখ্যা] সেলে এবং সেটার আউটপুট আপনি দেখতে পারবেন Out [সংখ্যা] দিয়ে। প্রতিবার কমান্ড লেখার পর 'সেল' মেন্যু অথবা 'সেল' বাটনে 'কোড' হিসেবে সিলেক্ট করে রান বাটন চাপবেন।

১.৩ কোথায় পাবো এই স্ক্রিপ্ট?

২. টাইটানিক জাহাজ ডুবিতে বেচেঁ যাবার প্রেডিকশন

    প্রবলেম স্টেটমেন্টকে সংজ্ঞায়িত করা
    ডাটা কোথায় পাবো?
    এক্সপ্লোরাটরি ডাটা অ্যানালাইসিস
    ফীচার ইঞ্জিনিয়ারিং
    মডেলিং
    টেস্টিং

২.১ প্রবলেম স্টেটমেন্ট: কি সমস্যা সমাধান করবো?

    আমরা জানতে চাইবো কারা কারা বেঁচে বা মারা গিয়েছিলেন?
    আমরা মেশিন লার্নিং টুল ব্যবহার করে দেখতে চাইবো কোন ধরনের মানুষগুলো বেঁচে যাবেন?
    আমাদের এই প্রতিযোগিতা চাচ্ছে যাতে আমরা বাইনারি 'আউটকাম' প্রেডিক্ট করি। এখানে ০ মানে উনি মারা গেছেন, ১ মানে উনি বেঁচে গিয়েছিলেন।

২.৩ ডাটা কোথায় পাব?

আমরা ডাটা কালেক্ট করবো ক্যাগল সাইট থেকে

২.৪ ট্রেনিং এবং টেস্ট ডাটা লোড করে নেব পান্ডা দিয়ে

এখন থেকে আমরা সবকিছু রেফার করবো "আর" এর সাথে মিলিয়ে। মনে আছে ডাটাফ্রেমের কথা? পাইথনে ডাটাফ্রেম নিয়ে কাজ করে পান্ডা নামের অসাধারণ লাইব্রেরি।
1
import pandas as pd
2
3
train = pd.read_csv('datasets/train.csv')
4
test = pd.read_csv('datasets/test.csv')
Copied!

৩. এক্সপ্লোরাটরি ডাটা অ্যানালাইসিস

শুরুতেই ডাটাফ্রেমের মাথা দেখি, মাত্র ৫টা সারি ধরে। train.head ফাংশন মানে দেখাও ট্রেইন ডাটাফ্রেমের মাথার কিছু অংশ। এখানে NaN মানে ডাটা নেই। ডাটাটা মিসিং।
1
train.head(5)
Copied!
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
PassengerId
Survived
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
0
1
0
3
Braund, Mr. Owen Harris
male
22.0
1
0
A/5 21171
7.2500
NaN
S
1
2
1
1
Cumings, Mrs. John Bradley (Florence Briggs Th...
female
38.0
1
0
PC 17599
71.2833
C85
C
2
3
1
3
Heikkinen, Miss. Laina
female
26.0
0
0
STON/O2. 3101282
7.9250
NaN
S
3
4
1
1
Futrelle, Mrs. Jacques Heath (Lily May Peel)
female
35.0
1
0
113803
53.1000
C123
S
4
5
0
3
Allen, Mr. William Henry
male
35.0
0
0
373450
8.0500
NaN
S

৩.১ ডাটা ডিকশনারি

    ভ্যারিয়েবল - মানে কি? - ভ্যালু কি হতে পারে
    survival = বেঁচে গিয়েছেন/মারা গিয়েছেন 1 = বেঁচে গিয়েছেন; 0 = মারা গিয়েছেন
    pclass = টিকেটের ক্লাস বা শ্রেণী 1st = প্রথম; 2nd = দ্বিতীয়; 3rd = তৃতীয়
    sex = মহিলা না পুরুষ
    Age = বয়স বছরে, এখানে অনেক ডাটা মিসিং
    sibsp = উনার ভাইবোন অথবা স্বামী/স্ত্রীর সংখ্যা, ওই টাইটানিক জাহাজে, siblings / spouses সংখ্যায়
    parch = উনার বাবা মা অথবা বাচ্চাদের সংখ্যা, parent /children সংখ্যায়
    ticket = টিকেট নাম্বার, কেবিন নম্বর ধরে টিকেট নম্বর
    fare = টাইটানিক যাত্রীর ভাড়া
    cabin = টাইটানিকের কেবিন নাম্বার
    embarked = কোথা থেকে উঠেছেন, বিশেষ করে কোন পোর্ট থেকে C = Cherbourg, Q = Queenstown, S = Southampton
আমরা জানতে চাইবো কতোটা সারি আর কলাম আছে আমাদের ডাটাসেটে। আমরা দেখতে পাচ্ছি ৮৯১ কলাম আর ১২ সারি।
1
train.shape
Copied!
1
(891, 12)
Copied!
1
test.shape
Copied!
1
(418, 11)
Copied!
1
train.info()
Copied!
1
<class 'pandas.core.frame.DataFrame'>
2
RangeIndex: 891 entries, 0 to 890
3
Data columns (total 12 columns):
4
PassengerId 891 non-null int64
5
Survived 891 non-null int64
6
Pclass 891 non-null int64
7
Name 891 non-null object
8
Sex 891 non-null object
9
Age 714 non-null float64
10
SibSp 891 non-null int64
11
Parch 891 non-null int64
12
Ticket 891 non-null object
13
Fare 891 non-null float64
14
Cabin 204 non-null object
15
Embarked 889 non-null object
16
dtypes: float64(2), int64(5), object(5)
17
memory usage: 83.6+ KB
Copied!
আপনারা দেখেছেন কি? Age, Cabin, Embarked ভ্যারিয়েবলগুলোতে ডাটা মিসিং।
1
test.info()
Copied!
1
<class 'pandas.core.frame.DataFrame'>
2
RangeIndex: 418 entries, 0 to 417
3
Data columns (total 11 columns):
4
PassengerId 418 non-null int64
5
Pclass 418 non-null int64
6
Name 418 non-null object
7
Sex 418 non-null object
8
Age 332 non-null float64
9
SibSp 418 non-null int64
10
Parch 418 non-null int64
11
Ticket 418 non-null object
12
Fare 417 non-null float64
13
Cabin 91 non-null object
14
Embarked 418 non-null object
15
dtypes: float64(2), int64(4), object(5)
16
memory usage: 36.0+ KB
Copied!
আমরা দেখতে পাচ্ছি বয়স ভ্যারিয়েবলটাতে অনেক ভ্যালু মিসিং। বেশ সমস্যার কথা। ৮৯১ সারির মধ্যে ৭১৪ সারিতে ভ্যালু আছে। কেবিনে দেখা যাচ্ছে মাত্র ২০৪টাতে ভ্যালু আছে। ভয়ঙ্কর সমস্যা। ডাটাফ্রেমে কোন কোন ভ্যারিয়েবলে কতোটা ভ্যালু মিসিং (NaN) সেটা জানতে আমরা ব্যবহার করছি isnull() মেথড + এরপর সেগুলোকে যোগ করেছি sum() মেথড দিয়ে।
1
train.isnull().sum()
Copied!
1
PassengerId 0
2
Survived 0
3
Pclass 0
4
Name 0
5
Sex 0
6
Age 177
7
SibSp 0
8
Parch 0
9
Ticket 0
10
Fare 0
11
Cabin 687
12
Embarked 2
13
dtype: int64
Copied!
1
test.isnull().sum()
Copied!
1
PassengerId 0
2
Pclass 0
3
Name 0
4
Sex 0
5
Age 86
6
SibSp 0
7
Parch 0
8
Ticket 0
9
Fare 1
10
Cabin 327
11
Embarked 0
12
dtype: int64
Copied!
টেস্ট ডাটাফ্রেমে একই কাহিনী। মানে ডাটা মিসিং। এখানে ১৭৭টা সারি মিসিং বয়স ভ্যারিয়েবলে। কেবিনের সাথে কানেক্ট করা যাচ্ছে না ৬৮৭টা ভ্যালু। কোথা থেকে কে উঠেছে সেটাতে নেই ২টা ভ্যালু। আগেই দেখেছেন কেন সমস্যা করে মিসিং ভ্যালু? জানতে হলে আপনাকে পড়তে হবে মেশিন লার্নিং প্রেডিকশন চ্যাপ্টারটা।

৪. ডাটা ভিজ্যুয়ালাইজেশন

এটা ঠিক যে পাইথনও আস্তে আস্তে সুন্দর হয়ে উঠছে ডাটা ভিজ্যুয়ালাইজেশন লাইব্রেরিতে। matplotlib.pyplot লাইব্রেরি দেয় আমাদের ম্যাটল্যাবের মতো চমৎকার প্লটিং ফ্রেমওয়ার্ক। ছবিগুলো জুপিটার নোটবুকে একসাথে দেখানোর জন্য inline মোড নিয়ে আসা হয়েছে। seaborn হচ্ছে পাইথনের matplotlib ভিত্তিক স্ট্যাটিসটিকাল গ্রাফিক্যাল লাইব্রেরি। সুন্দর বটে।
1
import matplotlib.pyplot as plt
2
%matplotlib inline
3
import seaborn as sns
4
sns.set()
Copied!

৪.১ ক্যাটেগরিক্যাল ফিচারগুলো নিয়ে বার চার্ট

    Pclass
    Sex
    SibSp
    Parch
    Embarked
    Cabin
এখানে আমরা ছবি দিয়ে একটা সম্পর্ক খুঁজবো কারা কারা বেঁচে গিয়েছিলেন - বাকি ভ্যারিয়েবলগুলোর সাথে কানেক্ট করে। পাইথনে একটা বারচার্ট ফাংশন ডিফাইন করছি যাতে বিভিন্ন ভ্যারিয়েবলগুলোকে একেকটা প্যারামিটার ধরে ধরে পাঠাতে পারি আমাদের নতুন তৈরি করা ফাংশনে। এখানে দুটো বারচার্ট তৈরি করবে আমাদের প্যারামিটার - ['Survived','Dead'] - সবকিছুর ভ্যালুগুলোকে যোগ করবো শেষে।
1
def bar_chart(feature):
2
survived = train[train['Survived']==1][feature].value_counts()
3
dead = train[train['Survived']==0][feature].value_counts()
4
df = pd.DataFrame([survived,dead])
5
df.index = ['Survived','Dead']
6
df.plot(kind='bar',stacked=True, figsize=(10,5))
Copied!
এখন ফিচারে পাঠাই একটা করে আমাদের ভ্যারিয়েবলগুলোকে। শুরুতেই 'Sex'
1
bar_chart('Sex')
Copied!
png
এই চার্ট বলছে পুরুষ থেকে বেশি বেঁচেছেন মহিলারা। পরেরটা 'Pclass'
1
bar_chart('Pclass')
Copied!
png
এখানে দেখা গেলো প্রথম শ্রেণীর যাত্রীরা বেঁচেছেন বেশি। এদিকে তৃতীয় শ্রেনীর যাত্রীরাও মারা গিয়েছেন অন্য যেকোন শ্রেণী থেকে।
1
bar_chart('SibSp')
Copied!
png
এখানের ব্যাপারটা একটু ভাবিয়েছে আমাদের। ওই ফ্যামিলিগুলোতে যারা দুই জনের বেশি ছিলেন তারা বেঁচেছিলেন বেশি। যারা শুধুমাত্র নিজেরা মানে একা ছিলেন তারা বেঁচেছেন কম।
1
bar_chart('Parch')
Copied!
png
যারা বাবা মা অথবা বাচ্চাদের নিয়ে ছিলেন টাইটানিকে - তারা বেঁচেছেন বেশি। যারা একা ছিলেন তারা অতোটা বাঁচতে পারেননি।
1
bar_chart('Embarked')
Copied!
png
এই চার্ট কি বলে?
যারা Cherbourg থেকে উঠেছিলেন তারা অন্য জায়গা থেকে ওঠা মানুষদের থেকে বেঁচেছেন বেশি। Queenstown আর Southampton থেকে ওঠা মানুষগুলো বাঁচেননি বেশি। এর মানে হচ্ছে Cherbourg এলাকার মানুষ অবস্থাপন্ন।

৫. ফিচার ইঞ্জিনিয়ারিং

এটা নিয়ে একটা বিশাল বড় চ্যাপ্টার লিখেছি আগে। মেশিন লার্নিং প্রেডিকশন নিয়ে। 'ফিচার ইঞ্জিনিয়ারিং' হচ্ছে একটা ডোমেইন নলেজ নিয়ে কিছু ফিচার তৈরী করা যাতে আমাদের মেশিন লার্নিং অ্যালগরিদম চমৎকারভাবে কাজ করে। আমি অনুরোধ করবো সেই চ্যাপ্টারটা আবার দেখে নিতে। কারণ এটা একটা খুবই দরকারি জিনিস।
আমরা জানি মেশিন তো আমার আপনার মতো ফিচার চেনে না। তার জন্য সেটাকে সংখ্যায় দিলে ভালো কাজ করে। সেরকম কিছু করবো আমরা এখানে। শুরুতেই আমরা ভালোভাবে দেখি আমাদের ডাটাসেটগুলো।

৫.১ আচ্ছা, টাইটানিকের কিভাবে ডুবেছিল?

আমরা এখানে রিসার্চ করতে গিয়ে দেখলাম টাইটানিকের পেছনের দিক থেকে ডোবা শুরু করেছিল। আর ওখানেই শুরু হয়েছিল ৩য় শ্রেণী। তারমানে Pclas কিন্তু একটা বড় ক্লাসিফায়ার। একটু পেছনে গেলে দেখবেন কিভাবে নাম এখানে বড় একটা রোল প্লে করেছিল।

৫.২ নাম

প্রথমেই যোগ করে নেই টেস্ট আর ট্রেনিং ডাটাসেট। 'Title' ডাটাসেট তৈরি করি নাম থেকে।
1
train_test_data = [train, test]
2
3
for dataset in train_test_data:
4
dataset['Title'] = dataset['Name'].str.extract(' ([A-Za-z]+)\.', expand=False)
Copied!
ট্রেইন আর টেস্ট ডাটাসেটে টাইটেলগুলোর সংখ্যা বের করি। এর আগেও ব্যাপারটা করেছিলাম "আর" দিয়ে।
1
train['Title'].value_counts()
Copied!
1
Mr 517
2
Miss 182
3
Mrs 125
4
Master 40
5
Dr 7
6
Rev 6
7
Major 2
8
Col 2
9
Mlle 2
10
Mme 1
11
Ms 1
12
Sir 1
13
Capt 1
14
Countess 1
15
Don 1
16
Lady 1
17
Jonkheer 1
18
Name: Title, dtype: int64
Copied!
1
test['Title'].value_counts()
Copied!
1
Mr 240
2
Miss 78
3
Mrs 72
4
Master 21
5
Rev 2
6
Col 2
7
Ms 1
8
Dr 1
9
Dona 1
10
Name: Title, dtype: int64
Copied!

টাইটেলগুলোকে ম্যাপ করি সংখ্যার সাথে

আগের মতো বাকি অদরকারি টাইটেলগুলোকে ম্যাপ করে দেই ৩ এর সাথে।
Mr : 0 Miss : 1 Mrs: 2 Others: 3
1
title_mapping = {"Mr": 0, "Miss": 1, "Mrs": 2,
2
"Master": 3, "Dr": 3, "Rev": 3, "Col": 3, "Major": 3, "Mlle": 3,"Countess": 3,
3
"Ms": 3, "Lady": 3, "Jonkheer": 3, "Don": 3, "Dona" : 3, "Mme": 3,"Capt": 3,"Sir": 3 }
4
for dataset in train_test_data:
5
dataset['Title'] = dataset['Title'].map(title_mapping)
Copied!
ভালো করে দেখুন Title ভ্যারিয়েবলগুলো। নতুন ম্যাপিং হয়ে গেছে আমাদের দরকার মতো।
1
train.head()
Copied!
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
PassengerId
Survived
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
Title
0
1
0
3
Braund, Mr. Owen Harris
male
22.0
1
0
A/5 21171
7.2500
NaN
S
0
1
2
1
1
Cumings, Mrs. John Bradley (Florence Briggs Th...
female
38.0
1
0
PC 17599
71.2833
C85
C
2
2
3
1
3
Heikkinen, Miss. Laina
female
26.0
0
0
STON/O2. 3101282
7.9250
NaN
S
1
3
4
1
1
Futrelle, Mrs. Jacques Heath (Lily May Peel)
female
35.0
1
0
113803
53.1000
C123
S
2
4
5
0
3
Allen, Mr. William Henry
male
35.0
0
0
373450
8.0500
NaN
S
0
1
test.head()
Copied!
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
PassengerId
Pclass
Name
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
Title
0
892
3
Kelly, Mr. James
male
34.5
0
0
330911
7.8292
NaN
Q
0
1
893
3
Wilkes, Mrs. James (Ellen Needs)
female
47.0
1
0
363272
7.0000
NaN
S
2
2
894
2
Myles, Mr. Thomas Francis
male
62.0
0
0
240276
9.6875
NaN
Q
0
3
895
3
Wirz, Mr. Albert
male
27.0
0
0
315154
8.6625
NaN
S
0
4
896
3
Hirvonen, Mrs. Alexander (Helga E Lindqvist)
female
22.0
1
1
3101298
12.2875
NaN
S
2
1
bar_chart('Title')
Copied!
png
টাইটেল বের করার পর নাম দরকার আছে কি? ফেলে দেই 'Name' ভ্যারিয়েবল।
1
# delete unnecessary feature from dataset
2
train.drop('Name', axis=1, inplace=True)
3
test.drop('Name', axis=1, inplace=True)
Copied!
1
train.head()
Copied!
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
PassengerId
Survived
Pclass
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
Title
0
1
0
3
male
22.0
1
0
A/5 21171
7.2500
NaN
S
0
1
2
1
1
female
38.0
1
0
PC 17599
71.2833
C85
C
2
2
3
1
3
female
26.0
0
0
STON/O2. 3101282
7.9250
NaN
S
1
3
4
1
1
female
35.0
1
0
113803
53.1000
C123
S
2
4
5
0
3
male
35.0
0
0
373450
8.0500
NaN
S
0
নাম কিন্তু নেই আর!
1
test.head()
Copied!
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
PassengerId
Pclass
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
Title
0
892
3
male
34.5
0
0
330911
7.8292
NaN
Q
0
1
893
3
female
47.0
1
0
363272
7.0000
NaN
S
2
2
894
2
male
62.0
0
0
240276
9.6875
NaN
Q
0
3
895
3
male
27.0
0
0
315154
8.6625
NaN
S
0
4
896
3
female
22.0
1
1
3101298
12.2875
NaN
S
2

৫.৩ মহিলা পুরুষকে ম্যাপিং করি সংখ্যায়

male: 0 female: 1
1
sex_mapping = {"male": 0, "female": 1}
2
for dataset in train_test_data:
3
dataset['Sex'] = dataset['Sex'].map(sex_mapping)
Copied!
1
bar_chart('Sex')
Copied!
png
এখানে কিন্তু মহিলা পুরুষ নেই আর! সেখানে তাদেরকে রিপ্রেজেন্ট করা হচ্ছে ০ এবং ১ দিয়ে।

৫.৪ বয়স

৫.৪.১ প্রচুর বয়সের ডাটা মিসিং আছে আমাদের ডাটাসেটে

একটা কাজ করি বরং
টাইটেলের "গড়" বয়স দিয়ে ভরে ফেলি আমাদের না থাকা ভ্যালুগুলোর জায়গায় - তাহলে আমাদের Random-Forest এনসেমবল ক্লাসিফায়ার ভালো ভাবে কাজ করবে। "Mr": 0, "Miss": 1, "Mrs": 2 এবং Others: 3 এর গড় বয়স দিয়ে দিচ্ছি এখানে।
1
train.head()
Copied!
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
PassengerId
Survived
Pclass
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
Title
0
1
0
3
0
22.0
1
0
A/5 21171
7.2500
NaN
S
0
1
2
1
1
1
38.0
1
0
PC 17599
71.2833
C85
C
2
2
3
1
3
1
26.0
0
0
STON/O2. 3101282
7.9250
NaN
S
1
3
4
1
1
1
35.0
1
0
113803
53.1000
C123
S
2
4
5
0
3
0
35.0
0
0
373450
8.0500
NaN
S
0
1
# fill missing age with median age for each title (Mr, Mrs, Miss, Others)
2
train["Age"].fillna(train.groupby("Title")["Age"].transform("median"), inplace=True)
3
test["Age"].fillna(test.groupby("Title")["Age"].transform("median"), inplace=True)
Copied!
1
train.groupby("Title")["Age"].transform("median")
2
train.head()
Copied!
.dataframe thead tr:only-child th { text-align: right; } .dataframe thead th { text-align: left; } .dataframe tbody tr th { vertical-align: top; }
PassengerId
Survived
Pclass
Sex
Age
SibSp
Parch
Ticket
Fare
Cabin
Embarked
Title
0
1
0
3
0
22.0
1
0
A/5 21171
7.2500
NaN
S
0
1
2
1
1
1
38.0
1
0
PC 17599
71.2833
C85
C
2
2
3
1
3
1
26.0
0
0
STON/O2. 3101282
7.9250
NaN
S
1
3
4
1
1
1
35.0
1
0
113803
53.1000
C123
S
2
4
5
0
3
0
35.0
0
0
373450
8.0500
NaN
S
0
দেখুন কোন বয়স কিন্তু আর বাদ নেই। বয়সকে গড় টাইটেলের আউটকাম দিয়ে ভর্তি করা হয়েছে।
আমরা একটা চার্ট আঁকি এখানে। মারা যাওয়া মানুষগুলোর বয়স ১৬ থেকে ৩৪ এর মধ্যে বেশি দেখা যাচ্ছে আমাদের ছবিতে। তার আগের অথবা পরের বয়সগুলোর মানুষ বেঁচে গিয়েছে বেশি। প্লটে দেখা যাচ্ছে ৩০ বছরের মানুষগুলো মারা গিয়েছে বেশি। আমরা অনেকগুলো চার্ট আঁকবো কারণ আমাদের বয়স কিন্তু একটা বড়ো ক্লাসিফায়ার। প্রথমে কোন লিমিট রাখবো না - মানে শুরু থেকে শেষ পর্যন্ত - facet.set(xlim=(0, train['Age'].max()))
1
facet = sns.FacetGrid(train, hue="Survived",aspect=4)
2
facet.map(sns.kdeplot,'Age',shade= True)
3
facet.set(xlim=(0, train['Age'].max()))
4
facet.add_legend()
5
6
plt.show()
Copied!
png
আমাদের প্লটের বয়সসীমা কমিয়ে নিয়ে আসি ০ থেকে ২০ এর মধ্যে plt.xlim(0, 20) দিয়ে। এরপর ২০ থেকে ৩০, ৪০, ৫০, ৬০, ৭০ এবং ৮০ পর্যন্ত। আপনার মেশিন, আপনার মনের মাধুরী মিশিয়ে তৈরি করুন একেকটা প্লট। নিচের দিকে দেখলেই বুঝবেন ০ থেকে ৮০ বছর পর্যন্ত বয়স দেয়া আছে নিচের এক্সিসে।

ছবির মানে কী?

আপনারা ভালো করে লক্ষ্য করলে দেখবেন "০" মানে মারা গিয়েছেন ৩০ বছর বয়সের মানুষ বেশি। আবার বেঁচেছেন ২০ থেকে ৩৪ বছর বয়সের মানুষ। নিচের চারটা ছবি দেখলে তাই মনে হয়। ডাটার ঘনত্ব ৩০ থেকে ৩৪ বয়সের দিকে।
1
facet = sns.FacetGrid(train, hue="Survived",aspect=4)
2
facet.map(sns.kdeplot,'Age',shade= True)
3
facet.set(xlim=(0, train['Age'].max()))
4
facet.add_legend()
5
plt.xlim(0, 20)
Copied!
1
(0, 20)
Copied!
png
1
facet = sns.FacetGrid(train, hue="Survived",aspect=4)
2
facet.map(sns.kdeplot,'Age',shade= True)
3
facet.set(xlim=(0, train['Age'].max()))
4
facet.add_legend()
5
plt.xlim(20, 30)
Copied!
1
(20, 30)
Copied!
png
1
facet = sns.FacetGrid(train, hue="Survived",aspect=4)
2
facet.map(sns.kdeplot,'Age',shade= True)
3
facet.set(xlim=(0, train['Age'].max()))
4
facet.add_legend()
5
plt.xlim(30, 40)
Copied!
1
(30, 40)
Copied!
png
1
facet = sns.FacetGrid(train, hue="Survived",aspect=4)
2
facet.map(sns.kdeplot,'Age',shade= True)
3
facet.set(xlim=(0, train['Age'].max()))
4
facet.add_legend()
5
plt.xlim(40, 60)
Copied!
1
(40, 60)
Copied!
png
এখন দেখি ডাটা কি কথা বলে? Cabin এবং Embarked এখনো কিছু ফাঁকা! উপরের ছবি দেখে আমরা বেশ কিছু ধারণা পেয়েছি - বয়স ০, থেকে ২০, ৩০ না করে দেখা গেল তাদের ভ্যারিয়েশন কিছুটা ভিন্ন। সেজন্য আমরা নিয়ে এসেছি আলাদা আলাদা বাক্স পদ্ধতি। অনেকে এটাকে বলেন 'বিনিং' মানে ভিন্ন ভিন্ন 'বিন' মানে ব্যাগ বা বাক্সে ফেলা। আমাদের ক্লাসিফায়ার এটাকে অনেক পছন্দ করবে।
1
train.info()
Copied!
1
<class 'pandas.core.frame.DataFrame'>
2
RangeIndex: 891 entries, 0 to 890
3
Data columns (total 12 columns):
4
PassengerId 891 non-null int64
5
Survived 891 non-null int64
6
Pclass 891 non-null int64
7
Sex 891 non-null int64
8
Age 891 non-null float64
9
SibSp 891 non-null int64
10
Parch 891 non-null int64
11
Ticket 891 non-null object
12
Fare 891 non-null float64
13
Cabin 204 non-null object
14
Embarked 889 non-null object
15
Title 891 non-null int64
16
dtypes: float64(2), int64(7), object(3)
17
memory usage: 83.6+ KB
Copied!
1
test.info()
Copied!
1
<class 'pandas.core.frame.DataFrame'>
2
RangeIndex: 418 entries, 0 to 417
3
Data columns (total 11 columns):
4
PassengerId 418 non-null int64
5
Pclass 418 non-null int64
6
Sex 418 non-null int64