মেশিন লার্নিংয়ে ডেটা হারিয়ে যাওয়ার সমস্যাটি ঘিরে কাজ করার পদ্ধতি


15

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

এই সমস্যাটি মোকাবেলার জন্য বিভিন্ন পন্থা রয়েছে, লাইনগুলি বাদ না দেওয়া পর্যন্ত যেগুলি বৈশিষ্ট্যের গড় মানগুলি পূরণ না করে অবধি মানগুলি রয়েছে।

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

তবে এটি আমাকে কিছুটা সন্দেহ দেয়।

কেন কোন কলাম শুরু? আমি বিশ্বাস করি যে সবচেয়ে ক্ষুদ্রতম মূল্যবোধের সাথে একটি সবচেয়ে বেশি রয়েছে until

অনুপস্থিত মানগুলির কোনও থ্রেশহোল্ড রয়েছে যা এটি সম্পূর্ণ করার চেষ্টা করার মতো নয়? (উদাহরণস্বরূপ, যদি এই বৈশিষ্ট্যটিতে 10% ভরাট মান থাকে তবে এটি বাদ দেওয়া কি আরও আকর্ষণীয় হবে না)

Traditionalতিহ্যবাহী প্যাকেজগুলিতে বা অন্যান্য পদ্ধতিতে কোনও ধরণের বাস্তবায়ন কি মিসিং থেকে শক্ত?


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

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

আধুনিক একাধিক অভিব্যক্তি পাশের পাশাপাশি অদৃশ্য এবং অনুপস্থিত ডাটাগুলির জন্য একটি মডেল অনুমান করে। বায়েশিয়ান নিখোঁজ তথ্য গ্রহণ করে নিখোঁজ হওয়া তথ্যের উপর বিতরণ, পর্যবেক্ষণ করা তথ্যের উপর শর্তাধীন এবং নিখোঁজ হওয়ার মডেল। পাইথনে স্ট্যাটিস্টিকাল সফ্টওয়্যারটি পছন্দসই হওয়ার জন্য অনেক কিছু ছেড়ে দেয়। টিএসসিএস ডেটার জন্য, Amelia IIআর এ একটি কঠিন পছন্দ। অথবা আপনি নিজের ব্যবহার করে রোল করতে পারেন stan
সাইকোরাক্স মনিকাকে

উত্তর:


9

আপনি যে কৌশলটি বর্ণনা করেছেন তাকে ক্রমবর্ধমান রেগ্রেশন বা শৃঙ্খলিত সমীকরণের দ্বারা একাধিক অনুদানের দ্বারা অভিবাসন বলা হয়। এই কৌশলটি রঘুনাথন (2001) দ্বারা পরিচালিত হয়েছিল এবং mice(ভ্যান বুউরেন, 2012) নামে একটি ভাল কাজ করা আর প্যাকেজে প্রয়োগ করা হয়েছিল ।

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

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

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

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


রঘুনাথন, টিই, লেপকোভস্কি, জে।, ভ্যান হোয়াইক, জে।, এবং সোলেনবার্গার, পি। (2001)। রিগ্রেশন মডেলগুলির সিকোয়েন্স ব্যবহার করে অনুপস্থিত মানগুলিকে গুণিত করার জন্য বহুবিধ কৌশল। জরিপ পদ্ধতি, 27 (1), 85-95।

স্ক্যাফার, জেএল, এবং গ্রাহাম, জেডাব্লু (2002)। হারিয়ে যাওয়া ডেটা: শিল্পের অবস্থা সম্পর্কে আমাদের দৃষ্টিভঙ্গি। মনস্তাত্ত্বিক পদ্ধতি, 7 (2), 147–177। https://doi.org/10.1037/1082-989X.7.2.147

ভ্যান বুউরেন, এস। (2012) হারিয়ে যাওয়া তথ্যের নমনীয় প্রতিদান Imp বোকা রেটন: সিআরসি প্রেস।


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

1
@ sn3fru ঠিক আছে, এই প্রশ্নগুলির উত্তরগুলি অন্যান্য জায়গাগুলির মধ্যে উল্লেখ করা হয়েছে। পাইথনের বাস্তবায়ন উপস্থিত থাকলে আমি অবগত নই, তবে এটির অনুলিপি করা খুব বেশি কঠিন হওয়া উচিত নয়। আমি মনে করি এটির জন্য অ্যালগরিদমের বিবরণটি কিছুটা অধ্যয়ন করতে হবে। সাধারণভাবে কোনও বায়েশিয়ান মডেল একাধিক অভিঘাত তৈরি করতে ব্যবহার করা যেতে পারে, তবে miceআলগোরিদিম হয় রিগ্রেশন বা ভবিষ্যদ্বাণীমূলক গড় মেলানো ব্যবহার করে। আপনি প্রথমে পর্যবেক্ষণ বিতরণ থেকে অঙ্কন করে অনুপস্থিত ডেটাটি সম্পূর্ণ করুন এবং তারপরে ক্রমানুসারে গুনাহান করুন। একবার শেষ হয়ে গেলে আপনি পুনরাবৃত্তি করুন, তবে সদ্য অভিযুক্ত মানগুলি ব্যবহার করে। নতুন ডেটা অংশ নিয়েছে, হ্যাঁ
টোমকা

4

আমার সমস্যার সমাধান করার মতো কিছুই আমি পাইনি তাই আমি একটি ফাংশন লিখেছিলাম যা একটি পান্ডাস ডাটাফ্রেমের সাথে কিছু সংখ্যার সমাধান মিশ্রিত সংখ্যাসূচক মানের সাথে (অভিনবভাবে) এবং শ্রেণিবদ্ধ (একটি এলোমেলো বনের সাথে) মিশ্রিত করে।

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
import fancyimpute as fi

