স্কাইকিট-লার্ন (বা অন্য কোনও পাইথন ফ্রেমওয়ার্ক) ব্যবহার করে বিভিন্ন ধরণের রেজিস্ট্রারের সংযুক্তকরণ


27

আমি রিগ্রেশন টাস্কটি সমাধান করার চেষ্টা করছি। আমি জানতে পেরেছি যে 3 টি মডেল ডেটার বিভিন্ন সাবসেটের জন্য দুর্দান্তভাবে কাজ করছে: লাসোএলআরএস, এসভিআর এবং গ্রেডিয়েন্ট ট্রি বুস্টিং। আমি লক্ষ করেছি যে আমি যখন এই 3 টি মডেল ব্যবহার করে পূর্বাভাস দিই এবং তারপরে আমার 3 টি মডেলের 'সত্য আউটপুট' এবং আউটপুটগুলির একটি টেবিল তৈরি করি তখন আমি দেখি যে প্রতিবারের কমপক্ষে একটি মডেল সত্যিকারের আউটপুটটির নিকটে, যদিও 2 জন অন্য তুলনামূলকভাবে অনেক দূরে হতে পারে।

আমি যখন ন্যূনতম সম্ভাব্য ত্রুটি গণনা করি (প্রতিটি পরীক্ষার উদাহরণের জন্য আমি 'সেরা' ভবিষ্যদ্বাণীকের কাছ থেকে ভবিষ্যদ্বাণী নিই) আমি একটি ত্রুটি পাই যা কেবল কোনও মডেলের ত্রুটির চেয়ে অনেক ছোট। সুতরাং আমি এই 3 ডিফেন্ডেন্ট মডেলগুলি থেকে ভবিষ্যদ্বাণীগুলি কোনও ধরণের টুকরো টুকরোতে সংযুক্ত করার চেষ্টা করার কথা ভেবেছিলাম। প্রশ্ন হচ্ছে, এটি কীভাবে সঠিকভাবে করা যায়? আমার সমস্ত 3 টি মডেল সাইকিট-লার্ন ব্যবহার করে তৈরি এবং সুরযুক্ত, এটি কি এমন কোনও পদ্ধতি সরবরাহ করে যা মডেলগুলি টুকরো টুকরো করার জন্য ব্যবহার করা যেতে পারে? এখানে সমস্যাটি হ'ল আমি তিনটি মডেলেরই গড় গড় ভবিষ্যদ্বাণী করতে চাই না, আমি এটি ওজন নিয়েই করতে চাই, যেখানে নির্দিষ্ট উদাহরণের বৈশিষ্ট্যের ভিত্তিতে ওজন নির্ধারণ করা উচিত।

এমনকি যদি সাইকিট-লার্ন এ জাতীয় কার্যকারিতা সরবরাহ করে না, তবে কেউ যদি এই কাজটি কীভাবে সম্বোধন করতে হয় তা জেনে রাখা ভাল - ডাটাতে প্রতিটি উদাহরণের জন্য প্রতিটি মডেলের ওজন নির্ধারণ করা। আমি মনে করি এটি সম্ভবত এই 3 টি মডেলের উপরে নির্মিত একটি পৃথক রেজিস্ট্রার দ্বারা সম্পন্ন করা যেতে পারে, যা 3 টি মডেলের প্রতিটির জন্য আউটপুট অনুকূল ওজন চেষ্টা করবে, তবে আমি নিশ্চিত নই যে এটি করার সর্বোত্তম উপায় এটি কিনা I

উত্তর:


32

আসলে scikit-learnএটি এমন কার্যকারিতা সরবরাহ করে, যদিও এটি প্রয়োগ করা কিছুটা জটিল হতে পারে y এখানে তিনটি মডেলের শীর্ষে নির্মিত এমন গড় রেজিস্ট্রারের সম্পূর্ণ কার্যকারী উদাহরণ। প্রথমত, আসুন সমস্ত প্রয়োজনীয় প্যাকেজ আমদানি করুন:

from sklearn.base import TransformerMixin
from sklearn.datasets import make_regression
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.linear_model import LinearRegression, Ridge

