এসজিডিসি ক্লাসিফায়ার: অনলাইন অধ্যয়ন / আংশিক_ফিটটি পূর্বের অজানা লেবেল সহ


9

আমার প্রশিক্ষণ সেটে প্রায় 50 ক প্রবেশিকা রয়েছে যা দিয়ে আমি প্রাথমিক শিক্ষণ করি। সাপ্তাহিক ভিত্তিতে, k 5k এন্ট্রি যুক্ত করা হয়; তবে একই পরিমাণ "অদৃশ্য হয়ে যায়" (এটি ব্যবহারকারীর ডেটা হিসাবে যা কিছু সময়ের পরে মুছতে হবে)।

অতএব আমি অনলাইন শিখন ব্যবহার করি কারণ পরবর্তী সময়ে আমার সম্পূর্ণ ডেটাসেটে অ্যাক্সেস নেই। বর্তমানে আমি একটি ব্যবহার করছি SGDClassifierযা কাজ করে তবে আমার বড় সমস্যা: নতুন বিভাগগুলি প্রদর্শিত হচ্ছে এবং এখন আমি আমার মডেলটি আর ব্যবহার করতে পারছি না কারণ সেগুলি প্রাথমিক ছিল না fit

কোনও উপায় আছে SGDClassifierবা অন্য কোনও মডেলের সাথে? গভীর জ্ঞানার্জন?

আমাকে এখনই স্ক্র্যাচ থেকে শুরু করতে হবে (যেমন SGDClassifier, অন্য কিছু ব্যবহার করুন ) তাতে কিছু আসে যায় না, তবে আমার এমন কিছু জিনিস প্রয়োজন যা নতুন লেবেলগুলির সাহায্যে অনলাইনে শিখতে সক্ষম করে।


1
যখন আপনি বলেন যে আপনার নতুন বিভাগ রয়েছে, আপনি কি আপনার বহির্মুখী ভেরিয়েবলগুলিতে নতুন বিভাগগুলির বিষয়ে কথা বলছেন (ওয়াই) বা আপনার অন্তঃসত্ত্বা ভেরিয়েবলগুলিতে (এক্স)?
জুয়ান এস্তেবান ডি লা কল

উত্তর:


9

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

আপনি প্রতিটি শ্রেণিবদ্ধকে পুনরায় প্রশিক্ষণ না করে এমন কিছু দিয়ে বর্ধিতভাবে ("অনলাইন") প্রশিক্ষণ SGDClassifierদিয়ে যেতে পারেন। যখনই কোনও নতুন বিভাগ প্রদর্শিত হয় আপনি কেবল সেই বিভাগের জন্য একটি নতুন বাইনারি শ্রেণিবদ্ধকারী যুক্ত করুন। তারপরে আপনি ক্লাসিফায়ারগুলির সেটগুলির মধ্যে সর্বাধিক সম্ভাবনা / স্কোর সহ শ্রেণি নির্বাচন করুন।

আপনি আজ যা করছেন তার থেকে এটিও খুব আলাদা নয়, কারণ scikit's SDGClassifierইতিমধ্যে একাধিক "ওয়ান বনাম সমস্ত" শ্রেণিবদ্ধকে হুডের নীচে ফিট করে মাল্টিক্লাস-দৃশ্য পরিচালনা করে।

যদি অনেকগুলি নতুন বিভাগ আসতে থাকে তবে অবশ্যই এই পদ্ধতিটি পরিচালনা করতে কিছুটা জটিল হয়ে উঠতে পারে।


1
চতুর! এই পদ্ধতিটি অন্যান্য সাইকিট ক্লাসিফায়ারগুলির সাথেও warm_startবিকল্প হিসাবে কাজ করতে পারে ।
সাইমন লারসন

5

যদি নতুন বিভাগগুলি খুব কমই আগত হয় তবে আমি নিজে @ ওডাব্লু_আর সরবরাহকৃত "একটি বনাম সমস্ত" সমাধানটি পছন্দ করি । প্রতিটি নতুন বিভাগের জন্য, আপনি নতুন বিভাগ (শ্রেণি 1) থেকে এক্স সংখ্যার নমুনা এবং বাকী বিভাগগুলির (শ্রেণি 0) থেকে এক্স সংখ্যার নমুনা সম্পর্কে একটি নতুন মডেলকে প্রশিক্ষণ দিন।

তবে, যদি নতুন বিভাগগুলি ঘন ঘন আগমন করে এবং আপনি একটি একক ভাগ করা মডেল ব্যবহার করতে চান তবে নিউরাল নেটওয়ার্কগুলি ব্যবহার করে এটি সম্পন্ন করার একটি উপায় রয়েছে।

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

