การถดถอยเชิงเส้น TensorFlow พร้อมแง่มุมและเงื่อนไขการโต้ตอบ

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีตรวจสอบข้อมูลและเตรียมข้อมูลเพื่อสร้างงานการถดถอยเชิงเส้นอย่างง่าย

บทช่วยสอนนี้แบ่งออกเป็นสองส่วน:

  • มองหาปฏิสัมพันธ์
  • ทดสอบโมเดล

ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร กวดวิชาก่อนหน้านี้คุณใช้ชุดข้อมูลของบอสตันเพื่อประมาณราคาเฉลี่ยของบ้าน ชุดข้อมูลของบอสตันมีขนาดเล็ก โดยมีการสังเกตเพียง 506 รายการ ชุดข้อมูลนี้ถือเป็นเกณฑ์มาตรฐานในการทดลองใช้อัลกอริทึมการถดถอยเชิงเส้นแบบใหม่

ชุดข้อมูลประกอบด้วย:

ตัวแปร Descriptไอออน
zn สัดส่วนที่ดินที่อยู่อาศัยแบ่งเขตพื้นที่เกิน 25,000 ตร.ฟุต
สินธุ สัดส่วนเอเคอร์ธุรกิจที่ไม่ใช่การค้าปลีกต่อเมือง
NOx ความเข้มข้นของไนตริกออกไซด์
rm จำนวนห้องเฉลี่ยต่อที่อยู่อาศัย
อายุ สัดส่วนของยูนิตที่มีเจ้าของสร้างขึ้นก่อนปี พ.ศ. 1940
นี้ ระยะทางถ่วงน้ำหนักไปยังศูนย์จัดหางานบอสตันห้าแห่ง
ภาษี อัตราภาษีทรัพย์สินมูลค่าเต็มต่อ 10,000 ดอลลาร์
พทราติโอ อัตราส่วนนักเรียนต่อครูตามเมือง
เมดวี ค่ามัธยฐานของบ้านที่มีเจ้าของเป็นพันดอลลาร์
คริม อัตราอาชญากรรมต่อหัวแยกตามเมือง
Chas ตัวแปรเสมือนของแม่น้ำชาร์ลส์ (1 ถ้าขอบเขตของแม่น้ำ 0 ในกรณีอื่น)
B สัดส่วนของคนผิวดำตามเมือง

ในบทช่วยสอนนี้ เราจะประมาณราคาเฉลี่ยโดยใช้ตัวถดถอยเชิงเส้น แต่จุดสนใจอยู่ที่กระบวนการใดกระบวนการหนึ่งโดยเฉพาะ เรียนรู้เครื่อง: “การเตรียมข้อมูล”

แบบจำลองสรุปรูปแบบในข้อมูล หากต้องการจับภาพรูปแบบดังกล่าว คุณต้องค้นหารูปแบบดังกล่าวก่อน แนวทางปฏิบัติที่ดีคือการวิเคราะห์ข้อมูลก่อนใช้งานอัลกอริทึมการเรียนรู้ของเครื่อง

การเลือกคุณสมบัติที่เหมาะสมจะสร้างความแตกต่างให้กับความสำเร็จของโมเดลของคุณ ลองนึกภาพคุณพยายามประมาณการค่าจ้างของบุคคล หากคุณไม่รวมเพศเป็นตัวแปรร่วม คุณจะจบลงด้วยการประมาณการที่ไม่ดี

อีกวิธีในการปรับปรุงแบบจำลองคือการดูความสัมพันธ์ระหว่างตัวแปรอิสระ กลับมาที่ตัวอย่าง คุณอาจคิดว่าการศึกษาเป็นผู้สมัครที่ยอดเยี่ยมในการทำนายค่าจ้างและอาชีพด้วย พูดได้อย่างยุติธรรมว่าอาชีพนั้นขึ้นอยู่กับระดับการศึกษา กล่าวคือ การศึกษาระดับอุดมศึกษามักจะนำไปสู่อาชีพที่ดีขึ้น หากเราสรุปแนวคิดนี้ เราสามารถพูดได้ว่าความสัมพันธ์ระหว่างตัวแปรตามและตัวแปรอธิบายสามารถขยายไปยังตัวแปรอธิบายอีกตัวแปรหนึ่งได้

เพื่อจับผลกระทบที่จำกัดของการศึกษาต่ออาชีพ เราสามารถใช้คำโต้ตอบได้

ระยะเวลาการโต้ตอบ

หากดูสมการค่าจ้างจะกลายเป็น:

ระยะเวลาการโต้ตอบ

If ระยะเวลาการโต้ตอบ เป็นบวก แสดงว่าระดับการศึกษาเพิ่มเติมส่งผลให้มูลค่ามัธยฐานของบ้านเพิ่มขึ้นสูงขึ้นสำหรับระดับอาชีพที่สูง กล่าวอีกนัยหนึ่งคือมีผลกระทบปฏิสัมพันธ์ระหว่างการศึกษาและอาชีพ

ในบทช่วยสอนนี้ เราจะพยายามดูว่าตัวแปรใดที่เป็นตัวเลือกที่ดีสำหรับเงื่อนไขการโต้ตอบ เราจะทดสอบว่าการเพิ่มข้อมูลประเภทนี้จะทำให้การคาดการณ์ราคาดีขึ้นหรือไม่

สถิติโดยย่อ

