تنسورفلو ۷ : بررسی داده ها

در این قسمت قراره درباره آماده سازی دیتا صحبت کنیم در قسمت قبلی از دیتاست بوستون استفاده کردیم که قیمت یک خانه رو تخمین بزنیم. یک مدل الگوی داده ها رو تعمیم میده. برای استفاده کردن از این الگو ابتدا باید پیداش کنیم بهترین کار اینه که قبل از اجرا الگوریتم یک تحلیل داده انجام بدیم.انتخاب ویژگی های درست در موفقیت مدل موثر هست راه دیگه برای بهبود مدل یافتن همبستگی بین متغیر های مستقل هست. مثلا تخمین درآمد افراد به متغیر های میزان تحصیلات و وضع اشتغال وابسته هست، در حالی که وضع اشتغال به میزان تحصیلات هم میتونه وابسته باشه. این وابستگی رو تحت عنوان 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 به شما اجازه می ده ببینید کجا اطلاعات به شیوه ای که شما فکر می کنید نیست.Facets Overviewیک بررسی اجمالی از مجموعه داده رو انجام میده. به این صورت که اطلاعات زیر هر ستون رو نمایش میده:درصد اطلاعات گم شدهکمینه و بیشینهآمار هایی از قبیل میانه، میانگین، انحراف معیارتعداد اطلاعات صفرمشاهده نحوه توزیع اطلاعات در داده های آموزش و ارزیابیFacets Deep Diveاین ابزار کمک می کنه وضوح بیشتری بر روی اطلاعات دیتاست داشته باشید. همچنین می تونید برای هر ستون و سطر ویژگی های دیتاست رو مشاهده کنید.نصب Facetابتدا خط زیر رو وارد ترمینال کنیدpip install jupyter_contrib_nbextensionsسپس پروژه رو کلون کنیدgit clone https://github.com/PAIR-code/facetsسپس نصبش کنیدjupyter nbextension install facets-dist/Overviewimport sys sys.path.append('~/facets/facets_overview/python') from generic_feature_statistics_generator import GenericFeatureStatisticsGeneratorimport 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, HTMLHTML_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))Graphپس از بررسی داده ها و توزیعشون می تونید یک ماتریس کوواریانست رسم کنید که ضریب پیئرسون رو حساب می کنه.این ضریب یک عدد بین -۱ و ۱ هست که مثبت بودن به معنی همبستگی مثبت هست و بالعکس.این کار برای پیدا کردن وابستگی بین متغیر ها هست.%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) خروجیاز قسمت سبز متوجه میشیم که :قیمت با INDUS NOX LSTAT همبستگی منفی داره و با RM همبستگی مثبت. قیمت و LSTAT ارتباط خطی ندارند.وقتی قیمت ۵۰ هست یک خط صاف مشاهده میشه که طبق توضیحات دیتاست قیمت truncate شده هست.قطر نمودار:به نظر می رسد NOX دو خوشه داره یکی حدود ۰.۵ یکی حدود ۰.۸۵از قسمت پایین هم تراکم برداشت میشه. برای مثال وقتی منطقه صنعتی تر میشه غلظت اکسید نیتریک بیشتر از ۰.۶ میشهبرای بررسی اینکه دو متغیر مرتبط چه ارتباطی با قیمت دارند نیاز به نمودار سه بعدی هست و بخاطر محدودیت نیاز به راه حل دیگه ای هست مثلا:## 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") Facets Deep Diveبرای اینکه ارتباط چند متغیر با هم و قیمت رو مشاهده کنید می تونید از این امکان استفاده کنید ولی بخاطر کوتاهی و اختصار از این بخش گذر می کنم...