সম্পূর্ণ দৃশ্যের জন্য এখানে একটি বাস্তবায়ন দেওয়া হল:

  1. মডেল দুটি বিভাগে প্রশিক্ষিত হয়,

  2. একটি নতুন বিভাগ আগত,

  3. মডেল এবং লক্ষ্য বিন্যাসগুলি সেই অনুযায়ী আপডেট করা হয়,

  4. মডেল নতুন ডেটা সম্পর্কে প্রশিক্ষিত হয়।

কোড:

from keras import Model
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
from sklearn.metrics import f1_score
import numpy as np


# Add a new node to the last place in Softmax layer
def add_category(model, pre_soft_layer, soft_layer, new_layer_name, random_seed=None):
    weights = model.get_layer(soft_layer).get_weights()
    category_count = len(weights)
    # set 0 weight and negative bias for new category
    # to let softmax output a low value for new category before any training
    # kernel (old + new)
    weights[0] = np.concatenate((weights[0], np.zeros((weights[0].shape[0], 1))), axis=1)
    # bias (old + new)
    weights[1] = np.concatenate((weights[1], [-1]), axis=0)
    # New softmax layer
    softmax_input = model.get_layer(pre_soft_layer).output
    sotfmax = Dense(category_count + 1, activation='softmax', name=new_layer_name)(softmax_input)
    model = Model(inputs=model.input, outputs=sotfmax)
    # Set the weights for the new softmax layer
    model.get_layer(new_layer_name).set_weights(weights)
    return model


# Generate data for the given category sizes and centers
def generate_data(sizes, centers, label_noise=0.01):
    Xs = []
    Ys = []
    category_count = len(sizes)
    indices = range(0, category_count)
    for category_index, size, center in zip(indices, sizes, centers):
        X = np.random.multivariate_normal(center, np.identity(len(center)), size)
        # Smooth [1.0, 0.0, 0.0] to [0.99, 0.005, 0.005]
        y = np.full((size, category_count), fill_value=label_noise/(category_count - 1))
        y[:, category_index] = 1 - label_noise
        Xs.append(X)
        Ys.append(y)
    Xs = np.vstack(Xs)
    Ys = np.vstack(Ys)
    # shuffle data points
    p = np.random.permutation(len(Xs))
    Xs = Xs[p]
    Ys = Ys[p]
    return Xs, Ys


def f1(model, X, y):
    y_true = y.argmax(1)
    y_pred = model.predict(X).argmax(1)
    return f1_score(y_true, y_pred, average='micro')


seed = 12345
verbose = 0
np.random.seed(seed)

model = Sequential()
model.add(Dense(5, input_shape=(2,), activation='tanh', name='pre_soft_layer'))
model.add(Dense(2, input_shape=(2,), activation='softmax', name='soft_layer'))
model.compile(loss='categorical_crossentropy', optimizer=Adam())

# In 2D feature space,
# first category is clustered around (-2, 0),
# second category around (0, 2), and third category around (2, 0)
X, y = generate_data([1000, 1000], [[-2, 0], [0, 2]])
print('y shape:', y.shape)

# Train the model
model.fit(X, y, epochs=10, verbose=verbose)

# Test the model
X_test, y_test = generate_data([200, 200], [[-2, 0], [0, 2]])
print('model f1 on 2 categories:', f1(model, X_test, y_test))

# New (third) category arrives
X, y = generate_data([1000, 1000, 1000], [[-2, 0], [0, 2], [2, 0]])
print('y shape:', y.shape)

# Extend the softmax layer to accommodate the new category
model = add_category(model, 'pre_soft_layer', 'soft_layer', new_layer_name='soft_layer2')
model.compile(loss='categorical_crossentropy', optimizer=Adam())

# Test the extended model before training
X_test, y_test = generate_data([200, 200, 0], [[-2, 0], [0, 2], [2, 0]])
print('extended model f1 on 2 categories before training:', f1(model, X_test, y_test))

# Train the extended model
model.fit(X, y, epochs=10, verbose=verbose)

# Test the extended model on old and new categories separately
X_old, y_old = generate_data([200, 200, 0], [[-2, 0], [0, 2], [2, 0]])
X_new, y_new = generate_data([0, 0, 200], [[-2, 0], [0, 2], [2, 0]])
print('extended model f1 on two (old) categories:', f1(model, X_old, y_old))
print('extended model f1 on new category:', f1(model, X_new, y_new))

কোন ফলাফল:

y shape: (2000, 2)
model f1 on 2 categories: 0.9275
y shape: (3000, 3)
extended model f1 on 2 categories before training: 0.8925
extended model f1 on two (old) categories: 0.88
extended model f1 on new category: 0.91

