সাইকিট-লার্ন প্রকৃতপক্ষে পদক্ষেপের প্রতিরোধকে সমর্থন করে না। এটি কারণ যেটি সাধারণত 'স্টেপওয়াইজ রিগ্রেশন' নামে পরিচিত তা লিনিয়ার রিগ্রেশন এর সহগের পি-মানের উপর ভিত্তি করে একটি অ্যালগরিদম, এবং সাইকিট-শিখতে ইচ্ছাকৃতভাবে মডেল লার্নিংয়ের (ইনগ্রিটিভ টেস্টিং ইত্যাদি) এড়িয়ে চলেন। তদুপরি, খাঁটি ওএলএস হ'ল অসংখ্য রিগ্রেশন অ্যালগরিদমগুলির মধ্যে একটি এবং বিজ্ঞান-শিখার দৃষ্টিকোণ থেকে এটি খুব গুরুত্বপূর্ণ নয়, একটিও সেরা নয়।
লিনিয়ার মডেলগুলির সাহায্যে বৈশিষ্ট্য নির্বাচনের জন্য যাদের এখনও ভাল উপায়ে প্রয়োজন তাদের জন্য কিছু পরামর্শের টুকরো রয়েছে:
ElasticNet
বা মত মত সহজাত স্পর্শ মডেল ব্যবহার করুন Lasso
।
- এর সাথে আপনার বৈশিষ্ট্যগুলিকে সাধারণ করুন
StandardScaler
এবং তারপরে আপনার বৈশিষ্ট্যগুলি অর্ডার করুন model.coef_
। পুরোপুরি স্বাধীন covariates জন্য এটি পি মান দ্বারা বাছাই সমান। ক্লাসটি sklearn.feature_selection.RFE
এটি আপনার জন্য করবে এবং RFECV
এমনকি বৈশিষ্ট্যগুলির অনুকূল সংখ্যার মূল্যায়ন করবে।
- R2
statsmodels
- ক্রস-বৈধকরণে আপনার প্রিয় মেট্রিককে সর্বাধিক করার জন্য ব্রুটে-ফোর্ড বা পিছিয়ে পড়া নির্বাচন করুন (এটি কোভারিয়েটের সংখ্যায় প্রায় চতুর্ভুজ সময় নিতে পারে)। একটি সাইকিট-লার সামঞ্জস্যপূর্ণ
mlxtend
প্যাকেজটি কোনও প্রাক্কলনকারী এবং কোনও মেট্রিকের জন্য এই পদ্ধতির সমর্থন করে ।
- আপনি যদি এখনও ভ্যানিলা ধাপে ধাপে রিগ্রেশন চান, তবে এটির ভিত্তি করা সহজ
statsmodels
, যেহেতু এই প্যাকেজটি আপনার জন্য পি-মান গণনা করে। একটি মৌলিক ফরোয়ার্ড-পশ্চাদপদ নির্বাচনটি এর মতো দেখতে পারে:
``
from sklearn.datasets import load_boston
import pandas as pd
import numpy as np
import statsmodels.api as sm
data = load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
def stepwise_selection(X, y,
initial_list=[],
threshold_in=0.01,
threshold_out = 0.05,
verbose=True):
""" Perform a forward-backward feature selection
based on p-value from statsmodels.api.OLS
Arguments:
X - pandas.DataFrame with candidate features
y - list-like with the target
initial_list - list of features to start with (column names of X)
threshold_in - include a feature if its p-value < threshold_in
threshold_out - exclude a feature if its p-value > threshold_out
verbose - whether to print the sequence of inclusions and exclusions
Returns: list of selected features
Always set threshold_in < threshold_out to avoid infinite looping.
See https://en.wikipedia.org/wiki/Stepwise_regression for the details
"""
included = list(initial_list)
while True:
changed=False
# forward step
excluded = list(set(X.columns)-set(included))
new_pval = pd.Series(index=excluded)
for new_column in excluded:
model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included+[new_column]]))).fit()
new_pval[new_column] = model.pvalues[new_column]
best_pval = new_pval.min()
if best_pval < threshold_in:
best_feature = new_pval.argmin()
included.append(best_feature)
changed=True
if verbose:
print('Add {:30} with p-value {:.6}'.format(best_feature, best_pval))
# backward step
model = sm.OLS(y, sm.add_constant(pd.DataFrame(X[included]))).fit()
# use all coefs except intercept
pvalues = model.pvalues.iloc[1:]
worst_pval = pvalues.max() # null if pvalues is empty
if worst_pval > threshold_out:
changed=True
worst_feature = pvalues.argmax()
included.remove(worst_feature)
if verbose:
print('Drop {:30} with p-value {:.6}'.format(worst_feature, worst_pval))
if not changed:
break
return included
result = stepwise_selection(X, y)
print('resulting features:')
print(result)
এই উদাহরণটি নিম্নলিখিত আউটপুট মুদ্রণ করবে:
Add LSTAT with p-value 5.0811e-88
Add RM with p-value 3.47226e-27
Add PTRATIO with p-value 1.64466e-14
Add DIS with p-value 1.66847e-05
Add NOX with p-value 5.48815e-08
Add CHAS with p-value 0.000265473
Add B with p-value 0.000771946
Add ZN with p-value 0.00465162
resulting features:
['LSTAT', 'RM', 'PTRATIO', 'DIS', 'NOX', 'CHAS', 'B', 'ZN']