পাইথনে কীভাবে পদ্ধতিতে কলিনারি ভেরিয়েবলগুলি মুছবেন? [বন্ধ]


18

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

আমার কাছে একটি পান্ডাস ডেটা ফ্রেমের মধ্যে আমার ডেটা রয়েছে এবং আমি স্ক্লারনের মডেলগুলি ব্যবহার করছি।


3
আপনি আংশিক ন্যূনতম স্কোয়্যারস রিগ্রেশন বা প্রিন্সিপাল উপাদানগুলি রিগ্রেশন বিবেচনা করতে চাইতে পারেন। এর মধ্যে একটি সম্ভবত সমর্থিত।
spdrnl

আমি দেখি. সুতরাং যদি আমি সঠিকভাবে বুঝতে পারি, পিসিএ চালানো তখন আমাকে স্বাধীন প্রধান উপাদানগুলির একটি সেট দেবে, যা আমি তখন আমার মডেলটির জন্য কোভারিয়েট হিসাবে ব্যবহার করতে পারি, যেহেতু মূল উপাদানগুলির প্রতিটি অন্যের সাথে কলিনিয়ার নয়?
কমলা

2
যথাযথভাবে। কিছু উপাদান অপ্রাসঙ্গিক পরিণত হতে পারে। এটি ভেরিয়েবল বাদ দেওয়ার চেয়ে সহজ।
spdrnl

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

1
সেক্ষেত্রে এটি সহায়ক হয় না কারণ উপাদানগুলি ব্যাখ্যা করা কিছুটা অন্ধকার শিল্প।
spdrnl

উত্তর:


13

ধন্যবাদ স্প্যানিশবয় - এটি কোডের একটি ভাল অংশ। @ আইলানম্যান: এটি ভিআইএফের মানগুলি পরীক্ষা করে এবং তারপরে ভেরিয়েবলগুলি ড্রপ করে যার ভিএফ 5 এর চেয়ে বেশি হয় "" পারফরম্যান্স "দ্বারা, আমি মনে করি তার রান সময় মানে means উপরের কোডটি প্রায় 300 চলক, 5000 সারিতে চালাতে আমার প্রায় 3 ঘন্টা সময় নিয়েছিল।

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

from statsmodels.stats.outliers_influence import variance_inflation_factor    

def calculate_vif_(X, thresh=5.0):
    variables = list(range(X.shape[1]))
    dropped = True
    while dropped:
        dropped = False
        vif = [variance_inflation_factor(X.iloc[:, variables].values, ix)
               for ix in range(X.iloc[:, variables].shape[1])]

        maxloc = vif.index(max(vif))
        if max(vif) > thresh:
            print('dropping \'' + X.iloc[:, variables].columns[maxloc] +
                  '\' at index: ' + str(maxloc))
            del variables[maxloc]
            dropped = True

    print('Remaining variables:')
    print(X.columns[variables])
    return X.iloc[:, variables]

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

1
এই পদ্ধতির সম্পর্কে আমার একটি প্রশ্ন আছে। ধরা যাক যে আমাদের এ, বি এবং সি বৈশিষ্ট্য রয়েছে। এ সি এর সাথে সম্পর্কযুক্ত যদি আপনি বৈশিষ্ট্যগুলি লুপ করেন তবে এ এবং সি এর ভিআইএফ> 5 থাকবে, সুতরাং সেগুলি বাদ দেওয়া হবে। বাস্তবে, প্রতিবার কোনও বৈশিষ্ট্য বাদ দেওয়ার পরে আপনার ভিআইএফ-কে পুনরায় গণনা করা উচিত নয়। আমার উদাহরণে আপনি এ এবং সি উভয়ই ফেলেছেন তবে আপনি যদি এআই বাদ পড়ার পরে ভিআইএফ (সি) গণনা করেন তবে> 5 হবে না
তিতাস পুলো

3

আপনি নীচের কোড ব্যবহার করতে পারেন:

from statsmodels.stats.outliers_influence import variance_inflation_factor

def calculate_vif_(X):

    '''X - pandas dataframe'''
    thresh = 5.0
    variables = range(X.shape[1])

    for i in np.arange(0, len(variables)):
        vif = [variance_inflation_factor(X[variables].values, ix) for ix in range(X[variables].shape[1])]
        print(vif)
        maxloc = vif.index(max(vif))
        if max(vif) > thresh:
            print('dropping \'' + X[variables].columns[maxloc] + '\' at index: ' + str(maxloc))
            del variables[maxloc]

    print('Remaining variables:')
    print(X.columns[variables])
    return X

এটি কাজ করে, তবে আমি সেই পদ্ধতির অভিনয় পছন্দ করি না


এই পদ্ধতিটি কী করে আপনি কি আরও কিছু মন্তব্য করতে চান? এবং কেন আপনি অভিনয় পছন্দ করেন না?
ইলানমান

2

আমি স্প্যানিশবয়ের উত্তরটি চেষ্টা করেছিলাম এবং এটি ডেটা-ফ্রেমের জন্য চালানোর সময় সার্ভাল ত্রুটিগুলি পেয়েছি। এখানে একটি ডিবাগড সমাধান।

from statsmodels.stats.outliers_influence import variance_inflation_factor    

def calculate_vif_(X, thresh=100):
cols = X.columns
variables = np.arange(X.shape[1])
dropped=True
while dropped:
    dropped=False
    c = X[cols[variables]].values
    vif = [variance_inflation_factor(c, ix) for ix in np.arange(c.shape[1])]

    maxloc = vif.index(max(vif))
    if max(vif) > thresh:
        print('dropping \'' + X[cols[variables]].columns[maxloc] + '\' at index: ' + str(maxloc))
        variables = np.delete(variables, maxloc)
        dropped=True

print('Remaining variables:')
print(X.columns[variables])
return X[cols[variables]]

পারফরম্যান্স নিয়ে আমারও সমস্যা ছিল না, তবে এটি ব্যাপকভাবে পরীক্ষা করা হয়নি।


এটি দুর্দান্ত এবং আমার জন্য কাজ করে। বাদে, এটি অশুভ সতর্কতাটি ফেরত দেয়:RuntimeWarning: divide by zero encountered in double_scalars
ব্যবহারকারী 2205916
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.