def separe_numeric_categoric(df):
    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
    df_n = df.select_dtypes(include=numerics)
    df_c = df.select_dtypes(exclude=numerics)
    print(f'The DF have {len(list(df_n))} numerical features and {len(list(df_c))} categorical fets')
    return df_n, df_c


def find_missing(df):
    total = df.isnull().sum().sort_values(ascending=False)
    percent = (df.isnull().sum()/df.isnull().count()).sort_values(ascending=False)
    filter(lambda x: x>=minimum, percent)
    return percent


def count_missing(df):
    missing = find_missing(df)
    total_columns_with_missing = 0
    for i in (missing):
        if i>0:
            total_columns_with_missing += 1
    return total_columns_with_missing


def remove_missing_data(df,minimum=.1):
    percent = find_missing(df)
    number = len(list(filter(lambda x: x>=(1.0-minimum), percent)))
    names = list(percent.keys()[:number])
    df = df.drop(names, 1, errors='ignore')
    print(f'{number} columns exclude because haven`t minimium data.')
    return df


def one_hot(df, cols):
    for each in cols:
        dummies = pd.get_dummies(df[each], prefix=each, drop_first=False)
        df = pd.concat([df, dummies], axis=1)
    df = df.drop(cols, axis=1)
    return df



def impute_missing_data(df,minimium_data=.1):
    columns_missing = count_missing(df)
    print(f'Total columns with missing values: {count_missing(df)} of a {len(list(df))} columns in df')

    # remove features without minimium size of information
    df = remove_missing_data(df,minimium_data)

    numerical_df, categorical_df = separe_numeric_categoric(df)

    # Autocomplete using MICE for numerical features.
    try:
        df_numerical_complete = fi.MICE(verbose=False).complete(numerical_df.values)
        n_missing = count_missing(df)
        print(f'{columns_missing-n_missing} numerical features imputated')

        # Complete the columns name.
        temp = pd.DataFrame(columns=numerical_df.columns, data=df_numerical_complete)

        # df temp com os dados numericos completados e os categóricos.
        df = pd.concat([temp, categorical_df], axis=1)

    except Exception as e:
        print(e)
        print('Without Missing data in numerical features')

    missing = find_missing(df)
    names = missing.keys()
    n = 0
    for i, c in enumerate(missing):
        if c > 0:
            col = names[i]
            print(f'Start the prediction of {col}')
            clf = RandomForestClassifier()
            le = LabelEncoder()
            ## inverter a ordem da predição das categóricas pode melhorar a precisao.
            categorical_train = list(categorical_df.loc[:,categorical_df.columns != col])

            temp = one_hot(df,categorical_train)
            df1 = temp[temp[col].notnull()]
            df2 = temp[temp[col].isnull()]
            df1_x = df1.loc[:, df1.columns != col]
            df2_x = df2.loc[:, df1.columns != col]

            df1_y = df1[col]
            le.fit(df1_y)
            df1_y = le.transform(df1_y)
            clf.fit(df1_x, df1_y)
            df2_yHat = clf.predict(df2_x)
            df2_yHat = le.inverse_transform(df2_yHat)
            df2_yHat = pd.DataFrame(data=df2_yHat, columns=[col])
            df1_y = le.inverse_transform(df1_y)
            df1_y = pd.DataFrame(data=df1_y,columns=[col])

            df2_x.reset_index(inplace=True)   
            result2 = pd.concat([df2_yHat, df2_x], axis=1)
            try:
                del result2['index']
            except:
                pass

            df1_x.reset_index(inplace=True)
            result1 = pd.concat([df1_y, df1_x], axis=1)
            try:
                del result1['index']
            except:
                pass

            result = pd.concat([result1, result2])
            result = result.set_index(['Id'])
            df.reset_index()            
            try:
                df.set_index(['Id'],inplace=True)
            except:
                pass
            df[col] = result[col]

            n += 1

    print(f'Number of columns categorical with missing data solved: {n}')

    return df


df = impute_missing_data(df)

সুন্দর, এটি অন্যকে সাহায্য করতে পারে (আমি এটি চেক করিনি) - Rফাংশনের স্রষ্টা miceস্টেফ ভ্যান বুউরেনের সাথে যোগাযোগ করা আপনার পক্ষে আকর্ষণীয়ও হতে পারে । তিনি আপনার পাইথন কোডে আগ্রহী এবং / বা আপনাকে এই বিষয়ে অন্যান্য লোকের কাজের দিকে নির্দেশ করতে পারেন। stefvanbuuren.nl
tomka

আমি জানি না যে তারা এত সহজ কিছুতে আগ্রহী হবে কিনা, আমি কেবল এখানে ভাগ করছি কারণ এটি অন্যান্য লোককে পান্ডসের ডেটাফ্রেমে হারিয়ে যাওয়া সমাধানের প্রয়োজন হতে পারে।
sn3fru

ঠিক আছে, তারা পাইথনটিতে এটি সাধারণভাবে প্রয়োগ করতে আগ্রহী এবং তারা হয়ত জানে যে কেউ ইতিমধ্যে এটি করেছে কিনা। আমি এর আগে স্টিফের সাথে যোগাযোগ করেছি এবং তিনি খুব প্রতিক্রিয়াশীল এবং সহায়ক। যদি পাইথন বাস্তবায়ন হয় তবে এটি এখানে এই থ্রেডের নীচে ভাগ করে নেওয়া দরকারী useful উদাহরণস্বরূপ দেখুন pypi.python.org/pypi/fancyimpute/0.0.4
tomka

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.