তারপরে, আমাদের তিনটি রেজিস্টার মডেলকে ট্রান্সফর্মারে রূপান্তর করতে হবে। এটি আমাদের ভবিষ্যদ্বাণীগুলিকে একটি একক বৈশিষ্ট্য ভেক্টরের সাথে একত্রে মার্জ করার অনুমতি দেবে FeatureUnion:

class RidgeTransformer(Ridge, TransformerMixin):

    def transform(self, X, *_):
        return self.predict(X)


class RandomForestTransformer(RandomForestRegressor, TransformerMixin):

    def transform(self, X, *_):
        return self.predict(X)


class KNeighborsTransformer(KNeighborsRegressor, TransformerMixin):

    def transform(self, X, *_):
        return self.predict(X)

এখন, আমাদের ফ্র্যাঙ্কেনস্টাইন মডেলের জন্য একটি বিল্ডার ফাংশন সংজ্ঞায়িত করা যাক:

def build_model():
    ridge_transformer = Pipeline(steps=[
        ('scaler', StandardScaler()),
        ('poly_feats', PolynomialFeatures()),
        ('ridge', RidgeTransformer())
    ])

    pred_union = FeatureUnion(
        transformer_list=[
            ('ridge', ridge_transformer),
            ('rand_forest', RandomForestTransformer()),
            ('knn', KNeighborsTransformer())
        ],
        n_jobs=2
    )

    model = Pipeline(steps=[
        ('pred_union', pred_union),
        ('lin_regr', LinearRegression())
    ])

    return model

পরিশেষে, আসুন মডেলটি ফিট করি:

print('Build and fit a model...')

model = build_model()

