การจำแนกประเภทไบนารีของ TensorFlow: ตัวอย่างตัวแยกประเภทเชิงเส้น
สองอย่างที่พบบ่อยที่สุด การเรียนรู้ภายใต้การดูแล งานคือการถดถอยเชิงเส้นและลักษณนามเชิงเส้น การถดถอยเชิงเส้นทำนายค่าในขณะที่ตัวแยกประเภทเชิงเส้นทำนายคลาส บทช่วยสอนนี้เน้นไปที่ตัวแยกประเภทเชิงเส้น
ลักษณนามเชิงเส้นคืออะไร?
A ลักษณนามเชิงเส้น ใน Machine Learning เป็นวิธีการค้นหาคลาสของออบเจ็กต์ตามคุณลักษณะในการจำแนกประเภททางสถิติ ทำให้การตัดสินใจจำแนกประเภทขึ้นอยู่กับค่าของการรวมเชิงเส้นของคุณลักษณะของวัตถุ ตัวแยกประเภทเชิงเส้นใช้ในปัญหาเชิงปฏิบัติ เช่น การจำแนกเอกสาร และปัญหาที่มีตัวแปรหลายตัว
ปัญหาการจำแนกประเภทคิดเป็นประมาณ 80 เปอร์เซ็นต์ของงานแมชชีนเลิร์นนิง การจำแนกประเภทมีจุดมุ่งหมายเพื่อทำนายความน่าจะเป็นของแต่ละชั้นเรียนโดยพิจารณาจากชุดข้อมูลนำเข้า ป้ายกำกับ (เช่น ตัวแปรตาม) เป็นค่าที่ไม่ต่อเนื่อง เรียกว่าคลาส
- หากป้ายกำกับมีเพียงสองคลาส อัลกอริธึมการเรียนรู้จะเป็น Binary Classifier
- ตัวแยกประเภทหลายคลาสจะจัดการป้ายกำกับที่มีคลาสมากกว่าสองชั้น
ตัวอย่างเช่น ปัญหาการจำแนกประเภทแบบไบนารีทั่วไปคือการทำนายความเป็นไปได้ที่ลูกค้าจะซื้อสินค้าซ้ำ การทำนายประเภทของสัตว์ที่แสดงในภาพเป็นปัญหาการจำแนกประเภทแบบหลายคลาส เนื่องจากมีสัตว์มากกว่าสองสายพันธุ์
ส่วนทางทฤษฎีของบทช่วยสอนนี้เน้นที่คลาสไบนารีเป็นหลัก คุณจะได้เรียนรู้เพิ่มเติมเกี่ยวกับฟังก์ชันเอาต์พุตแบบหลายคลาสในบทช่วยสอนในอนาคต
ตัวแยกประเภทไบนารีทำงานอย่างไร
คุณได้เรียนรู้ในบทช่วยสอนก่อนหน้านี้ว่าฟังก์ชันประกอบด้วยตัวแปรสองประเภท ตัวแปรตามและชุดคุณลักษณะ (ตัวแปรอิสระ) ในการถดถอยเชิงเส้น ตัวแปรตามคือจำนวนจริงที่ไม่มีช่วง วัตถุประสงค์หลักคือการทำนายค่าของมันโดยการลดความคลาดเคลื่อนกำลังสองเฉลี่ยให้เหลือน้อยที่สุด
สำหรับ TensorFlow Binary Classifier ป้ายกำกับสามารถมีค่าจำนวนเต็มที่เป็นไปได้สองค่า ในกรณีส่วนใหญ่ จะเป็น [0,1] หรือ [1,2] ตัวอย่างเช่น วัตถุประสงค์คือเพื่อคาดการณ์ว่าลูกค้าจะซื้อผลิตภัณฑ์หรือไม่ ป้ายกำกับถูกกำหนดดังนี้:
- Y = 1 (ลูกค้าซื้อสินค้า)
- Y = 0 (ลูกค้าไม่ได้ซื้อสินค้า)
โมเดลนี้ใช้ฟีเจอร์ X เพื่อจัดประเภทลูกค้าแต่ละรายในกลุ่มที่มีแนวโน้มมากที่สุดที่เขาเป็นสมาชิก กล่าวคือ ผู้ที่อาจเป็นผู้ซื้อหรือไม่
ความน่าจะเป็นของความสำเร็จจะถูกคำนวณด้วย การถดถอยโลจิสติก- อัลกอริทึมจะคำนวณความน่าจะเป็นตามคุณลักษณะ X และคาดการณ์ความสำเร็จเมื่อความน่าจะเป็นนี้สูงกว่า 50 เปอร์เซ็นต์ อย่างเป็นทางการมากขึ้น ความน่าจะเป็นจะถูกคำนวณตามที่แสดงในตัวอย่างการจำแนกประเภทไบนารี TensorFlow ด้านล่าง:
โดยที่ 0 คือเซตของน้ำหนัก คุณลักษณะ และ b อคติ
ฟังก์ชั่นสามารถแบ่งออกเป็นสองส่วน:
- โมเดลเชิงเส้น
- ฟังก์ชันลอจิสติกส์
โมเดลเชิงเส้น
คุณคุ้นเคยกับวิธีคำนวณน้ำหนักอยู่แล้ว น้ำหนักคำนวณโดยใช้ผลิตภัณฑ์ดอท: Y เป็นฟังก์ชันเชิงเส้นของจุดสนใจ x ทั้งหมดi- ถ้าแบบจำลองไม่มีคุณลักษณะ การทำนายจะเท่ากับอคติ ข
น้ำหนักระบุทิศทางของความสัมพันธ์ระหว่างคุณลักษณะ xi และป้ายกำกับ y ความสัมพันธ์เชิงบวกเพิ่มความน่าจะเป็นของคลาสเชิงบวก ในขณะที่ความสัมพันธ์เชิงลบทำให้ความน่าจะเป็นเข้าใกล้ 0 มากขึ้น (นั่นคือ คลาสเชิงลบ)
โมเดลเชิงเส้นส่งคืนเฉพาะจำนวนจริงเท่านั้น ซึ่งไม่สอดคล้องกับการวัดความน่าจะเป็นของช่วง [0,1] จำเป็นต้องใช้ฟังก์ชันลอจิสติกเพื่อแปลงเอาต์พุตของโมเดลเชิงเส้นให้มีความน่าจะเป็น
ฟังก์ชันลอจิสติก
ฟังก์ชันลอจิสติกหรือฟังก์ชันซิกมอยด์จะมีรูปทรง S และเอาต์พุตของฟังก์ชันนี้จะอยู่ระหว่าง 0 ถึง 1 เสมอ
มันง่ายที่จะแทนที่เอาต์พุตของการถดถอยเชิงเส้นลงในฟังก์ชันซิกมอยด์ ผลลัพธ์ที่ได้คือตัวเลขใหม่ที่มีความน่าจะเป็นระหว่าง 0 ถึง 1
ตัวแยกประเภทสามารถเปลี่ยนความน่าจะเป็นเป็นคลาสได้
- ค่าระหว่าง 0 ถึง 0.49 จะกลายเป็นคลาส 0
- ค่าระหว่าง 0.5 ถึง 1 จะกลายเป็นคลาส 1
จะวัดประสิทธิภาพของ Linear Classifier ได้อย่างไร
ความถูกต้อง
ประสิทธิภาพโดยรวมของตัวแยกประเภทวัดด้วยเมตริกความแม่นยำ ความแม่นยำจะรวบรวมค่าที่ถูกต้องทั้งหมดหารด้วยจำนวนการสังเกตทั้งหมด ตัวอย่างเช่น ค่าความแม่นยำ 80 เปอร์เซ็นต์ หมายความว่าแบบจำลองนั้นถูกต้องในกรณี 80 เปอร์เซ็นต์
คุณสามารถสังเกตเห็นข้อบกพร่องด้วยเมตริกนี้ โดยเฉพาะอย่างยิ่งสำหรับคลาสที่ไม่สมดุล ชุดข้อมูลที่ไม่สมดุลจะเกิดขึ้นเมื่อจำนวนการสังเกตต่อกลุ่มไม่เท่ากัน สมมติว่าคุณพยายามจำแนกเหตุการณ์ที่เกิดขึ้นไม่บ่อยด้วยฟังก์ชันลอจิสติกส์ ลองนึกภาพว่าตัวจำแนกพยายามประมาณการเสียชีวิตของผู้ป่วยที่เกิดจากการเจ็บป่วย ในข้อมูล ผู้ป่วย 5 เปอร์เซ็นต์เสียชีวิต คุณสามารถฝึกตัวจำแนกให้ทำนายจำนวนผู้เสียชีวิตและใช้เมตริกความแม่นยำเพื่อประเมินประสิทธิภาพ หากตัวจำแนกทำนายการเสียชีวิต 0 รายสำหรับชุดข้อมูลทั้งหมด ก็จะถูกต้องใน 95 เปอร์เซ็นต์ของกรณี
เมทริกซ์ความสับสน
วิธีที่ดีกว่าในการประเมินประสิทธิภาพของตัวแยกประเภทคือการดูเมทริกซ์ความสับสน
เหตุการณ์ เมทริกซ์ความสับสน แสดงความแม่นยำของตัวจำแนกประเภทโดยเปรียบเทียบคลาสจริงและคลาสที่คาดการณ์ไว้ตามที่แสดงในตัวอย่างตัวจำแนกประเภทเชิงเส้นด้านบน เมทริกซ์ความสับสนแบบไบนารีประกอบด้วยสี่เหลี่ยม:
- TP: ค่าบวกจริง: ค่าที่คาดการณ์ไว้ทำนายอย่างถูกต้องว่าเป็นบวกจริง
- FP: ค่าที่ทำนายไว้ทำนายค่าบวกจริงไม่ถูกต้อง กล่าวคือ ค่าลบที่ทำนายว่าเป็นบวก
- FN: ค่าลบที่เป็นเท็จ: ค่าบวกที่คาดการณ์ว่าเป็นค่าลบ
- TN: ค่าลบจริง: ค่าที่คาดการณ์ไว้ถูกทำนายอย่างถูกต้องว่าเป็นค่าลบจริง
จากเมทริกซ์ความสับสน ง่ายต่อการเปรียบเทียบคลาสจริงกับคลาสที่ทำนาย
ความแม่นยำและความไว
เมทริกซ์ความสับสนให้ข้อมูลเชิงลึกที่ดีเกี่ยวกับผลบวกเชิงบวกและผลบวกลวง ในบางกรณี ควรมีการวัดที่กระชับกว่านี้จะดีกว่า
ความแม่นยำ
เมตริกความแม่นยำแสดงความแม่นยำของคลาสที่เป็นบวก โดยจะวัดว่าการทำนายคลาสเชิงบวกมีความเป็นไปได้เพียงใด
คะแนนสูงสุดคือ 1 เมื่อตัวแยกประเภทจำแนกค่าบวกทั้งหมดได้อย่างสมบูรณ์แบบ ความแม่นยำเพียงอย่างเดียวไม่ได้มีประโยชน์มากนักเพราะจะมองข้ามระดับเชิงลบ โดยปกติแล้วตัวชี้วัดจะจับคู่กับตัวชี้วัดการเรียกคืน การเรียกคืนเรียกอีกอย่างว่าความไวหรืออัตราบวกที่แท้จริง
ความไว
ความไวจะคำนวณอัตราส่วนของคลาสที่เป็นบวกที่ตรวจพบอย่างถูกต้อง ตัวชี้วัดนี้แสดงให้เห็นว่าแบบจำลองนั้นดีเพียงใดในการรับรู้คลาสที่เป็นบวก
ตัวแยกประเภทเชิงเส้นพร้อม TensorFlow
สำหรับบทช่วยสอนนี้ เราจะใช้ชุดข้อมูลการสำรวจสำมะโนประชากร วัตถุประสงค์คือเพื่อใช้ตัวแปรในชุดข้อมูลการสำรวจสำมะโนประชากรเพื่อคาดการณ์ระดับรายได้ โปรดทราบว่ารายได้เป็นตัวแปรไบนารี่
- ที่มีค่า 1 ถ้ารายได้ > 50k
- 0 ถ้ารายได้ < 50k
ตัวแปรนี้คือป้ายกำกับของคุณ
ชุดข้อมูลนี้ประกอบด้วยตัวแปรหมวดหมู่ 8 รายการ:
- ที่ทำงาน
- การศึกษา
- สมรส
- อาชีพ
- ความสัมพันธ์
- แข่ง
- เพศ
- พื้นเมือง_ประเทศ
นอกจากนี้ ยังมีตัวแปรต่อเนื่องอีก 6 ตัวแปร ได้แก่
- อายุ
- Fnlwgt
- การศึกษา_num
- ทุน_กำไร
- เงินทุน_ขาดทุน
- ชั่วโมง_สัปดาห์
จากตัวอย่างการจัดประเภท TensorFlow นี้ คุณจะเข้าใจวิธีฝึกตัวแยกประเภท TensorFlow เชิงเส้นด้วยตัวประมาณค่า TensorFlow และวิธีการปรับปรุงตัววัดความแม่นยำ
เราจะดำเนินการดังนี้:
- ขั้นตอนที่ 1) นำเข้าข้อมูล
- ขั้นตอนที่ 2) การแปลงข้อมูล
- ขั้นตอนที่ 3) ฝึกอบรมลักษณนาม
- ขั้นตอนที่ 4) ปรับปรุงโมเดล
- ขั้นตอนที่ 5) ไฮเปอร์พารามิเตอร์: Lasso & Ridge
ขั้นตอนที่ 1) นำเข้าข้อมูล
คุณต้องนำเข้าไลบรารีที่ใช้ระหว่างบทช่วยสอนก่อน
import tensorflow as tf import pandas as pd
ขั้นตอนต่อไปคือการนำเข้าข้อมูลจากไฟล์เก็บถาวรของ UCI และกำหนดชื่อคอลัมน์ คุณจะใช้ COLUMNS เพื่อตั้งชื่อคอลัมน์ในกรอบข้อมูลแพนด้า
โปรดทราบว่าคุณจะฝึกลักษณนามโดยใช้ Pandas dataframe
## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" PATH_test = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test"
ข้อมูลที่จัดเก็บออนไลน์จะถูกแบ่งระหว่างชุดรถไฟและชุดทดสอบแล้ว
df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_test = pd.read_csv(PATH_test,skiprows = 1, skipinitialspace=True, names = COLUMNS, index_col=False)
ชุดรถไฟประกอบด้วยการสังเกต 32,561 ครั้ง และชุดทดสอบ 16,281 ครั้ง
print(df_train.shape, df_test.shape) print(df_train.dtypes) (32561, 15) (16281, 15) age int64 workclass object fnlwgt int64 education object education_num int64 marital object occupation object relationship object race object sex object capital_gain int64 capital_loss int64 hours_week int64 native_country object label object dtype: object
Tensorflow ต้องใช้ค่าบูลีนในการฝึกตัวจำแนกประเภท คุณต้องแปลงค่าจากสตริงเป็นจำนวนเต็ม ป้ายกำกับจะถูกจัดเก็บเป็นอ็อบเจ็กต์ อย่างไรก็ตาม คุณต้องแปลงป้ายกำกับเป็นค่าตัวเลข โค้ดด้านล่างจะสร้างพจนานุกรมที่มีค่าที่จะแปลงและวนซ้ำผ่านรายการคอลัมน์ โปรดทราบว่าคุณต้องดำเนินการนี้สองครั้ง ครั้งหนึ่งสำหรับการทดสอบการฝึก อีกครั้งสำหรับชุดการทดสอบ
label = {'<=50K': 0,'>50K': 1} df_train.label = [label[item] for item in df_train.label] label_t = {'<=50K.': 0,'>50K.': 1} df_test.label = [label_t[item] for item in df_test.label]
ในข้อมูลรถไฟมีรายได้ 24,720 รายต่ำกว่า 50 และ 7841 ข้างต้น อัตราส่วนเกือบจะเท่ากันสำหรับชุดทดสอบ โปรดดูบทช่วยสอนนี้ใน Facets เพื่อดูข้อมูลเพิ่มเติม
print(df_train["label"].value_counts()) ### The model will be correct in atleast 70% of the case print(df_test["label"].value_counts()) ## Unbalanced label print(df_train.dtypes) 0 24720 1 7841 Name: label, dtype: int64 0 12435 1 3846 Name: label, dtype: int64 age int64 workclass object fnlwgt int64 education object education_num int64 marital object occupation object relationship object race object sex object capital_gain int64 capital_loss int64 hours_week int64 native_country object label int64 dtype: object
ขั้นตอนที่ 2) การแปลงข้อมูล
จำเป็นต้องมีขั้นตอนไม่กี่ขั้นตอนก่อนที่คุณจะฝึกตัวแยกประเภทเชิงเส้นด้วย Tensorflow คุณต้องเตรียมคุณสมบัติที่จะรวมไว้ในโมเดล ในการถดถอยของเกณฑ์มาตรฐาน คุณจะใช้ข้อมูลเดิมโดยไม่ต้องใช้การแปลงใดๆ
เครื่องมือประมาณค่าจำเป็นต้องมีรายการคุณลักษณะเพื่อฝึกโมเดล ดังนั้น ข้อมูลของคอลัมน์จึงต้องถูกแปลงเป็นเมตริกซ์
แนวปฏิบัติที่ดีคือการกำหนดรายการคุณลักษณะสองรายการตามประเภทของคุณลักษณะเหล่านั้น แล้วส่งต่อไปใน Feature_columns ของตัวประมาณค่า
คุณจะเริ่มต้นด้วยการแปลงฟีเจอร์ต่อเนื่อง จากนั้นกำหนดบัคเก็ตด้วยข้อมูลที่เป็นหมวดหมู่
คุณสมบัติของชุดข้อมูลมีสองรูปแบบ:
- จำนวนเต็ม
- วัตถุ
แต่ละคุณลักษณะจะแสดงรายการอยู่ในตัวแปรสองตัวถัดไปตามประเภท
## Add features to the bucket: ### Define continuous list CONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week'] ### Define the categorical list CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country']
คุณลักษณะคอลัมน์ประกอบด้วยวัตถุ numeric_column เพื่อช่วยในการแปลงตัวแปรต่อเนื่องเป็นเมตริกซ์ ในโค้ดด้านล่าง คุณจะแปลงตัวแปรทั้งหมดจาก CONTI_FEATURES เป็นเทนเซอร์ที่มีค่าตัวเลข นี่เป็นภาคบังคับในการสร้างแบบจำลอง ตัวแปรอิสระทั้งหมดจำเป็นต้องแปลงเป็นเทนเซอร์ประเภทที่เหมาะสม
ด้านล่างเราจะเขียนโค้ดเพื่อให้คุณเห็นว่าเกิดอะไรขึ้นเบื้องหลังฟีเจอร์_คอลัมน์.ตัวเลข_คอลัมน์ เราจะพิมพ์ค่าที่แปลงแล้วตามอายุ โดยมีจุดประสงค์เพื่ออธิบาย ดังนั้นจึงไม่จำเป็นต้องเข้าใจโค้ดหลาม คุณสามารถดูเอกสารอย่างเป็นทางการเพื่อทำความเข้าใจรหัสได้
def print_transformation(feature = "age", continuous = True, size = 2): #X = fc.numeric_column(feature) ## Create feature name feature_names = [ feature] ## Create dict with the data d = dict(zip(feature_names, [df_train[feature]])) ## Convert age if continuous == True: c = tf.feature_column.numeric_column(feature) feature_columns = [c] else: c = tf.feature_column.categorical_column_with_hash_bucket(feature, hash_bucket_size=size) c_indicator = tf.feature_column.indicator_column(c) feature_columns = [c_indicator] ## Use input_layer to print the value input_layer = tf.feature_column.input_layer( features=d, feature_columns=feature_columns ) ## Create lookup table zero = tf.constant(0, dtype=tf.float32) where = tf.not_equal(input_layer, zero) ## Return lookup tble indices = tf.where(where) values = tf.gather_nd(input_layer, indices) ## Initiate graph sess = tf.Session() ## Print value print(sess.run(input_layer)) print_transformation(feature = "age", continuous = True) [[39.] [50.] [38.] ... [58.] [22.] [52.]]
ค่าจะเหมือนกับใน df_train ทุกประการ
continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]
ตามเอกสารของ TensorFlow มีวิธีต่างๆ ในการแปลงข้อมูลหมวดหมู่ หากทราบรายการคำศัพท์ของคุณลักษณะและมีค่าไม่มากนัก คุณสามารถสร้างคอลัมน์หมวดหมู่ด้วย categorical_column_with_vocabulary_list ได้ มันจะกำหนด ID ให้กับรายการคำศัพท์ที่ไม่ซ้ำทั้งหมด
ตัวอย่างเช่น หากสถานะตัวแปรมีค่าที่แตกต่างกันสามค่า:
- สามี
- ภรรยา
- เดียว
จากนั้นจะมีการระบุ ID สามรายการ เช่น สามีจะมีบัตรประจำตัว 1 ภรรยามีบัตรประจำตัว 2 เป็นต้น
เพื่อจุดประสงค์ในการอธิบาย คุณสามารถใช้โค้ดนี้เพื่อแปลงตัวแปรออบเจ็กต์เป็นคอลัมน์หมวดหมู่ใน TensorFlow
ฟีเจอร์เพศสามารถมีค่าได้เพียง 2 ค่าเท่านั้น: ชายหรือหญิง เมื่อเราจะแปลงฟีเจอร์เพศ Tensorflow จะสร้างคอลัมน์ใหม่ 1 คอลัมน์ คอลัมน์หนึ่งสำหรับชายและอีกคอลัมน์หนึ่งสำหรับหญิง หากเพศเท่ากับชาย คอลัมน์ใหม่ชายจะเท่ากับ 0 และหญิงจะเท่ากับ XNUMX ตัวอย่างนี้แสดงอยู่ในตารางด้านล่าง:
แถว | เพศ | หลังการเปลี่ยนแปลง | ชาย | หญิง |
---|---|---|---|---|
1 | ชาย | => | 1 | 0 |
2 | ชาย | => | 1 | 0 |
3 | หญิง | => | 0 | 1 |
ในเทนเซอร์โฟลว์:
print_transformation(feature = "sex", continuous = False, size = 2) [[1. 0.] [1. 0.] [1. 0.] ... [0. 1.] [1. 0.] [0. 1.]] relationship = tf.feature_column.categorical_column_with_vocabulary_list( 'relationship', [ 'Husband', 'Not-in-family', 'Wife', 'Own-child', 'Unmarried', 'Other-relative'])
ด้านล่างเราได้เพิ่ม Python รหัสเพื่อพิมพ์การเข้ารหัส ขอย้ำอีกครั้งว่าคุณไม่จำเป็นต้องเข้าใจโค้ด จุดประสงค์คือการเห็นการเปลี่ยนแปลง
อย่างไรก็ตาม วิธีที่เร็วกว่าในการแปลงข้อมูลคือการใช้วิธีการ categorical_column_with_hash_bucket การเปลี่ยนแปลงตัวแปรสตริงในเมทริกซ์แบบกระจายจะมีประโยชน์ เมทริกซ์กระจัดกระจายเป็นเมทริกซ์ที่มีศูนย์เป็นส่วนใหญ่ วิธีการดูแลทุกอย่าง คุณจะต้องระบุจำนวนที่เก็บข้อมูลและคอลัมน์หลักเท่านั้น จำนวนที่เก็บข้อมูลคือจำนวนกลุ่มสูงสุดที่ Tensorflow สามารถสร้างได้ คอลัมน์หลักเป็นเพียงชื่อของคอลัมน์ที่จะแปลง
ในโค้ดด้านล่างนี้ คุณสร้างการวนซ้ำเหนือฟีเจอร์ตามหมวดหมู่ทั้งหมด
categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]
ขั้นตอนที่ 3) ฝึกอบรมลักษณนาม
ปัจจุบัน TensorFlow มีตัวประมาณค่าสำหรับการถดถอยเชิงเส้นและการจำแนกเชิงเส้น
- การถดถอยเชิงเส้น: LinearRegressor
- การจำแนกเชิงเส้น: LinearClassifier
ไวยากรณ์ของตัวแยกประเภทเชิงเส้นจะเหมือนกับในบทช่วยสอน การถดถอยเชิงเส้น ยกเว้นหนึ่งอาร์กิวเมนต์ n_class คุณต้องกำหนดคอลัมน์คุณลักษณะ ไดเร็กทอรีโมเดล และเปรียบเทียบกับตัวถดถอยเชิงเส้น คุณมีการกำหนดจำนวนชั้นเรียน สำหรับการถดถอยโลจิท จำนวนของคลาสจะเท่ากับ 2
แบบจำลองจะคำนวณน้ำหนักของคอลัมน์ที่มีอยู่ใน Continue_features และ categorical_features
model = tf.estimator.LinearClassifier( n_classes = 2, model_dir="ongoing/train", feature_columns=categorical_features+ continuous_features)
เอาท์พุต
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train', '_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 0x181f24c898>, '_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}
เมื่อกำหนดลักษณนามแล้ว คุณสามารถสร้างฟังก์ชันอินพุตได้ วิธีการนี้เหมือนกับในบทช่วยสอนการถดถอยเชิงเส้น ที่นี่ คุณใช้ขนาดแบตช์ 128 และสับเปลี่ยนข้อมูล
FEATURES = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country'] LABEL= 'label' 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)
คุณสร้างฟังก์ชันด้วยอาร์กิวเมนต์ที่ตัวประมาณค่าเชิงเส้นต้องการ เช่น จำนวนยุค จำนวนแบตช์ และสับเปลี่ยนชุดข้อมูลหรือบันทึก เนื่องจากคุณใช้ นุ่น ในการส่งข้อมูลไปยังโมเดล คุณต้องกำหนดตัวแปร X เป็นเฟรมข้อมูลแพนด้า โปรดทราบว่าคุณวนซ้ำข้อมูลทั้งหมดที่จัดเก็บไว้ในฟีเจอร์
มาฝึกโมเดลด้วย object model.train กันดีกว่า คุณใช้ฟังก์ชันที่กำหนดไว้ก่อนหน้านี้เพื่อป้อนโมเดลด้วยค่าที่เหมาะสม โปรดทราบว่าคุณตั้งค่าขนาดแบทช์เป็น 128 และจำนวนยุคเป็นไม่มี หุ่นจำลองจะได้รับการฝึกฝนมากกว่าพันก้าว
model.train(input_fn=get_input_fn(df_train, 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 ongoing/train/model.ckpt. INFO:tensorflow:loss = 88.722855, step = 1 INFO:tensorflow:global_step/sec: 65.8282 INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec) INFO:tensorflow:global_step/sec: 118.386 INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec) INFO:tensorflow:global_step/sec: 110.542 INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec) INFO:tensorflow:global_step/sec: 199.03 INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec) INFO:tensorflow:global_step/sec: 167.488 INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec) INFO:tensorflow:global_step/sec: 220.155 INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec) INFO:tensorflow:global_step/sec: 199.016 INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec) INFO:tensorflow:global_step/sec: 197.531 INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec) INFO:tensorflow:global_step/sec: 208.479 INFO:tensorflow:loss = 22201.918, step = 901 (0.479 sec) INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train/model.ckpt. INFO:tensorflow:Loss for final step: 5444.363. <tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181f223630>
โปรดทราบว่าการสูญเสียลดลงในเวลาต่อมาในช่วง 100 ขั้นตอนสุดท้าย เช่น จาก 901 เป็น 1000
การสูญเสียครั้งสุดท้ายหลังจากการวนซ้ำหนึ่งพันครั้งคือ 5444 คุณสามารถประมาณแบบจำลองของคุณบนชุดทดสอบและดูประสิทธิภาพได้ ในการประเมินประสิทธิภาพของโมเดลของคุณ คุณต้องใช้การประเมินออบเจ็กต์ คุณป้อนโมเดลด้วยชุดทดสอบและตั้งค่าจำนวนยุคเป็น 1 กล่าวคือ ข้อมูลจะถูกส่งไปยังโมเดลเพียงครั้งเดียว
model.evaluate(input_fn=get_input_fn(df_test, num_epochs=1, n_batch = 128, shuffle=False), steps=1000)
INFO:tensorflow:Calling model_fn. WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead. WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:22 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [100/1000] INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:23 INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7615626, accuracy_baseline = 0.76377374, auc = 0.63300294, auc_precision_recall = 0.50891197, average_loss = 47.12155, global_step = 1000, label/mean = 0.23622628, loss = 5993.6406, precision = 0.49401596, prediction/mean = 0.18454961, recall = 0.38637546 {'accuracy': 0.7615626, 'accuracy_baseline': 0.76377374, 'auc': 0.63300294, 'auc_precision_recall': 0.50891197, 'average_loss': 47.12155, 'global_step': 1000, 'label/mean': 0.23622628, 'loss': 5993.6406, 'precision': 0.49401596, 'prediction/mean': 0.18454961, 'recall': 0.38637546}
TensorFlow ส่งคืนหน่วยวัดทั้งหมดที่คุณเรียนรู้ในส่วนทางทฤษฎี ไม่ต้องสงสัยเลยว่าความแม่นยำมีมากเนื่องจากฉลากไม่สมดุล จริงๆ แล้ว โมเดลทำงานได้ดีกว่าการเดาแบบสุ่มเล็กน้อย ลองนึกภาพแบบจำลองทำนายทุกครัวเรือนที่มีรายได้ต่ำกว่า 50 จากนั้นแบบจำลองจะมีความแม่นยำ 70 เปอร์เซ็นต์ จากการวิเคราะห์อย่างใกล้ชิด คุณจะเห็นการคาดการณ์และการเรียกคืนข้อมูลได้ค่อนข้างต่ำ
ขั้นตอนที่ 4) ปรับปรุงโมเดล
เมื่อคุณมีแบบจำลองเกณฑ์มาตรฐานแล้ว คุณสามารถลองปรับปรุงได้ ซึ่งก็คือเพิ่มความแม่นยำ ในบทช่วยสอนก่อนหน้านี้ คุณได้เรียนรู้วิธีปรับปรุงพลังการทำนายด้วยคำศัพท์เชิงโต้ตอบ ในบทช่วยสอนนี้ คุณจะทบทวนแนวคิดนี้อีกครั้งโดยเพิ่มคำศัพท์พหุนามลงในการถดถอย
การถดถอยพหุนามเป็นเครื่องมือสำคัญเมื่อข้อมูลไม่เชิงเส้น มีสองวิธีในการจับภาพความไม่เชิงเส้นในข้อมูล
- เพิ่มพจน์พหุนาม
- รวมตัวแปรต่อเนื่องให้เป็นตัวแปรหมวดหมู่
ศัพท์พหุนาม
จากภาพด้านล่าง คุณจะเห็นว่าการถดถอยพหุนามคืออะไร เป็นสมการที่มีตัวแปร X ที่มีกำลังต่างกัน การถดถอยพหุนามขั้นที่สองมีตัวแปรสองตัวคือ X และ X กำลังสอง ระดับที่สามมีตัวแปรสามตัวคือ X, X2และ X3
ด้านล่างนี้ เราสร้างกราฟที่มีตัวแปรสองตัว ได้แก่ X และ Y เห็นได้ชัดว่าความสัมพันธ์ไม่เป็นเส้นตรง หากเราเพิ่มการถดถอยเชิงเส้น เราจะเห็นว่าโมเดลไม่สามารถจับรูปแบบได้ (ภาพซ้าย)
ทีนี้ ดูภาพซ้ายจากภาพด้านล่าง เราได้บวก 5 เทอมเข้ากับการถดถอย (นั่นคือ y=x+x2+x3+x4+x5- ตอนนี้โมเดลจับรูปแบบได้ดีขึ้นมาก นี่คือพลังของการถดถอยพหุนาม
กลับไปที่ตัวอย่างของเรากัน อายุไม่สัมพันธ์กับรายได้เป็นเส้นตรง อายุยังน้อยอาจมีรายได้คงที่เกือบเป็นศูนย์เพราะเด็กหรือเยาวชนไม่ได้ทำงาน จากนั้นจะเข้าสู่วัยทำงานที่เพิ่มขึ้นและลดลงในช่วงเกษียณอายุ โดยทั่วไปจะเป็นรูปทรง Inversed-U วิธีหนึ่งในการจับรูปแบบนี้คือการเพิ่มกำลังสองให้กับการถดถอย
มาดูกันว่ามันจะเพิ่มความแม่นยำหรือไม่
คุณต้องเพิ่มคุณลักษณะใหม่นี้ลงในชุดข้อมูลและในรายการคุณลักษณะต่อเนื่อง
คุณเพิ่มตัวแปรใหม่ในชุดข้อมูลการฝึกฝนและการทดสอบ ดังนั้นจึงสะดวกกว่าในการเขียนฟังก์ชัน
def square_var(df_t, df_te, var_name = 'age'): df_t['new'] = df_t[var_name].pow(2) df_te['new'] = df_te[var_name].pow(2) return df_t, df_te
ฟังก์ชันมี 3 อาร์กิวเมนต์:
- df_t: กำหนดชุดการฝึก
- df_te: กำหนดชุดทดสอบ
- var_name = 'age': กำหนดตัวแปรที่จะแปลง
คุณสามารถใช้อ็อบเจ็กต์ pow(2) เพื่อยกกำลังสองของอายุของตัวแปรได้ โปรดทราบว่าตัวแปรใหม่มีชื่อว่า 'ใหม่'
เมื่อเขียนฟังก์ชัน square_var แล้ว คุณสามารถสร้างชุดข้อมูลใหม่ได้
df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age')
อย่างที่คุณเห็น ชุดข้อมูลใหม่มีคุณลักษณะเพิ่มเติมอีกหนึ่งอย่าง
print(df_train_new.shape, df_test_new.shape) (32561, 16) (16281, 16)
ตัวแปรสี่เหลี่ยมเรียกว่าตัวแปรใหม่ในชุดข้อมูล คุณต้องเพิ่มลงในรายการคุณสมบัติต่อเนื่อง
CONTI_FEATURES_NEW = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week', 'new'] continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]
หมายเหตุ ว่าคุณเปลี่ยนไดเร็กทอรีของกราฟ คุณไม่สามารถฝึกโมเดลที่แตกต่างกันในไดเร็กทอรีเดียวกันได้ หมายความว่าคุณต้องเปลี่ยนเส้นทางของอาร์กิวเมนต์ model_dir หากคุณไม่ทำ TensorFlow จะทำให้เกิดข้อผิดพลาด
model_1 = tf.estimator.LinearClassifier( model_dir="ongoing/train1", feature_columns=categorical_features+ continuous_features_new)
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train1', '_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 0x1820f04b70>, '_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_NEW = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'new'] 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_NEW}), y = pd.Series(data_set[LABEL].values), batch_size=n_batch, num_epochs=num_epochs, shuffle=shuffle)
เมื่อตัวแยกประเภทได้รับการออกแบบด้วยชุดข้อมูลใหม่แล้ว คุณก็สามารถฝึกและประเมินโมเดลได้
model_1.train(input_fn=get_input_fn(df_train, 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 ongoing/train1/model.ckpt. INFO:tensorflow:loss = 88.722855, step = 1 INFO:tensorflow:global_step/sec: 81.487 INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec) INFO:tensorflow:global_step/sec: 111.169 INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec) INFO:tensorflow:global_step/sec: 128.91 INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec) INFO:tensorflow:global_step/sec: 132.546 INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec) INFO:tensorflow:global_step/sec: 162.194 INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec) INFO:tensorflow:global_step/sec: 204.852 INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec) INFO:tensorflow:global_step/sec: 188.923 INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec) INFO:tensorflow:global_step/sec: 192.041 INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec) INFO:tensorflow:global_step/sec: 197.025 INFO:tensorflow:loss = 3309.5786, step = 901 (0.507 sec) INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train1/model.ckpt. INFO:tensorflow:Loss for final step: 28861.898. <tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1820f04c88>
model_1.evaluate(input_fn=get_input_fn(df_test_new, num_epochs=1, n_batch = 128, shuffle=False), steps=1000)
INFO:tensorflow:Calling model_fn. WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead. WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:37 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [100/1000] INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:39 INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7944229, accuracy_baseline = 0.76377374, auc = 0.6093755, auc_precision_recall = 0.54885805, average_loss = 111.0046, global_step = 1000, label/mean = 0.23622628, loss = 14119.265, precision = 0.6682401, prediction/mean = 0.09116262, recall = 0.2576703 {'accuracy': 0.7944229, 'accuracy_baseline': 0.76377374, 'auc': 0.6093755, 'auc_precision_recall': 0.54885805, 'average_loss': 111.0046, 'global_step': 1000, 'label/mean': 0.23622628, 'loss': 14119.265, 'precision': 0.6682401, 'prediction/mean': 0.09116262, 'recall': 0.2576703}
ตัวแปรกำลังสองปรับปรุงความแม่นยำจาก 0.76 เป็น 0.79 มาดูกันว่าคุณสามารถทำได้ดีกว่านี้หรือไม่โดยการรวมการเก็บข้อมูลและการโต้ตอบเข้าด้วยกัน
การเก็บข้อมูลและการโต้ตอบ
อย่างที่คุณเห็นก่อนหน้านี้ ตัวแยกประเภทเชิงเส้นไม่สามารถจับรูปแบบรายได้ตามวัยได้อย่างถูกต้อง นั่นเป็นเพราะมันเรียนรู้น้ำหนักเดียวสำหรับแต่ละคุณสมบัติ เพื่อให้ตัวแยกประเภทง่ายขึ้น สิ่งหนึ่งที่คุณสามารถทำได้คือรวมฟีเจอร์นี้ไว้ การเก็บข้อมูลจะแปลงฟีเจอร์ตัวเลขเป็นหลายๆ ฟีเจอร์ตามช่วงที่ฟีเจอร์นั้นอยู่ และฟีเจอร์ใหม่แต่ละฟีเจอร์จะบ่งบอกว่าอายุของบุคคลนั้นอยู่ในช่วงนั้นหรือไม่
ด้วยฟีเจอร์ใหม่เหล่านี้ โมเดลเชิงเส้นสามารถบันทึกความสัมพันธ์โดยการเรียนรู้น้ำหนักที่แตกต่างกันสำหรับแต่ละบัคเก็ต
ใน TensorFlow ทำได้ด้วย bucketized_column คุณต้องเพิ่มช่วงของค่าในขอบเขต
age = tf.feature_column.numeric_column('age') age_buckets = tf.feature_column.bucketized_column( age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])
คุณรู้อยู่แล้วว่าอายุไม่เป็นเชิงเส้นกับรายได้ อีกวิธีหนึ่งในการปรับปรุงโมเดลคือผ่านการโต้ตอบ ในคำพูดของ TensorFlow มันเป็นการข้ามคุณสมบัติ การข้ามคุณลักษณะเป็นวิธีหนึ่งในการสร้างคุณลักษณะใหม่ที่เป็นการผสมผสานระหว่างคุณลักษณะที่มีอยู่ ซึ่งจะมีประโยชน์สำหรับตัวแยกประเภทเชิงเส้นที่ไม่สามารถจำลองการโต้ตอบระหว่างคุณลักษณะต่างๆ ได้
คุณสามารถแจกแจงอายุด้วยฟีเจอร์อื่นๆ เช่น การศึกษา คือบางกลุ่มมีแนวโน้มมีรายได้สูง บางกลุ่มต่ำ (ลองนึกถึงนักศึกษาปริญญาเอก)
education_x_occupation = [tf.feature_column.crossed_column( ['education', 'occupation'], hash_bucket_size=1000)] age_buckets_x_education_x_occupation = [tf.feature_column.crossed_column( [age_buckets, 'education', 'occupation'], hash_bucket_size=1000)]
หากต้องการสร้างคอลัมน์คุณลักษณะแบบไขว้ คุณต้องใช้ crossed_column กับตัวแปรที่จะข้ามในวงเล็บ hash_bucket_size ระบุความเป็นไปได้ในการข้ามสูงสุด หากต้องการสร้างการโต้ตอบระหว่างตัวแปร (ต้องมีตัวแปรอย่างน้อย 1000 ตัวที่เป็นหมวดหมู่) คุณสามารถใช้ tf.feature_column.crossed_column หากต้องการใช้ออบเจ็กต์นี้ คุณจะต้องเพิ่มตัวแปรที่จะโต้ตอบในวงเล็บเหลี่ยมและอาร์กิวเมนต์ที่สอง ซึ่งก็คือขนาดบัคเก็ต ขนาดที่เก็บข้อมูลคือจำนวนกลุ่มสูงสุดที่เป็นไปได้ภายในตัวแปร ที่นี่คุณตั้งค่าไว้ที่ XNUMX เนื่องจากคุณไม่ทราบจำนวนกลุ่มที่แน่นอน
ต้องเพิ่ม age_buckets ยกกำลังสองก่อนจึงจะเพิ่มลงในคอลัมน์ฟีเจอร์ได้ คุณยังเพิ่มคุณลักษณะใหม่ให้กับคอลัมน์คุณลักษณะและเตรียมตัวประมาณค่า
base_columns = [ age_buckets, ] model_imp = tf.estimator.LinearClassifier( model_dir="ongoing/train3", feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation)
เอาท์พุต
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train3', '_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 0x1823021be0>, '_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_imp = ['age','workclass', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country', 'new'] 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_imp}), y = pd.Series(data_set[LABEL].values), batch_size=n_batch, num_epochs=num_epochs, shuffle=shuffle)
คุณพร้อมที่จะประมาณการโมเดลใหม่และดูว่าจะปรับปรุงความแม่นยำหรือไม่
model_imp.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 ongoing/train3/model.ckpt. INFO:tensorflow:loss = 88.722855, step = 1 INFO:tensorflow:global_step/sec: 94.969 INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec) INFO:tensorflow:global_step/sec: 242.342 INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec) INFO:tensorflow:global_step/sec: 213.686 INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec) INFO:tensorflow:global_step/sec: 174.084 INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec) INFO:tensorflow:global_step/sec: 191.78 INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec) INFO:tensorflow:global_step/sec: 163.436 INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec) INFO:tensorflow:global_step/sec: 164.347 INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec) INFO:tensorflow:global_step/sec: 154.274 INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec) INFO:tensorflow:global_step/sec: 189.14 INFO:tensorflow:loss = 44.69645, step = 901 (0.531 sec) INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train3/model.ckpt. INFO:tensorflow:Loss for final step: 44.18133. <tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1823021cf8>
model_imp.evaluate(input_fn=get_input_fn(df_test_new, num_epochs=1, n_batch = 128, shuffle=False), steps=1000)
INFO:tensorflow:Calling model_fn. WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead. WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:52 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [100/1000] INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:54 INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.8358209, accuracy_baseline = 0.76377374, auc = 0.88401634, auc_precision_recall = 0.69599575, average_loss = 0.35122654, global_step = 1000, label/mean = 0.23622628, loss = 44.67437, precision = 0.68986726, prediction/mean = 0.23320661, recall = 0.55408216 {'accuracy': 0.8358209, 'accuracy_baseline': 0.76377374, 'auc': 0.88401634, 'auc_precision_recall': 0.69599575, 'average_loss': 0.35122654, 'global_step': 1000, 'label/mean': 0.23622628, 'loss': 44.67437, 'precision': 0.68986726, 'prediction/mean': 0.23320661, 'recall': 0.55408216}
ระดับความแม่นยำใหม่คือ 83.58 เปอร์เซ็นต์ สูงกว่ารุ่นก่อนถึงสี่เปอร์เซ็นต์
สุดท้ายนี้ คุณสามารถเพิ่มเงื่อนไขการทำให้เป็นมาตรฐานเพื่อป้องกันไม่ให้มีการติดตั้งมากเกินไป
ขั้นตอนที่ 5) ไฮเปอร์พารามิเตอร์: Lasso & Ridge
โมเดลของคุณสามารถทนทุกข์ทรมานจาก ฟิตเกินไป or เหมาะสม.
- การติดตั้งมากเกินไป: โมเดลไม่สามารถสรุปการคาดการณ์กับข้อมูลใหม่ได้
- Underfitting: โมเดลไม่สามารถจับรูปแบบของข้อมูลได้ กล่าวคือ การถดถอยเชิงเส้นเมื่อข้อมูลไม่เป็นเชิงเส้น
เมื่อแบบจำลองมีพารามิเตอร์จำนวนมากและมีข้อมูลค่อนข้างน้อย จะทำให้คาดการณ์ได้ไม่ดี ลองนึกภาพ กลุ่มหนึ่งมีเพียงสามข้อสังเกตเท่านั้น โมเดลจะคำนวณน้ำหนักให้กับกลุ่มนี้ น้ำหนักจะใช้ในการทำนาย หากการสังเกตชุดการทดสอบสำหรับกลุ่มนี้แตกต่างไปจากชุดการฝึกโดยสิ้นเชิง แบบจำลองก็จะทำการทำนายที่ผิด ระหว่างประเมินด้วยชุดฝึกมีความแม่นยำดีแต่ไม่ดีกับชุดทดสอบเพราะน้ำหนักที่คำนวณไว้ไม่ใช่น้ำหนักจริงที่จะสรุปแบบทั่วไป ในกรณีนี้ จะไม่มีการคาดการณ์ที่สมเหตุสมผลกับข้อมูลที่มองไม่เห็น
เพื่อป้องกันการติดตั้งเกิน การปรับให้เป็นมาตรฐานช่วยให้คุณควบคุมความซับซ้อนดังกล่าวได้ และทำให้สามารถสรุปผลได้ทั่วไปมากขึ้น มีเทคนิคการปรับให้เป็นมาตรฐานสองแบบ:
- L1: บ่วงบาศ
- L2: ริดจ์
ใน TensorFlow คุณสามารถเพิ่มไฮเปอร์พารามิเตอร์ทั้งสองนี้ในเครื่องมือเพิ่มประสิทธิภาพได้ ตัวอย่างเช่น ยิ่งไฮเปอร์พารามิเตอร์ L2 สูง น้ำหนักก็มีแนวโน้มที่จะต่ำมากและใกล้กับศูนย์ เส้นพอดีจะเรียบมาก ในขณะที่ L2 ใกล้ศูนย์แสดงว่าน้ำหนักใกล้เคียงกับการถดถอยเชิงเส้นปกติ
คุณสามารถลองใช้ค่าต่างๆ ของไฮเปอร์พารามิเตอร์ได้ด้วยตัวเอง และดูว่าคุณสามารถเพิ่มระดับความแม่นยำได้หรือไม่
หมายเหตุ หากคุณเปลี่ยนไฮเปอร์พารามิเตอร์ คุณต้องลบโฟลเดอร์ performing/train4 มิฉะนั้น โมเดลจะเริ่มต้นด้วยโมเดลที่ได้รับการฝึกก่อนหน้านี้
มาดูกันว่าแม่นแค่ไหนกับกระแสโฆษณา
model_regu = tf.estimator.LinearClassifier( model_dir="ongoing/train4", feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation, optimizer=tf.train.FtrlOptimizer( learning_rate=0.1, l1_regularization_strength=0.9, l2_regularization_strength=5))
OUTUT
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train4', '_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 0x1820d9c128>, '_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}
model_regu.train(input_fn=get_input_fn(df_train_new, num_epochs=None, n_batch = 128, shuffle=False), steps=1000)
OUTUT
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 ongoing/train4/model.ckpt. INFO:tensorflow:loss = 88.722855, step = 1 INFO:tensorflow:global_step/sec: 77.4165 INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec) INFO:tensorflow:global_step/sec: 187.889 INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec) INFO:tensorflow:global_step/sec: 201.895 INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec) INFO:tensorflow:global_step/sec: 217.992 INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec) INFO:tensorflow:global_step/sec: 193.676 INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec) INFO:tensorflow:global_step/sec: 202.195 INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec) INFO:tensorflow:global_step/sec: 216.756 INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec) INFO:tensorflow:global_step/sec: 240.215 INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec) INFO:tensorflow:global_step/sec: 220.336 INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec) INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt. INFO:tensorflow:Loss for final step: 43.4942. <tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181ff39e48>
model_regu.evaluate(input_fn=get_input_fn(df_test_new, num_epochs=1, n_batch = 128, shuffle=False), steps=1000)
เอาท์พุต
INFO:tensorflow:Calling model_fn. WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead. WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2018-06-02-08:29:07 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [100/1000] INFO:tensorflow:Finished evaluation at 2018-06-02-08:29:09 INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.83833915, accuracy_baseline = 0.76377374, auc = 0.8869794, auc_precision_recall = 0.7014905, average_loss = 0.34691378, global_step = 1000, label/mean = 0.23622628, loss = 44.12581, precision = 0.69720596, prediction/mean = 0.23662092, recall = 0.5579823 {'accuracy': 0.83833915, 'accuracy_baseline': 0.76377374, 'auc': 0.8869794, 'auc_precision_recall': 0.7014905, 'average_loss': 0.34691378, 'global_step': 1000, 'label/mean': 0.23622628, 'loss': 44.12581, 'precision': 0.69720596, 'prediction/mean': 0.23662092, 'recall': 0.5579823}
ด้วยไฮเปอร์พารามิเตอร์นี้ คุณจะเพิ่มเมตริกความแม่นยำได้เล็กน้อย ในบทช่วยสอนถัดไป คุณจะได้เรียนรู้วิธีปรับปรุงตัวแยกประเภทเชิงเส้นโดยใช้วิธีเคอร์เนล
สรุป
หากต้องการฝึกโมเดล คุณต้อง:
- กำหนดคุณสมบัติ: ตัวแปรอิสระ: X
- กำหนดป้ายกำกับ: ตัวแปรตาม: y
- สร้างชุดรถไฟ/ชุดทดสอบ
- กำหนดน้ำหนักเริ่มต้น
- กำหนดฟังก์ชันการสูญเสีย: MSE
- ปรับโมเดลให้เหมาะสม: การไล่ระดับลง
- กำหนด:
- อัตราการเรียนรู้
- จำนวนยุค
- ขนาดแบทช์
- จำนวนชั้นเรียน
ในบทช่วยสอนนี้ คุณได้เรียนรู้วิธีใช้ API ระดับสูงสำหรับตัวแยกประเภทการถดถอยเชิงเส้น คุณต้องกำหนด:
- คอลัมน์คุณลักษณะ หากต่อเนื่อง: tf.feature_column.numeric_column() คุณสามารถเติมรายการด้วยความเข้าใจรายการหลาม
- ตัวประมาณค่า: tf.estimator.LinearClassifier(feature_columns, model_dir, n_classes = 2)
- ฟังก์ชันในการนำเข้าข้อมูล ขนาดแบตช์ และยุค: input_fn()
หลังจากนั้นคุณก็พร้อมที่จะฝึกฝน ประเมิน และทำนายด้วย train() ประเมิน() และทำนาย()
หากต้องการปรับปรุงประสิทธิภาพของโมเดล คุณสามารถ:
- ใช้การถดถอยพหุนาม
- คำโต้ตอบ: tf.feature_column.crossed_column
- เพิ่มพารามิเตอร์การทำให้เป็นมาตรฐาน