এই আউটপুট সম্পর্কে আমার দুটি বিষয় ব্যাখ্যা করা উচিত:

  1. মডেল কর্মক্ষমতা থেকে কমেছে 0.9275করতে 0.8925নিছক একটি নতুন নোড যোগ করে। এটি কারণ নতুন নোডের আউটপুটও বিভাগ নির্বাচনের জন্য অন্তর্ভুক্ত। অনুশীলনে, নতুন নোডের আউটপুট কেবলমাত্র আকারের নমুনায় প্রশিক্ষণ দেওয়ার পরে অন্তর্ভুক্ত করা উচিত। উদাহরণস্বরূপ, আমাদের [0.15, 0.30, 0.55]এই পর্যায়ে প্রথম দুটি এন্ট্রি , অর্থাৎ ২ য় শ্রেণীর বৃহত্তম হওয়া উচিত ।

  2. দুটি (পুরানো) বিভাগে বর্ধিত মডেলের পারফরম্যান্স 0.88পুরানো মডেলের চেয়ে কম 0.9275। এটি সাধারণ, কারণ এখন বর্ধিত মডেল দুটিয়ের পরিবর্তে তিনটি বিভাগের একটিতে একটি ইনপুট বরাদ্দ করতে চায়। এই হ্রাস এছাড়াও প্রত্যাশিত যখন আমরা "একটি বনাম সমস্ত" পদ্ধতির দুটি বাইনারি শ্রেণিবদ্ধের তুলনায় তিনটি বাইনারি শ্রেণিবদ্ধ নির্বাচন করি।


1

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

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

দিন এম(এক্স) যেমন একটি মডেল হতে: দেওয়া একটি এক্স, যদি সিদ্ধান্ত নেয় এক্স তিনটি বিভাগের মধ্যে একটিতে অন্তর্ভুক্ত 1,2,3। এর আউটপুটএম সম্ভাবনার একটি ভেক্টর পি। সর্বোচ্চ প্রোব ইন করে সিদ্ধান্ত নেওয়া হয়পি। সুতরাং একটি আউটপুটএম(এক্স)=পি(এক্স)=(0.2,0.76,0.5) সিদ্ধান্তের সাথে মিল রাখে এক্স এর অন্তর্গত 2। আপনি এই সিদ্ধান্তটি একটি সেট করে সংশোধন করতে পারেনτ যেমন যদি কিছুই না পিআমিτ তারপর সিদ্ধান্ত হয় এক্স অজানা শ্রেণীর অন্তর্গত

আপনি কি অজানা সঙ্গে কি করবেন 's bussines যুক্তিবিজ্ঞান উপর নির্ভর করে। যদি সেগুলি গুরুত্বপূর্ণ হয়, আপনি সেগুলির একটি পুল তৈরি করতে এবং উপলভ্য ডেটা ব্যবহার করে মডেলটিকে পুনরায় প্রশিক্ষণ দিতে পারেন। আমি মনে করি আপনি আউটপুটটির মাত্রা পরিবর্তন করে প্রশিক্ষিত মডেল থেকে "ট্রান্সফার লার্নিং" করতে পারেন। তবে এটি এমন কিছু যা আমি মুখোমুখি হই নি, তাই আমি কেবল বলছি

গণনা করা যে SGDClassifier ব্যবহারসমূহ SVMনীচে, যা না সম্ভাব্য অ্যালগরিদম। নিম্নলিখিত SGDClassifierডকুমেন্টেশন আপনি সম্ভাব্য আউটপুট পেতে বা lossযুক্তি যুক্তি পরিবর্তন করতে পারেন ।modified_huberlog


0

দুটি বিকল্প রয়েছে:

  1. কোনও অজানা বা unkবিভাগ সম্পর্কিত কোনও ডেটাপয়েন্টের সুযোগের পূর্বাভাস দিন । প্রবাহে প্রদর্শিত যে কোনও নতুন বিভাগগুলির পূর্বাভাস দেওয়া উচিত unk। এটি প্রাকৃতিক ভাষা প্রসেসিং (এনএলপি) এ সাধারণ কারণ শব্দ স্রোতে সর্বদা নতুন শব্দ টোকেন উপস্থিত থাকে।

  2. প্রতিবার কোনও নতুন বিভাগ উপস্থিত হলে মডেলটিকে পুনরায় প্রশিক্ষণ দিন।

যেহেতু আপনি উল্লেখ করেছেন SGDClassifier, আমি আপনাকে বিজ্ঞান-শিখার ব্যবহার অনুমান করি। সাইকিট-লার্ন খুব ভাল অনলাইন লার্নিংকে সমর্থন করে না। স্ট্রিমিং এবং অনলাইন লার্নিং যেমন স্পার্কের পক্ষে আরও ভাল সমর্থন করে এমন একটি ফ্রেমওয়ার্ক স্যুইচ করা ভাল ।

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