มีขั้นตอนเล็กๆ น้อยๆ ที่คุณสามารถปฏิบัติตามได้ก่อนที่จะดำเนินการกับโมเดลต่อไป ดังที่กล่าวไว้ข้างต้น แบบจำลองนี้เป็นลักษณะทั่วไปของข้อมูล แนวทางปฏิบัติที่ดีที่สุดคือการทำความเข้าใจข้อมูลและคาดการณ์ หากคุณไม่ทราบข้อมูลของคุณ คุณมีโอกาสเพียงเล็กน้อยในการปรับปรุงแบบจำลองของคุณ

ในขั้นตอนแรก ให้โหลดข้อมูลเป็น dataframe ของ pandas และสร้างชุดการฝึกและชุดการทดสอบ

เคล็ดลับ: สำหรับบทช่วยสอนนี้ คุณจะต้องติดตั้ง matplotlit และ seaborn ไว้ Python. คุณสามารถติดตั้ง Python แพ็คเกจได้ทันทีด้วย Jupyter. คุณ ไม่ควร ทำเช่นนี้

!conda install -- yes matplotlib

แต่

import sys
!{sys.executable} -m pip install matplotlib # Already installed
!{sys.executable} -m pip install seaborn 

โปรดทราบว่าขั้นตอนนี้ไม่จำเป็นหากคุณติดตั้ง matplotlib และ seaborn

Matplotlib เป็นไลบรารีสำหรับสร้างกราฟ Python- Seaborn เป็นไลบรารีการแสดงภาพเชิงสถิติที่สร้างขึ้นบน Matplotlib ให้แปลงที่น่าดึงดูดและสวยงาม

รหัสด้านล่างนำเข้าไลบรารีที่จำเป็น

import pandas as pd
from sklearn import datasets
import tensorflow as tf
from sklearn.datasets import load_boston
import numpy as np

sklearn ของห้องสมุดประกอบด้วยชุดข้อมูลของบอสตัน คุณสามารถเรียก API เพื่อนำเข้าข้อมูลได้

boston = load_boston()
df = pd.DataFrame(boston.data)

ชื่อของคุณสมบัติจะถูกเก็บไว้ในวัตถุ Feature_names ในอาร์เรย์

boston.feature_names

เอาท์พุต

array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')

คุณสามารถเปลี่ยนชื่อคอลัมน์ได้

df.columns = boston.feature_names
df['PRICE'] = boston.target
df.head(2)

การถดถอยเชิงเส้นพร้อมแง่มุมและระยะการโต้ตอบ

คุณแปลงตัวแปร CHAS เป็นตัวแปรสตริงและติดป้ายกำกับด้วยใช่ถ้า CHAS = 1 และไม่ใช่ถ้า CHAS = 0

df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})
df['CHAS'].head(5)
0    no
1    no
2    no
3    no
4    no
Name: CHAS, dtype: object

สำหรับแพนด้า การแยกชุดข้อมูลเป็นเรื่องง่าย คุณสุ่มแบ่งชุดข้อมูลด้วยชุดการฝึก 80 เปอร์เซ็นต์และชุดการทดสอบ 20 เปอร์เซ็นต์ นุ่น มีฟังก์ชันต้นทุนในตัวเพื่อแยกตัวอย่างเฟรมข้อมูล

frac พารามิเตอร์แรกคือค่าตั้งแต่ 0 ถึง 1 คุณตั้งค่าเป็น 0.8 เพื่อเลือกเฟรมข้อมูลแบบสุ่ม 80 เปอร์เซ็นต์

Random_state อนุญาตให้ส่งคืน dataframe เดียวกันสำหรับทุกคน

### Create train/test set
df_train=df.sample(frac=0.8,random_state=200)
df_test=df.drop(df_train.index)

คุณสามารถรับรูปร่างของข้อมูลได้ มันควรจะเป็น:

  • ชุดรถไฟ: 506*0.8 = 405
  • ชุดทดสอบ: 506*0.2 = 101
print(df_train.shape, df_test.shape)

เอาท์พุต

(405, 14) (101, 14)
df_test.head(5)

เอาท์พุต

คริม ZN อุตสาหกรรม ชส NOX RM อายุ DIS RAD ภาษีที่เก็บได้ ปราติโอ B LSTAT ค่าสมัครเรียน
0 0.00632 18.0 2.31 ไม่ 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 ไม่ 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14 21.6
3 0.03237 0.0 2.18 ไม่ 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94 33.4
6 0.08829 12.5 7.87 ไม่ 0.524 6.012 66.6 5.5605 5.0 311.0 15.2 395.60 12.43 22.9
7 0.14455 12.5 7.87 ไม่ 0.524 6.172 96.1 5.9505 5.0 311.0 15.2 396.90 19.15 27.1

ข้อมูลยุ่งเหยิง มักจะไม่สมดุลและโรยด้วยค่าผิดปกติซึ่งทำให้การวิเคราะห์และการฝึกอบรมการเรียนรู้ของเครื่องไม่มีประสิทธิภาพ

ขั้นตอนแรกในการล้างชุดข้อมูลคือการทำความเข้าใจว่าจำเป็นต้องทำความสะอาดจุดใด การล้างชุดข้อมูลอาจทำได้ยาก โดยเฉพาะอย่างยิ่งในลักษณะทั่วไป

