ฉันจะใช้รหัสsklearnเนื่องจากโดยทั่วไปแล้วจะสะอาดกว่าR
โค้ดมาก
นี่คือการใช้งานคุณสมบัติ feature_importances ของGradientBoostingClassifier (ฉันลบบางบรรทัดของรหัสที่ได้รับในทางของสิ่งที่แนวคิด)
def feature_importances_(self):
total_sum = np.zeros((self.n_features, ), dtype=np.float64)
for stage in self.estimators_:
stage_sum = sum(tree.feature_importances_
for tree in stage) / len(stage)
total_sum += stage_sum
importances = total_sum / len(self.estimators_)
return importances
มันค่อนข้างเข้าใจง่าย self.estimators_
เป็นอาร์เรย์ที่มีต้นไม้แต่ละต้นในบูสเตอร์ดังนั้นสำหรับลูปจะวนซ้ำไปตามต้นไม้แต่ละต้น มีหนึ่ง hickup ด้วย
stage_sum = sum(tree.feature_importances_
for tree in stage) / len(stage)
นี่คือการดูแลกรณีตอบกลับที่ไม่ใช่ไบนารี ที่นี่เราพอดีกับต้นไม้หลายต้นในแต่ละขั้นตอนด้วยวิธีเดียวกับทั้งหมด tree.feature_importances_
แนวคิดที่ง่ายที่สุดที่จะมุ่งเน้นไปที่กรณีไบนารีที่ผลรวมมีหนึ่งตัวตั้งและนี้เป็นเพียง ดังนั้นในกรณีไบนารีเราสามารถเขียนทั้งหมดนี้เป็น
def feature_importances_(self):
total_sum = np.zeros((self.n_features, ), dtype=np.float64)
for tree in self.estimators_:
total_sum += tree.feature_importances_
importances = total_sum / len(self.estimators_)
return importances
ดังนั้นโดยสรุปแล้วคุณลักษณะสำคัญของต้นไม้แต่ละต้นแล้วหารด้วยจำนวนต้นไม้ทั้งหมด มันยังคงอยู่เพื่อดูวิธีการคำนวณความสำคัญของคุณลักษณะสำหรับต้นไม้ต้นเดียว
การคำนวณความสำคัญของต้นไม้นั้นถูกนำไปใช้ในระดับ cythonแต่ก็ยังสามารถติดตามได้ นี่คือรหัสเวอร์ชันที่ล้างแล้ว
cpdef compute_feature_importances(self, normalize=True):
"""Computes the importance of each feature (aka variable)."""
while node != end_node:
if node.left_child != _TREE_LEAF:
# ... and node.right_child != _TREE_LEAF:
left = &nodes[node.left_child]
right = &nodes[node.right_child]
importance_data[node.feature] += (
node.weighted_n_node_samples * node.impurity -
left.weighted_n_node_samples * left.impurity -
right.weighted_n_node_samples * right.impurity)
node += 1
importances /= nodes[0].weighted_n_node_samples
return importances
มันค่อนข้างเรียบง่าย ทำซ้ำผ่านโหนดของต้นไม้ ตราบใดที่คุณไม่ได้อยู่ที่โหนดใบให้คำนวณการลดน้ำหนักในความบริสุทธิ์ของโหนดจากการแยกที่โหนดนี้และให้คุณลักษณะกับคุณลักษณะที่แยกออก
importance_data[node.feature] += (
node.weighted_n_node_samples * node.impurity -
left.weighted_n_node_samples * left.impurity -
right.weighted_n_node_samples * right.impurity)
จากนั้นเมื่อเสร็จแล้วให้หารทั้งหมดด้วยน้ำหนักรวมของข้อมูล (ในกรณีส่วนใหญ่จำนวนการสังเกต)
importances /= nodes[0].weighted_n_node_samples
เป็นความทรงจำที่คุ้มค่าที่จะต้องบอกว่าสิ่งเจือปนนั้นเป็นชื่อสามัญสำหรับตัวชี้วัดที่จะใช้เมื่อพิจารณาว่าจะแยกสิ่งใดเมื่อทำการปลูกต้นไม้ ในความสว่างนั้นเราเพียงสรุปว่าการแยกแต่ละคุณลักษณะช่วยให้เราสามารถลดสิ่งเจือปนในการแยกทั้งหมดในต้นไม้
ในบริบทของการส่งเสริมการไล่ระดับสีต้นไม้เหล่านี้มักจะเป็นต้นไม้ถดถอย (ลดข้อผิดพลาดกำลังสองอย่างตะกละตะกลาม) ให้พอดีกับการไล่ระดับของฟังก์ชันการสูญเสีย