আমি স্কলারন কোডটি ব্যবহার করব , কারণ এটি R
কোডের চেয়ে সাধারণত পরিষ্কার থাকে ।
এখানে গ্রেডিয়েন্টবুস্টিংক্লাইসিফায়ারের বৈশিষ্ট্য_গুরুত্বপূর্ণ সম্পত্তিটির বাস্তবায়ন (আমি কোডের কয়েকটি লাইন সরিয়েছি যা ধারণাগত স্টাফের পথে আসে)
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_
বুস্টারটিতে পৃথক গাছ সমন্বিত একটি অ্যারে, তাই লুপের জন্য পৃথক গাছের উপরে পুনরাবৃত্তি হয়। এর সাথে একটি হিকআপ আছে
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
সুতরাং, কথায় কথায়, পৃথক গাছগুলির বৈশিষ্ট্য আমদানিগুলি যোগ করুন, তারপরে মোট গাছের সংখ্যা দ্বারা ভাগ করুন । এটি একটি গাছের জন্য কীভাবে বৈশিষ্ট্য আমদানি গণনা করা যায় তা দেখতে পাওয়া যায়।
গাছের গুরুত্ব গণনাটি সাইথন স্তরে প্রয়োগ করা হয় , তবে এটি এখনও অনুসরণযোগ্য। কোডটির একটি পরিষ্কার সংস্করণ এখানে
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
এটি মনে রাখার মতো বিষয় যে গাছে জন্মানোর সময় কী বিভাজন করতে হবে তা নির্ধারণ করার সময় মেট্রিকের ব্যবহারের জন্য অপরিষ্কারের একটি সাধারণ নাম। এই আলোকে আমরা প্রতিটি সংক্ষিপ্ত বিবরণে গাছের সমস্ত বিভাজনকে অপরিচ্ছন্নতা কমাতে কতটা বিভক্ত করে দেওয়া হয়েছিল তার সংক্ষিপ্তসারটি করছি।
গ্রেডিয়েন্ট বৃদ্ধির প্রসঙ্গে, এই গাছগুলি সর্বদা রিগ্রেশন ট্রি (লোভের সাথে স্কোয়ার ত্রুটি হ্রাস করুন) ক্ষতি ফাংশনের গ্রেডিয়েন্টের সাথে উপযুক্ত।