قیمت خانه – قسمت سوم- feature engineering

در قسمت دوم تا مرحله رابطه بین متغیر 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

منابع:

1- گیت هاب

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.