در این قسمت قراره درباره آماده سازی دیتا صحبت کنیم
در قسمت قبلی از دیتاست بوستون استفاده کردیم که قیمت یک خانه رو تخمین بزنیم.
یک مدل الگوی داده ها رو تعمیم میده. برای استفاده کردن از این الگو ابتدا باید پیداش کنیم بهترین کار اینه که قبل از اجرا الگوریتم یک تحلیل داده انجام بدیم.
انتخاب ویژگی های درست در موفقیت مدل موثر هست
راه دیگه برای بهبود مدل یافتن همبستگی بین متغیر های مستقل هست. مثلا تخمین درآمد افراد به متغیر های میزان تحصیلات و وضع اشتغال وابسته هست، در حالی که وضع اشتغال به میزان تحصیلات هم میتونه وابسته باشه. این وابستگی رو تحت عنوان interaction یا اثر متقابل می شناسیم
در این قسمت قراره بررسی کنیم که با استفاده از اثر متقابل متغییرها میشه تخمین رو بهتر کرد یا نه
چند قدم وجود داره که می تونید قبل از تعلیم مدل انجام بدید. همونطور که قبلا گفته شد هر مدل تعمیمی بر روی دیتا ها هست. پس بهترین کار برای تخمین بهینه فهمیندن دیتاهاست. اگه دیتا ها رو نشناسید شما شانس کمی برای بهبود مدل دارید.
ابتدا به وسیله pandas دیتاست برای مجموعه های آموزش و ارزیابی وارد کنید.
به لایبرری های matplotlib و seaborn نیاز داریم.
! pip install seaborn
برای رسم گراف: Matplotlib
برای تجسم آماری: Seaborn
وارد سازی کتابخانه های لازم:
import pandas as pd from sklearn import datasets import tensorflow as tf from sklearn.datasets import load_boston import numpy as np
کتابخانه sklearn دیتاست بوستون رو داره و می تونید از طریق زیر بهش دسترسی داشته باشید:
boston = load_boston() df = pd.DataFrame(boston.data)
برای مشاهده نام ویژگی ها:
boston.feature_names
برای تغییر نام ویژگی ها:
df.columns = boston.feature_names df['PRICE'] = boston.target df.head(2)
شما می تونید متغیر CHAS به متن تبدیل کنید وقتی که ۱ هست yes و وقتی که ۰ هست no :
df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'}) df['CHAS'].head(2)
و برای تقسیم دیتاست به مجموعه های آموزش و ارزیابی به این صورت که ۸۰٪ در مجموعه آموزش و مابقی در مجموعه تعلیم باشند:
df_train=df.sample(frac=0.8,random_state=200) df_test=df.drop(df_train.index) print(df_train.shape, df_test.shape)
df_test.head(5)
خب در اصل دیتا تمیز نیست و برای تمیز کردن باید اول بفهمیم چی نیاز به تمیز کردن داره. این کار یک مقدار نیاز به مهارت داره مخصوصا برای اینکه قابل تعمیم باشه.
محققین گوگل یک ابزاری توسعه دادن به اسم Facets که کمک می کنه داده ها رو مجسم کنید و به ترتیب های مختلف تقسیم بندی کنید. این نقطه خوبی برای شروع بررسی داده هاست.Facets به شما اجازه می ده ببینید کجا اطلاعات به شیوه ای که شما فکر می کنید نیست.
یک بررسی اجمالی از مجموعه داده رو انجام میده. به این صورت که اطلاعات زیر هر ستون رو نمایش میده:
این ابزار کمک می کنه وضوح بیشتری بر روی اطلاعات دیتاست داشته باشید. همچنین می تونید برای هر ستون و سطر ویژگی های دیتاست رو مشاهده کنید.
ابتدا خط زیر رو وارد ترمینال کنید
pip install jupyter_contrib_nbextensions
سپس پروژه رو کلون کنید
git clone https://github.com/PAIR-code/facets
سپس نصبش کنید
jupyter nbextension install facets-dist/
import sys sys.path.append('~/facets/facets_overview/python') from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator
import base64 gfsg = GenericFeatureStatisticsGenerator() proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}, {'name': 'test', 'table': df_test}]) protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")
from IPython.core.display import display, HTML
HTML_TEMPLATE = """<link rel="import" href="/nbextensions/facets-dist/facets-jupyter.html" >
<facets-overview id="elem"></facets-overview>
document.querySelector("#elem").protoInput = "{protostr}";
"""
html = HTML_TEMPLATE.format(protostr=protostr)
display(HTML(html))
پس از بررسی داده ها و توزیعشون می تونید یک ماتریس کوواریانست رسم کنید که ضریب پیئرسون رو حساب می کنه.این ضریب یک عدد بین -۱ و ۱ هست که مثبت بودن به معنی همبستگی مثبت هست و بالعکس.
این کار برای پیدا کردن وابستگی بین متغیر ها هست.
%matplotlib inline import matplotlib.pyplot as plt import seaborn as sns sns.set(style="ticks") # Compute the correlation matrix corr = df.corr('pearson') # Generate a mask for the upper triangle mask = np.zeros_like(corr, dtype=np.bool) mask[np.triu_indices_from(mask)] = True # Set up the matplotlib figure f, ax = plt.subplots(figsize=(11, 9)) # Generate a custom diverging colormap cmap = sns.diverging_palette(220, 10, as_cmap=True) # Draw the heatmap with the mask and correct aspect ratio sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True, square=True, linewidths=.5, cbar_kws={"shrink": .5})
از ماتریس مشاهده میشه که متغیر های LSTAT و RM بیشترین همبستگی را با قیمت دارند یا مثلا NOX و INDUS همبستگی مثبت قویی با همدیگه دارند برای همین مثلا مناسب هستند برای متغیر های وابسته
یک نوع دیگه هم Pair grid هست .
attributes = ["PRICE", "INDUS", "NOX", "RM", "LSTAT"] g = sns.PairGrid(df[attributes]) g = g.map_upper(sns.regplot, color="g") g = g.map_lower(sns.kdeplot,cmap="Reds", shade=True, shade_lowest=False) g = g.map_diag(sns.kdeplot)
خروجی
از قسمت سبز متوجه میشیم که :
قطر نمودار:
از قسمت پایین هم تراکم برداشت میشه. برای مثال وقتی منطقه صنعتی تر میشه غلظت اکسید نیتریک بیشتر از ۰.۶ میشه
برای بررسی اینکه دو متغیر مرتبط چه ارتباطی با قیمت دارند نیاز به نمودار سه بعدی هست و بخاطر محدودیت نیاز به راه حل دیگه ای هست مثلا:
## Check non linearity with important features df['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"]) ## Show non linearity between RM and LSTAT ax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")
برای اینکه ارتباط چند متغیر با هم و قیمت رو مشاهده کنید می تونید از این امکان استفاده کنید ولی بخاطر کوتاهی و اختصار از این بخش گذر می کنم...