ทีมวิจัยของ Google ได้พัฒนาเครื่องมือสำหรับงานนี้ชื่อว่า แง่มุม ที่ช่วยแสดงภาพข้อมูลและแบ่งส่วนข้อมูลในลักษณะต่างๆ นี่เป็นจุดเริ่มต้นที่ดีในการทำความเข้าใจวิธีจัดวางชุดข้อมูล

แง่มุมช่วยให้คุณค้นหาได้ว่าข้อมูลในส่วนใดไม่เป็นไปตามที่คุณคิด

ยกเว้นแอปพลิเคชันเว็บ Google ทำให้การฝังชุดเครื่องมือลงใน a เป็นเรื่องง่าย Jupyter สมุดบันทึก.

Facets มีสองส่วน:

  • ภาพรวมของแง่มุม
  • เจาะลึกแง่มุมต่างๆ

ภาพรวมของแง่มุม

ภาพรวมของ Facets จะให้ภาพรวมของชุดข้อมูล ภาพรวมของ Facets จะแบ่งคอลัมน์ของข้อมูลออกเป็นแถวของข้อมูลที่สำคัญซึ่งแสดง

  1. เปอร์เซ็นต์ของการสังเกตที่ขาดหายไป
  2. ค่าต่ำสุดและสูงสุด
  3. สถิติต่างๆ เช่น ค่าเฉลี่ย ค่ามัธยฐาน และส่วนเบี่ยงเบนมาตรฐาน
  4. นอกจากนี้ยังเพิ่มคอลัมน์ที่แสดงเปอร์เซ็นต์ของค่าที่เป็นศูนย์ ซึ่งจะมีประโยชน์เมื่อค่าส่วนใหญ่เป็นศูนย์
  5. คุณสามารถดูการแจกแจงเหล่านี้ได้บนชุดข้อมูลทดสอบ รวมถึงชุดฝึกอบรมสำหรับแต่ละฟีเจอร์ ซึ่งหมายความว่าคุณสามารถตรวจสอบซ้ำอีกครั้งว่าการทดสอบมีการแจกแจงที่คล้ายคลึงกันกับข้อมูลฝึกอบรมหรือไม่

นี่เป็นขั้นต่ำที่ต้องทำก่อนงานแมชชีนเลิร์นนิงใดๆ ด้วยเครื่องมือนี้ คุณจะไม่พลาดขั้นตอนสำคัญนี้ และจะเน้นย้ำถึงความผิดปกติบางอย่าง

เจาะลึกแง่มุมต่างๆ

Facets Deep Dive เป็นเครื่องมือเจ๋งๆ ที่ช่วยให้คุณมองเห็นข้อมูลชุดต่างๆ ได้ชัดเจนขึ้น และซูมเข้าไปจนสุดเพื่อดูข้อมูลแต่ละชิ้นได้ หมายความว่าคุณสามารถแบ่งข้อมูลออกเป็นแถวและคอลัมน์ตามฟีเจอร์ใดๆ ของชุดข้อมูลได้

เราจะใช้เครื่องมือทั้งสองนี้กับชุดข้อมูลบอสตัน

หมายเหตุ: คุณไม่สามารถใช้ภาพรวม Facets และการเจาะลึก Facets พร้อมกันได้ คุณต้องล้างสมุดบันทึกก่อนจึงจะเปลี่ยนเครื่องมือได้

ติดตั้ง Facet

คุณสามารถใช้เว็บแอป Facet เพื่อการวิเคราะห์ส่วนใหญ่ได้ ในบทช่วยสอนนี้ คุณจะเห็นวิธีใช้งานภายในก Jupyter สมุดบันทึก.

ก่อนอื่นคุณต้องติดตั้ง nbextensions ก่อน ซึ่งทำได้ด้วยโค้ดนี้ เพียงคัดลอกและวางโค้ดต่อไปนี้ลงในเทอร์มินัลของเครื่องของคุณ

pip install jupyter_contrib_nbextensions

หลังจากนั้นคุณจะต้องโคลนที่เก็บข้อมูลในคอมพิวเตอร์ของคุณ คุณมีสองทางเลือก:

ตัวเลือกที่ 1) คัดลอกและวางรหัสนี้ในเทอร์มินัล (แนะนำ)

หากคุณไม่ได้ติดตั้ง Git บนเครื่องของคุณ โปรดไปที่ URL นี้ https://git-scm.com/download/win และปฏิบัติตามคำแนะนำ เมื่อเสร็จแล้ว คุณสามารถใช้คำสั่ง git ในเทอร์มินัลสำหรับผู้ใช้ Mac หรือพร้อมท์ให้ Anaconda ได้ Windows ผู้ใช้งาน

git clone https://github.com/PAIR-code/facets

ตัวเลือกที่ 2) ไปที่ https://github.com/PAIR-code/facets และดาวน์โหลดที่เก็บข้อมูล

ติดตั้ง Facet

หากคุณเลือกตัวเลือกแรก ไฟล์จะจบลงที่ไฟล์ดาวน์โหลดของคุณ คุณสามารถปล่อยให้ไฟล์ดาวน์โหลดหรือลากไปยังเส้นทางอื่นได้

คุณสามารถตรวจสอบตำแหน่งที่เก็บ Facets ได้ด้วยบรรทัดคำสั่งนี้:

echo `pwd`/`ls facets`

