การถดถอยเชิงเส้น 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 จะแบ่งคอลัมน์ของข้อมูลออกเป็นแถวของข้อมูลที่สำคัญซึ่งแสดง
- เปอร์เซ็นต์ของการสังเกตที่ขาดหายไป
- ค่าต่ำสุดและสูงสุด
- สถิติต่างๆ เช่น ค่าเฉลี่ย ค่ามัธยฐาน และส่วนเบี่ยงเบนมาตรฐาน
- นอกจากนี้ยังเพิ่มคอลัมน์ที่แสดงเปอร์เซ็นต์ของค่าที่เป็นศูนย์ ซึ่งจะมีประโยชน์เมื่อค่าส่วนใหญ่เป็นศูนย์
- คุณสามารถดูการแจกแจงเหล่านี้ได้บนชุดข้อมูลทดสอบ รวมถึงชุดฝึกอบรมสำหรับแต่ละฟีเจอร์ ซึ่งหมายความว่าคุณสามารถตรวจสอบซ้ำอีกครั้งว่าการทดสอบมีการแจกแจงที่คล้ายคลึงกันกับข้อมูลฝึกอบรมหรือไม่
นี่เป็นขั้นต่ำที่ต้องทำก่อนงานแมชชีนเลิร์นนิงใดๆ ด้วยเครื่องมือนี้ คุณจะไม่พลาดขั้นตอนสำคัญนี้ และจะเน้นย้ำถึงความผิดปกติบางอย่าง
เจาะลึกแง่มุมต่างๆ
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 และดาวน์โหลดที่เก็บข้อมูล
หากคุณเลือกตัวเลือกแรก ไฟล์จะจบลงที่ไฟล์ดาวน์โหลดของคุณ คุณสามารถปล่อยให้ไฟล์ดาวน์โหลดหรือลากไปยังเส้นทางอื่นได้
คุณสามารถตรวจสอบตำแหน่งที่เก็บ Facets ได้ด้วยบรรทัดคำสั่งนี้:
echo `pwd`/`ls facets`
เมื่อคุณพบ Facets แล้ว คุณจะต้องติดตั้งมันเข้าไป Jupyter สมุดบันทึก. คุณต้องตั้งค่าไดเร็กทอรีการทำงานให้เป็นเส้นทางที่มี facets อยู่
ไดเร็กทอรีการทำงานปัจจุบันและตำแหน่งของ Facets zip ควรเหมือนกัน
คุณต้องชี้ไดเร็กทอรีการทำงานไปที่ 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 เพียงเพิ่มตัวแปรใหม่สองตัว คุณก็สามารถลดการขาดทุนได้ หมายความว่าคุณสามารถคาดการณ์ได้ดีกว่าแบบจำลองการวัดประสิทธิภาพ