X, y = make_regression(n_features=10, n_targets=2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model.fit(X_train, y_train)
score = model.score(X_test, y_test)

print('Done. Score:', score)

আউটপুট:

Build and fit a model...
Done. Score: 0.9600413867438636

কেন এমনভাবে জটিল জিনিসগুলিকে বিরক্ত করবেন? ঠিক আছে, এই পদ্ধতির সাহায্যে স্ট্যান্ডার্ড scikit-learnমডিউলগুলি যেমন GridSearchCVবা ব্যবহার করে মডেল হাইপারপ্যারামিটারগুলি অনুকূল করতে দেয় RandomizedSearchCV। এছাড়াও, এখন ডিস্ক থেকে একটি প্রাক প্রশিক্ষিত মডেলকে সহজেই সংরক্ষণ এবং লোড করা সম্ভব।


এই পদ্ধতির ব্যবহার করার সময়, প্রতিটি অ্যালগোতে কখন / কোন ভগ্নাংশটি ব্যবহার করা হচ্ছে কোনটি অ্যালগো ব্যবহার করা হচ্ছে তা সরানোর কোনও সহজ উপায় আছে?
ডেভিড হাগান

সম্ভবত ফলস্বরূপ রৈখিক মডেল ( model.named_steps['lin_regr'].coef_) এর সহগের দিকে তাকানো আপনাকে একটি অন্তর্ভুক্ত প্রতিটি মডেল চূড়ান্ত সমাধানে কতটুকু অবদান রাখবে সে সম্পর্কে কিছুটা অন্তর্দৃষ্টি দেবে।
কনস্টেট

@ কনস্টেট আপনার বেস মডেলগুলিতে আপনার ক্রস_ওয়াল_প্রিডিক্ট ব্যবহার করার দরকার নেই? দেখে মনে হচ্ছে আপনার শীর্ষ-স্তরের মডেলটি বর্তমানে আপনার বেস মডেলগুলি থেকে একটি অতিশক্তিকর সংকেত পাবে কারণ এটি বর্তমানে প্রয়োগ করা হয়েছে।
ব্রায়ান বিয়েন

1
এটি ধারণার প্রুফ অফ কনসেপ্ট উদাহরণ, আমি এখানে কোনও মডেল নির্বাচনকে সম্বোধন করিনি। আমি মনে করি এই জাতীয় মডেলগুলি সামগ্রিকভাবে অপ্টিমাইজ করা উচিত, অর্থাত্ ক্রস-বৈধকরণ পদ্ধতির সাহায্যে একই সাথে সমস্ত বিল্ট-ইন মডেলগুলির হাইপার-পরামিতিগুলি অনুকূল করা উচিত।
কনস্ট্যান্ট

আমরা যদি n_targets = 1 রাখি X, y = make_regression(n_features=10, n_targets=1)তবে এটি মাত্রা ত্রুটি দেয়। কেউ কি দয়া করে ব্যাখ্যা করতে পারেন?
মোহিত যাদব

9

ঠিক আছে, গুগল করার জন্য কিছুটা সময় ব্যয় করার পরে আমি জানতে পারি কীভাবে আমি বিজ্ঞান-শিখার মাধ্যমে কীভাবে পাইথনে ওয়েটিং করতে পারি। নীচে বিবেচনা করুন:

আমি আমার রিগ্রেশন মডেলগুলির একটি সেটকে প্রশিক্ষণ দিই (যেমন উল্লেখযোগ্য এসভিআর, লাসো লার্স এবং গ্রেডিয়েন্টবুস্টিংআগ্র্রেসর)। তারপরে আমি তাদের সকলকে প্রশিক্ষণ ডেটাতে চালিত করি (একই ডেটা যা এই 3 টি নিবন্ধকের প্রত্যেকের প্রশিক্ষণের জন্য ব্যবহৃত হয়েছিল)। আমি আমার প্রতিটি অ্যালগরিদমের সাথে উদাহরণের জন্য পূর্বাভাস পেয়েছি এবং এই 3 টি ফলাফলকে কলামগুলি 'পূর্বাভাসিত এসভিআর', 'ভবিষ্যদ্বাণীযুক্ত এসএসআর' এবং 'ভবিষ্যদ্বাণীযুক্ত জিবিআর' দিয়ে প্যান্ডাস ডেটা ফ্রেমে সংরক্ষণ করি। এবং আমি এই ডেটাফ্রেনে চূড়ান্ত কলামটি যুক্ত করব যা আমি 'পূর্বাভাস' বলি যা একটি আসল পূর্বাভাস মান।

তারপরে আমি এই নতুন ডেটাফ্রেমে একটি লিনিয়ার রিগ্রেশনকে প্রশিক্ষণ দিচ্ছি:

 #df - dataframe with results of 3 regressors and true output

 from sklearn linear_model
 stacker= linear_model.LinearRegression()
 stacker.fit(df[['predictedSVR', 'predictedLASSO', 'predictedGBR']], df['predicted'])

সুতরাং যখন আমি নতুন উদাহরণের জন্য ভবিষ্যদ্বাণী করতে চাই তখন আমি কেবলমাত্র আমার 3 টি রেজিস্ট্রারকে আলাদাভাবে চালিত করি এবং তারপরে আমি তা করি:

 stacker.predict() 

আমার 3 রেজিস্টারদের ফলাফলগুলি এবং একটি ফলাফল পেতে।

এখানে সমস্যাটি হচ্ছে আমি রেজিস্ট্রারদের জন্য গড়ে সর্বোচ্চ ওজন খুঁজে পাচ্ছি, প্রতিটি উদাহরণের জন্য ওজন একই হবে যার উপর আমি ভবিষ্যদ্বাণী করার চেষ্টা করব will

কারও কারও কাছে বর্তমান উদাহরণের বৈশিষ্ট্যগুলি ব্যবহার করে কীভাবে স্ট্যাকিং (ওজন) করা যায় সে সম্পর্কে কোনও ধারণা থাকলে এগুলি শুনে ভাল লাগবে।


বাহ, আমি এই পদ্ধতির খুব পছন্দ করি! তবে আপনি মডেলের LinearRegression()পরিবর্তে কেন ব্যবহার করলেন LogisticRegression()?
হ্যারিসন 4

1
@ হ্যারিসন 4 কারণ আমি রিগ্রেশন করছিলাম, শ্রেণিবিন্যাসের কাজটি নয়? সুতরাং আমি প্রতিটি মডেল থেকে 'ওজন' আউটপুট চেয়েছিলাম। যাই হোক, এটা একটি খারাপ পন্থা, ভাল এখানে বর্ণনা করা হয়েছে: stackoverflow.com/a/35170149/3633250
মাক্সিম Khaitovich

হ্যাঁ, দুঃখিত আপনি ঠিক বলেছেন! লিঙ্কটি ভাগ করে নেওয়ার জন্য ধন্যবাদ!
হ্যারিসন 4

5

যদি আপনার ডেটাটিতে সুস্পষ্ট উপগ্রহ থাকে তবে আপনি কে-মানেগুলির মতো ক্লাস্টারিং অ্যালগরিদম চালাতে পারেন এবং তারপরে প্রতিটি শ্রেণিবদ্ধকে এটির ক্লাস্টারগুলির সাথে সংযুক্ত করে well যখন কোনও নতুন ডেটা পয়েন্ট আসে, তখন এটি কোন ক্লাস্টারে রয়েছে তা নির্ধারণ করুন এবং সংশ্লিষ্ট শ্রেণিবদ্ধকে চালিত করুন।

আপনি প্রতিটি শ্রেণিবদ্ধের জন্য ওজনের একটি সেট পেতে এবং শ্রেণিবদ্ধের সাথে সমস্ত রৈখিক সংমিশ্রণ ব্যবহার করে ভবিষ্যদ্বাণী করতে সেন্ট্রোড থেকে বিপরীত দূরত্বগুলি ব্যবহার করতে পারেন।


আমি এই রাষ্ট্রের পরীক্ষিত একটি কাগজ পেয়েছি (কিছু অনুরূপ ধারণার তুলনা সহ): কাগজ
অ্যান্টনিবেল

আকর্ষণীয় ধারণা, যদিও এটি সন্তুষ্ট করার জন্য প্রচুর কাজ প্রয়োজন। কাগজের জন্য ধন্যবাদ!
মাকসিম খাইতোভিচ

1

আপনার সমস্ত মডেলগুলি পুরোপুরি প্রশিক্ষণ প্রাপ্ত এবং ভাল সম্পাদন করার পরে আমি নিম্নলিখিতগুলি করে এক ধরণের ওজন অর্জন করি:

  1. আপনার সমস্ত মডেল অদৃশ্য পরীক্ষার ডেটার একটি বিশাল সেটটিতে চালান
  2. প্রতিটি মডেলের জন্য প্রতিটি শ্রেণীর জন্য পরীক্ষার সেটটিতে f1 স্কোর সংরক্ষণ করুন
  3. আপনি যখন সমবেত হয়ে ভবিষ্যদ্বাণী করেন, প্রতিটি মডেল আপনাকে সর্বাধিক সম্ভাব্য শ্রেণি দেয়, সুতরাং সেই ক্লাসের সেই মডেলটির জন্য এফ 1 স্কোরের দ্বারা আত্মবিশ্বাস বা সম্ভাবনাটিকে ওজন করতে হবে। যদি আপনি দূরত্ব নিয়ে কাজ করছেন (উদাহরণস্বরূপ, এসভিএম হিসাবে), একটি সাধারণ আস্থা অর্জনের জন্য কেবল দূরত্বকে স্বাভাবিক করুন এবং তারপরে প্রতি শ্রেণীর F1 ওজন নিয়ে এগিয়ে যান।

কিছু সময়ের জন্য শতাংশের সঠিক পরিমাপ করে আপনি আপনার টিকিটটি আরও সুর করতে পারেন। আপনি যখন উল্লেখযোগ্য পরিমাণে বড়, নতুন ডেটা সেট করেছেন, আপনি 0.1 এর ধাপে থ্রোসোল্ড প্লট করতে পারেন, উদাহরণস্বরূপ, থ্রোসোল্ডটি আপনাকে কী দেবে তার ধারণা পাওয়ার জন্য, শতাংশের তুলনায় সঠিকের তুলনায়, 95% সঠিক ক্লাস 1, এবং আরও জন্য। নতুন ডেটা আসার সাথে সাথে আপনি পরীক্ষা সেট এবং এফ 1 স্কোরগুলি আপডেট করতে এবং প্রবাহের ট্র্যাক রাখতে পারেন, প্রান্তিকতা বা নির্ভুলতা পড়লে মডেলগুলিকে পুনর্নির্মাণ করতে পারেন।


1
এটি আকর্ষণীয়, তবে এটি কেবল শ্রেণিবিন্যাসের জন্য কাজ করে, যতদূর আমি দেখতে পেলাম, যখন আমি রিগ্রেশন টাস্কটি সমাধান করার চেষ্টা করছি। সুতরাং আমি F1 স্কোর গণনা করতে পারবেন না।
মাকসিম খাইতোভিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.