เมื่อคุณพบ Facets แล้ว คุณจะต้องติดตั้งมันเข้าไป Jupyter สมุดบันทึก. คุณต้องตั้งค่าไดเร็กทอรีการทำงานให้เป็นเส้นทางที่มี facets อยู่

ไดเร็กทอรีการทำงานปัจจุบันและตำแหน่งของ Facets zip ควรเหมือนกัน

ติดตั้ง Facet

คุณต้องชี้ไดเร็กทอรีการทำงานไปที่ Facet:

cd facets

หากต้องการติดตั้ง Facets ใน Jupyterคุณมีสองทางเลือก หากคุณติดตั้ง Jupyter ด้วย Conda สำหรับผู้ใช้ทุกคน ให้คัดลอกโค้ดนี้:

สามารถใช้ jupyter nbextension ติดตั้ง facets-dist/ ได้

jupyter nbextension install facets-dist/

มิฉะนั้นให้ใช้:

jupyter nbextension install facets-dist/ --user

เอาล่ะ คุณพร้อมแล้ว มาเปิดภาพรวม Facet กันดีกว่า

ภาพรวมสินค้า

ภาพรวมใช้ Python สคริปต์สำหรับคำนวณสถิติ คุณต้องนำเข้าสคริปต์ที่ชื่อ generic_feature_statistics_generator เข้ามา Jupyter- ไม่ต้องกังวล; สคริปต์อยู่ในไฟล์ facets

คุณต้องค้นหาเส้นทางของมัน มันทำได้ง่าย คุณเปิด facets เปิดไฟล์ facets_overview จากนั้นเปิด python คัดลอกเส้นทาง

ภาพรวมด้าน

หลังจากนั้นให้กลับไปที่ Jupyterแล้วเขียนโค้ดต่อไปนี้ เปลี่ยนเส้นทาง '/Users/Thomas/facets/facets_overview/python' เป็นเส้นทางของคุณ

# Add the facets overview python code to the python path# Add t 
import sys
sys.path.append('/Users/Thomas/facets/facets_overview/python')

คุณสามารถนำเข้าสคริปต์ด้วยรหัสด้านล่าง

from generic_feature_statistics_generator import 
GenericFeatureStatisticsGenerator

ใน Windows รหัสเดียวกันจะกลายเป็น

import sys
sys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")

from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator

