در قسمت دوم تا مرحله رابطه بین متغیر categorical و قیمت خانه پیش رفتیم. در این قسمت میخواهیم فیچرهای مطلوب را انتخاب کنیم.
در این آموزش موارد زیر ارائه میشود:
- Missing values
- Temporal variables
- Categorical variables: remove rare labels
- Standarise the values of the variables to the same range
موارد اولیه:
ابتدا کتابخانه های مورد نیاز را فراخوانی میکنیم:
# موارد اولیه
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
## Display all the columns of the dataframe
pd.pandas.set_option('display.max_columns',None)
خواندن داده:
dataset=pd.read_csv('house_advance_train.csv')
print(dataset.shape)
داده را به دو دسته train وtest تقسیم میکنیم: چرا؟
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(dataset,dataset['SalePrice'],test_size=0.1,random_state=0)
نسب این تقسیم بندی را با دستور shape مشاهده میکنیم:
((1314, 81), (146, 81))
Missing Values
با دستور زیر فیچرهایی را انتخاب میکنیم که تعداد داده های nul آنها بیشتر از یک و همچنین نوع داده آنها از نوع Obj باشد. و همچنین مقدار درصد این داده ها را حساب میکنیم. (در نتیجه میبینیم که درصد همه از یک کمتر است)
## Let us capture all the nan values
## First lets handle Categorical features which are missing
features_nan=[feature for feature in dataset.columns if dataset[feature].isnull().sum()>1 and dataset[feature].dtypes=='O']
for feature in features_nan:
print("{}: {}% missing values".format(feature,np.round(dataset[feature].isnull().mean(),4)))
با دستور زیر داده هایی که مقدار null دارند را با مقدار رشته ای Missing جایگذاری میکنیم:
## Replace missing value with a new label
def replace_cat_feature(dataset,features_nan):
data=dataset.copy()
data[features_nan]=data[features_nan].fillna('Missing')
return data
با دستور زیر متغیرهای عددی را که مقدار missing دارند را جدا میکنیم و در یک متغیر به نام numerical_with_nan میریزیم:
## Now lets check for numerical variables the contains missing values
numerical_with_nan=[feature for feature in dataset.columns if dataset[feature].isnull().sum()>1
and dataset[feature].dtypes!='O']
## We will print the numerical nan variables and percentage of missing values
for feature in numerical_with_nan:
print("{}: {}% missing value".format(feature,np.around(dataset[feature].isnull().mean(),4)))
با دستور زیر مقادیر miss شده در متغیر عددی را با مقدار median هر فیچر جایگذاری میکنیم:
## Replacing the numerical Missing Values
for feature in numerical_with_nan:
## We will replace by using median since there are outliers
median_value=dataset[feature].median()
## create a new feature to capture nan values
dataset[feature+'nan']=np.where(dataset[feature].isnull(),1,0)
dataset[feature].fillna(median_value,inplace=True)
dataset[numerical_with_nan].isnull().sum()
متغیر سال(temporial)
با دستور زیر3 مورد از 4 متغیر مربوط به سال را اندکی تغییر میدهیم:
## Temporal Variables (Date Time Variables)
for feature in ['YearBuilt','YearRemodAdd','GarageYrBlt']:
dataset[feature]=dataset['YrSold']-dataset[feature]
Numerical Variables
به دلیل اینکه متغیرهای عددی دارای انحراف هستند از لگاریتم برای نرمال سازی آن استفاده میکنیم:
import numpy as np
num_features=['LotFrontage', 'LotArea', '1stFlrSF', 'GrLivArea', 'SalePrice']
for feature in num_features:
dataset[feature]=np.log(dataset[feature])
متغیرهای Rare در categorical
متغیرهای categorical که در کمتر از 1 درصد از مشاهدات رویت شده اند را با مقدار Rare-var جایگذاری میکنیم. این برچسب معنادار می باشد زیرا به معنایrare یعنی به ندرت مشاهده شده است:
for feature in categorical_features:
temp=dataset.groupby(feature)['SalePrice'].count()/len(dataset)
temp_df=temp[temp>0.01].index
dataset[feature]=np.where(dataset[feature].isin(temp_df),dataset[feature],'Rare_var')
در کد نوشته شده دستورات زیر نیر وارد شده اند که اندکی جای توضیح بیشتر دارد(؟؟؟)
for feature in categorical_features:
labels_ordered=dataset.groupby([feature])['SalePrice'].mean().sort_values().index
labels_ordered={k:i for i,k in enumerate(labels_ordered,0)}
dataset[feature]=dataset[feature].map(labels_ordered)
ادامه در قسمت چهارم – feature scaling