ในการคำนวณสถิติฟีเจอร์ คุณต้องใช้ฟังก์ชัน GenericFeatureStatisticsGenerator() และคุณใช้วัตถุ ProtoFromDataFrames คุณสามารถส่งผ่านกรอบข้อมูลในพจนานุกรมได้ เช่น ถ้าเราต้องการสร้างสถิติสรุปสำหรับชุดรถไฟ เราสามารถเก็บข้อมูลไว้ในพจนานุกรมและนำไปใช้ในอ็อบเจ็กต์ `ProtoFromDataFrames“

  • 'name': 'train', 'table': df_train

ชื่อ คือชื่อของตารางที่แสดง และคุณใช้ชื่อของตารางที่คุณต้องการคำนวณสรุป ในตัวอย่างของคุณ ตารางที่มีข้อมูลคือ df_train

# Calculate the feature statistics proto from the datasets and stringify it for use in facets overview
import base64

gfsg = GenericFeatureStatisticsGenerator()

proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train},
                                  {'name': 'test', 'table': df_test}])

#proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}])
protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")

สุดท้าย คุณเพียงแค่คัดลอกและวางโค้ดด้านล่างนี้ รหัสมาจาก GitHub โดยตรง คุณควรจะเห็นสิ่งนี้:

ภาพรวมด้าน

# Display the facets overview visualization for this data# Displ 
from IPython.core.display import display, HTML

HTML_TEMPLATE = """<link rel="import" href="/th/nbextensions/facets-dist/facets-jupyter.html" >
        <facets-overview id="elem"></facets-overview>
        <script>
          document.querySelector("#elem").protoInput = "{protostr}";
        </script>"""
html = HTML_TEMPLATE.format(protostr=protostr)
display(HTML(html))

กราฟ

หลังจากที่คุณตรวจสอบข้อมูลและการแจกแจงแล้ว คุณสามารถพล็อตเมทริกซ์สหสัมพันธ์ได้ เมทริกซ์สหสัมพันธ์จะคำนวณค่าสัมประสิทธิ์เพียร์สัน ค่าสัมประสิทธิ์นี้มีพันธะระหว่าง -1 ถึง 1 โดยค่าบวกบ่งชี้ว่ามีความสัมพันธ์เชิงบวก และค่าลบคือความสัมพันธ์เชิงลบ

คุณสนใจที่จะดูว่าตัวแปรใดที่เป็นตัวเลือกที่ดีสำหรับเงื่อนไขการโต้ตอบ

## Choose important feature and further check with Dive
%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})

เอาท์พุต

<matplotlib.axes._subplots.AxesSubplot at 0x1a184d6518>

PNG

กราฟด้าน

จากเมทริกซ์ คุณจะเห็นได้ว่า:

  • LSTAT
  • RM

มีความสัมพันธ์อย่างมากกับราคา คุณลักษณะที่น่าสนใจอีกประการหนึ่งคือความสัมพันธ์เชิงบวกที่แข็งแกร่งระหว่าง NOX และ INDUS ซึ่งหมายความว่าตัวแปรทั้งสองนี้เคลื่อนไปในทิศทางเดียวกัน นอกจากนี้ ยังมีความสัมพันธ์อย่างมากกับราคา DIS ยังมีความสัมพันธ์อย่างมากกับ IND และ NOX

คุณมีคำแนะนำเบื้องต้นว่า IND และ NOX สามารถเป็นตัวเลือกที่ดีสำหรับคำสกัดกั้น และ DIS ก็อาจน่าสนใจที่จะมุ่งเน้นเช่นกัน

คุณสามารถเจาะลึกลงไปได้อีกเล็กน้อยโดยการวางแผนตารางคู่ โดยจะแสดงรายละเอียดเพิ่มเติมเกี่ยวกับแผนที่ความสัมพันธ์ที่คุณวางแผนไว้ก่อนหน้านี้

ตารางคู่ที่เราประกอบด้วยมีดังนี้:

  • ส่วนบน: พล็อตกระจายพร้อมเส้นพอดี
  • เส้นทแยงมุม: พล็อตความหนาแน่นของเคอร์เนล
  • ส่วนล่าง: พล็อตความหนาแน่นของเคอร์เนลหลายตัวแปร

คุณเลือกโฟกัสที่ตัวแปรอิสระสี่ตัว การเลือกนี้สอดคล้องกับตัวแปรที่มีความสัมพันธ์อย่างมากกับราคา

  • อุตสาหกรรม
  • NOX
  • RM
  • LSTAT

ยิ่งไปกว่านั้นราคา

หมายเหตุ ว่ามีการเพิ่มข้อผิดพลาดมาตรฐานลงในแผนภูมิกระจายตามค่าเริ่มต้น

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 และ PRICE
  • มีลักษณะเป็นเส้นตรงเมื่อราคาเท่ากับ 50 จากคำอธิบายชุดข้อมูล PRICE ถูกตัดทอนเหลือค่า 50

เส้นทแยงมุม

  • NOX ดูเหมือนจะมีสองคลัสเตอร์ คลัสเตอร์หนึ่งอยู่ที่ประมาณ 0.5 และอีกคลัสเตอร์หนึ่งอยู่ที่ประมาณ 0.85

หากต้องการตรวจสอบเพิ่มเติม คุณสามารถดูได้ที่ส่วนล่าง Multivariate Kernel Density นั้นน่าสนใจในแง่ที่ว่ามันระบายสีที่จุดส่วนใหญ่ ความแตกต่างกับกราฟแบบกระจายจะวาดความหนาแน่นของความน่าจะเป็น แม้ว่าจะไม่มีจุดใดในชุดข้อมูลสำหรับพิกัดที่กำหนดก็ตาม เมื่อสีเข้มขึ้น แสดงว่าจุดต่างๆ ในบริเวณนี้เข้มข้นขึ้น

หากคุณตรวจสอบความหนาแน่นแบบหลายตัวแปรสำหรับ INDUS และ NOX คุณจะเห็นความสัมพันธ์เชิงบวกและคลัสเตอร์ทั้งสอง เมื่อส่วนแบ่งของอุตสาหกรรมอยู่เหนือ 18 ความเข้มข้นของไนตริกออกไซด์จะอยู่เหนือ 0.6

คุณสามารถคิดถึงการเพิ่มปฏิสัมพันธ์ระหว่าง INDUS และ NOX ในความสัมพันธ์เชิงเส้นได้

ในที่สุด คุณสามารถใช้เครื่องมือที่สองที่สร้างโดย Google ได้ Facets Deep Dive อินเทอร์เฟซแบ่งออกเป็น 4 ส่วนหลัก พื้นที่ตรงกลางเป็นการแสดงข้อมูลแบบซูมได้ ที่ด้านบนของแผง มีเมนูแบบดรอปดาวน์ซึ่งคุณสามารถเปลี่ยนการจัดเรียงข้อมูลเพื่อควบคุมการแบ่งส่วน การจัดตำแหน่ง และสี ทางด้านขวา มีมุมมองแบบละเอียดของแถวข้อมูลเฉพาะ ซึ่งหมายความว่าคุณสามารถคลิกที่จุดข้อมูลใดๆ ก็ได้ในภาพแสดงตรงกลางเพื่อดูรายละเอียดเกี่ยวกับจุดข้อมูลเฉพาะนั้น

ในขั้นตอนการสร้างภาพข้อมูล คุณมีความสนใจในการค้นหาความสัมพันธ์แบบคู่กันระหว่างตัวแปรอิสระที่มีต่อราคาบ้าน อย่างไรก็ตาม ต้องมีตัวแปรอย่างน้อยสามตัว และกราฟ 3 มิติก็ทำงานด้วยได้ยาก

วิธีหนึ่งในการแก้ไขปัญหานี้คือการสร้างตัวแปรเชิงหมวดหมู่ นั่นคือเราสามารถสร้างพล็อต 2 มิติโดยใช้สีจุดได้ คุณสามารถแบ่งตัวแปร PRICE ออกเป็นสี่หมวดหมู่ โดยแต่ละหมวดหมู่คือควอไทล์ (เช่น 0.25, 0.5, 0.75) คุณเรียกตัวแปรใหม่นี้ว่า Q_PRICE

## 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")

กราฟด้าน

เจาะลึกแง่มุมต่างๆ

หากต้องการเปิด Deep Dive คุณต้องแปลงข้อมูลเป็นรูปแบบ json นุ่นเป็นวัตถุสำหรับสิ่งนั้น คุณสามารถใช้ to_json หลังชุดข้อมูล Pandas

โค้ดบรรทัดแรกจัดการขนาดของชุดข้อมูล

df['Q_PRICE'] =  pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])
sprite_size = 32 if len(df.index)>50000 else 64
jsonstr = df.to_json(orient='records')

รหัสด้านล่างมาจาก Google GitHub หลังจากที่คุณรันโค้ดแล้ว คุณควรจะเห็นสิ่งนี้:

เจาะลึกแง่มุมต่างๆ

# Display thde Dive visualization for this data
from IPython.core.display import display, HTML

# Create Facets template  
HTML_TEMPLATE = """<link rel="import" href="/th/nbextensions/facets-dist/facets-jupyter.html">
        <facets-dive sprite-image-width="{sprite_size}" sprite-image-height="{sprite_size}" id="elem" height="600"></facets-dive>
        <script>
          document.querySelector("#elem").data = {jsonstr};
        </script>"""

# Load the json dataset and the sprite_size into the template
html = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)

# Display the template
display(HTML(html))

คุณสนใจที่จะดูว่ามีความเชื่อมโยงระหว่างอัตราอุตสาหกรรม ความเข้มข้นของออกไซด์ ระยะทางไปศูนย์จัดหางาน และราคาบ้านหรือไม่

เพื่อทำเช่นนั้น ขั้นแรกให้คุณแบ่งข้อมูลตามช่วงอุตสาหกรรมและสีด้วยควอร์ไทล์ราคา:

  • เลือกด้าน X และเลือก INDUS
  • เลือกจอแสดงผลและเลือก DIS มันจะลงสีจุดด้วยควอไทล์ของราคาบ้าน

ในกรณีนี้สีเข้มหมายถึงระยะห่างจากศูนย์จัดหางานแห่งแรกอยู่ไกล

จนถึงตอนนี้ มันแสดงให้เห็นอีกครั้งถึงสิ่งที่คุณรู้ อัตราอุตสาหกรรมที่ลดลง ราคาที่สูงขึ้น ตอนนี้คุณสามารถดูรายละเอียดตาม INDUX และ NOX ได้แล้ว

  • เลือกด้าน Y และเลือก NOX

ตอนนี้คุณจะเห็นว่าบ้านที่อยู่ไกลจากศูนย์จัดหางานแห่งแรกมีส่วนแบ่งอุตสาหกรรมต่ำที่สุดและจึงมีความเข้มข้นของออกไซด์ต่ำที่สุด หากคุณเลือกแสดงประเภทด้วย Q_PRICE และซูมที่มุมล่างซ้าย คุณจะเห็นว่าเป็นราคาประเภทใด

คุณมีคำใบ้อีกประการหนึ่งว่าปฏิสัมพันธ์ระหว่าง IND, NOX และ DIS สามารถเป็นตัวเลือกที่ดีในการปรับปรุงโมเดล

TensorFlow

ในส่วนนี้ คุณจะประมาณค่าตัวแยกประเภทเชิงเส้นด้วย TensorFlow estimators API คุณจะดำเนินการดังต่อไปนี้:

  • เตรียมข้อมูล
  • ประมาณแบบจำลองเกณฑ์มาตรฐาน: ไม่มีการโต้ตอบ
  • ประมาณแบบจำลองที่มีการโต้ตอบ

โปรดจำไว้ว่าเป้าหมายของการเรียนรู้ของเครื่องคือการลดข้อผิดพลาดให้เหลือน้อยที่สุด ในกรณีนี้ โมเดลที่มีค่าคลาดเคลื่อนกำลังสองเฉลี่ยต่ำสุดจะชนะ เครื่องมือประมาณค่า TensorFlow จะคำนวณเมตริกนี้โดยอัตโนมัติ

ข้อมูลการเตรียมการ

ในกรณีส่วนใหญ่ คุณจะต้องแปลงข้อมูลของคุณ นั่นคือเหตุผลว่าทำไมภาพรวม Facets จึงน่าสนใจ จากสถิติสรุปพบว่ามีค่าผิดปกติ ค่าเหล่านั้นส่งผลต่อการประมาณการเนื่องจากดูไม่เหมือนประชากรที่คุณกำลังวิเคราะห์ ค่าผิดปกติมักจะลำเอียงผลลัพธ์ ตัวอย่างเช่น ค่าผิดปกติที่เป็นบวกมีแนวโน้มที่จะประเมินค่าสัมประสิทธิ์สูงเกินไป

ทางออกที่ดีในการแก้ไขปัญหานี้คือการสร้างมาตรฐานให้กับตัวแปร การกำหนดมาตรฐานหมายถึงค่าเบี่ยงเบนมาตรฐานเป็นหนึ่งและค่าเฉลี่ยเป็นศูนย์ กระบวนการกำหนดมาตรฐานประกอบด้วยสองขั้นตอน ก่อนอื่น มันจะลบค่าเฉลี่ยของตัวแปร ประการที่สอง หารด้วยค่าเบี่ยงเบนมาตรฐาน เพื่อให้การแจกแจงมีค่าเบี่ยงเบนมาตรฐานเป็นหน่วย

ไลบรารี sklearn มีประโยชน์ในการกำหนดตัวแปรให้เป็นมาตรฐาน คุณสามารถใช้การประมวลผลล่วงหน้าของโมดูลด้วยมาตราส่วนวัตถุเพื่อจุดประสงค์นี้

คุณสามารถใช้ฟังก์ชันด้านล่างเพื่อปรับขนาดชุดข้อมูลได้ โปรดทราบว่าคุณไม่ได้ปรับขนาดคอลัมน์ป้ายกำกับและตัวแปรหมวดหมู่

from sklearn import preprocessing
def standardize_data(df): 
    X_scaled = preprocessing.scale(df[['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT']])
    X_scaled_df = pd.DataFrame(X_scaled, columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT'])
    df_scale = pd.concat([X_scaled_df,
                       df['CHAS'],
                       df['PRICE']],axis=1, join='inner')
    return df_scale

คุณสามารถใช้ฟังก์ชันนี้เพื่อสร้างชุดรถไฟ/ชุดทดสอบที่ปรับขนาดได้

df_train_scale = standardize_data(df_train)
df_test_scale = standardize_data(df_test)

การถดถอยพื้นฐาน:เกณฑ์มาตรฐาน

ก่อนอื่น คุณฝึกและทดสอบโมเดลโดยไม่มีการโต้ตอบ จุดประสงค์คือการดูตัวชี้วัดประสิทธิภาพของแบบจำลอง

วิธีฝึกโมเดลนั้นเหมือนกับในบทช่วยสอนทุกประการ API ระดับสูง- คุณจะใช้ตัวประมาณค่า TensorFlow LinearRegressor

เพื่อเป็นการเตือนความจำ คุณต้องเลือก:

  • คุณสมบัติที่จะใส่ในโมเดล
  • เปลี่ยนคุณสมบัติ
  • สร้างตัวถดถอยเชิงเส้น
  • สร้างฟังก์ชัน input_fn
  • ฝึกโมเดล
  • ทดสอบโมเดล

คุณใช้ตัวแปรทั้งหมดในชุดข้อมูลเพื่อฝึกโมเดล โดยรวมแล้วมีตัวแปรต่อเนื่องระดับหนึ่งและตัวแปรประเภทหนึ่งตัว

## Add features to the bucket: 
### Define continuous list
CONTI_FEATURES  = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']
CATE_FEATURES = ['CHAS']

คุณแปลงคุณลักษณะเป็นคอลัมน์ตัวเลขหรือคอลัมน์ประเภท

continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]
#categorical_features = tf.feature_column.categorical_column_with_hash_bucket(CATE_FEATURES, hash_bucket_size=1000)
categorical_features = [tf.feature_column.categorical_column_with_vocabulary_list('CHAS', ['yes','no'])]

คุณสร้างโมเดลด้วย linearRegressor คุณเก็บโมเดลไว้ในโฟลเดอร์ train_Boston

model = tf.estimator.LinearRegressor(    
	model_dir="train_Boston",     
    feature_columns=categorical_features + continuous_features)

เอาท์พุต

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a19e76ac8>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

แต่ละคอลัมน์ในข้อมูลรถไฟหรือการทดสอบจะถูกแปลงเป็นเทนเซอร์ด้วยฟังก์ชัน get_input_fn

FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'CHAS']
LABEL= 'PRICE'
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)

คุณประมาณแบบจำลองจากข้อมูลรถไฟ

model.train(input_fn=get_input_fn(df_train_scale, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

เอาท์พุต

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train_Boston/model.ckpt.
INFO:tensorflow:loss = 56417.703, step = 1
INFO:tensorflow:global_step/sec: 144.457
INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)
INFO:tensorflow:global_step/sec: 258.392
INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)
INFO:tensorflow:global_step/sec: 227.998
INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)
INFO:tensorflow:global_step/sec: 210.739
INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)
INFO:tensorflow:global_step/sec: 234.237
INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)
INFO:tensorflow:global_step/sec: 238.1
INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)
INFO:tensorflow:global_step/sec: 237.934
INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)
INFO:tensorflow:global_step/sec: 220.687
INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)
INFO:tensorflow:global_step/sec: 232.702
INFO:tensorflow:loss = 24049.678, step = 901 (0.432 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train_Boston/model.ckpt.
INFO:tensorflow:Loss for final step: 23228.568.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a19e76320>

ในที่สุดคุณก็ประเมินประสิทธิภาพของแบบจำลองบนชุดทดสอบ

model.evaluate(input_fn=get_input_fn(df_test_scale, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

เอาท์พุต

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-29-02:40:43
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43
INFO:tensorflow:Saving dict for global step 1000: average_loss = 86.89361, global_step = 1000, loss = 1650.9785


{'average_loss': 86.89361, 'global_step': 1000, 'loss': 1650.9785}

หลุดโมเดลอยู่ที่ 1650 นี่คือตัวชี้วัดที่ต้องเอาชนะในส่วนถัดไป

ปรับปรุงโมเดล: เงื่อนไขการโต้ตอบ

ในช่วงแรกของบทช่วยสอน คุณได้เห็นความสัมพันธ์ที่น่าสนใจระหว่างตัวแปร เทคนิคการสร้างภาพที่แตกต่างกันเผยให้เห็นว่า INDUS และ NOS เชื่อมโยงกันและเปลี่ยนไปขยายผลต่อราคา ไม่เพียงแต่ปฏิสัมพันธ์ระหว่าง INDUS และ NOS เท่านั้นที่ส่งผลต่อราคา แต่ผลกระทบนี้จะยิ่งรุนแรงขึ้นเมื่อโต้ตอบกับ DIS

ถึงเวลาที่จะสรุปแนวคิดนี้และดูว่าคุณสามารถปรับปรุงแบบจำลองที่คาดการณ์ได้หรือไม่

คุณต้องเพิ่มสองคอลัมน์ใหม่ให้กับชุดข้อมูลแต่ละชุด: ฝึก + ทดสอบ ด้วยเหตุนี้ คุณจึงสร้างฟังก์ชันหนึ่งเพื่อคำนวณเงื่อนไขการโต้ตอบ และอีกฟังก์ชันหนึ่งเพื่อคำนวณเงื่อนไขการโต้ตอบสามรายการ แต่ละฟังก์ชันจะสร้างคอลัมน์เดียว หลังจากสร้างตัวแปรใหม่แล้ว คุณสามารถเชื่อมตัวแปรเข้ากับชุดข้อมูลการฝึกและชุดข้อมูลทดสอบได้

ก่อนอื่น คุณต้องสร้างตัวแปรใหม่สำหรับการโต้ตอบระหว่าง INDUS และ NOX

ฟังก์ชันด้านล่างส่งคืนสอง dataframes ฝึกและทดสอบ โดยมีการโต้ตอบระหว่าง var_1 และ var_2 ในกรณีของคุณ INDUS และ NOX

def interaction_term(var_1, var_2, name):
    t_train = df_train_scale[var_1]*df_train_scale[var_2]
    train = t_train.rename(name)
    t_test = df_test_scale[var_1]*df_test_scale[var_2]
    test = t_test.rename(name)
    return train, test

คุณเก็บคอลัมน์ใหม่สองคอลัมน์

interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')
interation_ind_ns_train.shape
(325,)

ประการที่สอง คุณสร้างฟังก์ชันที่สองเพื่อคำนวณเงื่อนไขการโต้ตอบสามคำ

def triple_interaction_term(var_1, var_2,var_3, name):
    t_train = df_train_scale[var_1]*df_train_scale[var_2]*df_train_scale[var_3]
    train = t_train.rename(name)
    t_test = df_test_scale[var_1]*df_test_scale[var_2]*df_test_scale[var_3]
    test = t_test.rename(name)
    return train, test
interation_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')

เมื่อคุณมีคอลัมน์ทั้งหมดที่จำเป็นแล้ว คุณสามารถเพิ่มคอลัมน์เหล่านั้นเพื่อฝึกและทดสอบชุดข้อมูลได้ คุณตั้งชื่อ dataframe ใหม่ทั้งสองนี้:

  • df_train_new
  • df_test_new
df_train_new = pd.concat([df_train_scale,
                          interation_ind_ns_train,
                          interation_ind_ns_dis_train],
                         axis=1, join='inner')
df_test_new = pd.concat([df_test_scale,
                         interation_ind_ns_test,
                         interation_ind_ns_dis_test],
                         axis=1, join='inner')
df_train_new.head(5)

เอาท์พุต

ปรับปรุงเงื่อนไขการโต้ตอบของโมเดล

นั่นแหละ; คุณสามารถประมาณโมเดลใหม่ด้วยเงื่อนไขการโต้ตอบ และดูการวัดประสิทธิภาพเป็นอย่างไรบ้าง

CONTI_FEATURES_NEW  = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT',
                       'INDUS_NOS', 'INDUS_NOS_DIS']
### Define categorical list
continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]
model = tf.estimator.LinearRegressor(
    model_dir="train_Boston_1", 
    feature_columns= categorical_features + continuous_features_new)

เอาท์พุต

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston_1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a1a5d5860>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

รหัส

FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS','CHAS']
LABEL= 'PRICE'
def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
    return tf.estimator.inputs.pandas_input_fn(
       x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)
model.train(input_fn=get_input_fn(df_train_new, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

เอาท์พุต

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train_Boston_1/model.ckpt.
INFO:tensorflow:loss = 56417.703, step = 1
INFO:tensorflow:global_step/sec: 124.844
INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)
INFO:tensorflow:global_step/sec: 182.704
INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)
INFO:tensorflow:global_step/sec: 208.189
INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)
INFO:tensorflow:global_step/sec: 213.855
INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)
INFO:tensorflow:global_step/sec: 209.758
INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)
INFO:tensorflow:global_step/sec: 196.618
INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)
INFO:tensorflow:global_step/sec: 196.472
INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)
INFO:tensorflow:global_step/sec: 172.82
INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)
INFO:tensorflow:global_step/sec: 168.916
INFO:tensorflow:loss = 19878.56, step = 901 (0.592 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train_Boston_1/model.ckpt.
INFO:tensorflow:Loss for final step: 19598.387.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1a5d5e10>
model.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

เอาท์พุต

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-29-02:41:14
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14
INFO:tensorflow:Saving dict for global step 1000: average_loss = 79.78876, global_step = 1000, loss = 1515.9863


{'average_loss': 79.78876, 'global_step': 1000, 'loss': 1515.9863}

ขาดทุนใหม่คือ 1515 เพียงเพิ่มตัวแปรใหม่สองตัว คุณก็สามารถลดการขาดทุนได้ หมายความว่าคุณสามารถคาดการณ์ได้ดีกว่าแบบจำลองการวัดประสิทธิภาพ