গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে

উত্স নোড: 2021431

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে
একটি গাউসিয়ান নিষ্পাপ বেইস শ্রেণীবিভাগের সিদ্ধান্ত অঞ্চল। লেখক দ্বারা ছবি.

 

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

এই নিবন্ধে, আপনি শিখতে পারেন

  • নিষ্পাপ বেইস ক্লাসিফায়ারগুলি কীভাবে কাজ করে,
  • কেন এটা বোধগম্য হয় তাদের সংজ্ঞায়িত উপায় তারা এবং
  • NumPy ব্যবহার করে কিভাবে পাইথনে তাদের বাস্তবায়ন করবেন।

আপনি কোড খুঁজে পেতে পারেন আমার Github.

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

আমরা নিষ্পাপ বেইস শ্রেণীবিভাগের আশ্চর্যজনকভাবে সহজ তত্ত্বটি অন্বেষণ শুরু করব এবং তারপরে বাস্তবায়নের দিকে ফিরে যাব।

শ্রেণীবিভাগ করার সময় আমরা আসলে কি আগ্রহী? আমরা আসলে কি করছি, ইনপুট এবং আউটপুট কি? উত্তর সহজ:

একটি ডাটা পয়েন্ট x দেওয়া হয়েছে, কিছু ক্লাস c এর অন্তর্গত x এর সম্ভাব্যতা কত?

যে সব আমরা সঙ্গে উত্তর চাই কোন শ্রেণীবিভাগ আপনি এই বিবৃতিটিকে একটি শর্তাধীন সম্ভাব্যতা হিসাবে সরাসরি মডেল করতে পারেন: p(c|x).

উদাহরণস্বরূপ, যদি থাকে

  • 3 ক্লাস c₁c₂c₃, এবং
  • 2টি বৈশিষ্ট্য নিয়ে গঠিত x₁x₂,

একটি শ্রেণিবিন্যাসকারীর ফলাফল এরকম কিছু হতে পারে p(c₁|x₁x₂)=0.3, p(c₂|x₁x₂)=0.5 এবং p(c₃|x₁x₂)=0.2। আমরা যদি আউটপুট হিসাবে একটি একক লেবেলের যত্ন নিই, তাহলে আমরা সর্বোচ্চ সম্ভাব্যতা সহ একটিকে বেছে নেব, অর্থাৎ c₂ এখানে 50% সম্ভাবনা আছে।

নিষ্পাপ Bayes ক্লাসিফায়ার এই সম্ভাব্যতাগুলি সরাসরি গণনা করার চেষ্টা করে।

নাইভ বয়েস

ঠিক আছে, তাই একটি তথ্য পয়েন্ট দেওয়া x, আমরা গণনা করতে চাই p(c|x) সব শ্রেণীর জন্য এবং তারপর আউটপুট c সর্বোচ্চ সম্ভাবনা সহ। সূত্রে আপনি প্রায়ই এটি দেখতে পান

 

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে
লেখক দ্বারা ছবি.

 

বিঃদ্রঃ: সর্বোচ্চ p(c|x) argmax এর সময় সর্বাধিক সম্ভাব্যতা প্রদান করে p(c|x) ফেরত দেয় c এই সর্বোচ্চ সম্ভাবনা সঙ্গে.

কিন্তু তার আগে আমরা অপ্টিমাইজ করতে পারি p(c|x), আমাদের এটি গণনা করতে সক্ষম হতে হবে। এই জন্য, আমরা ব্যবহার করি বেইসের উপপাদ্য:

 

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে
বেইস উপপাদ্য। লেখক দ্বারা ছবি.

 

এটি নিষ্পাপ Bayes এর Bayes অংশ. কিন্তু এখন, আমরা নিম্নলিখিত সমস্যা আছে: কি p(x|c) এবং p(c)?

এই একটি নিষ্পাপ Bayes ক্লাসিফায়ার প্রশিক্ষণ কি সব সম্পর্কে.

প্রশিক্ষণ

সবকিছু ব্যাখ্যা করার জন্য, এর সাথে একটি খেলনা ডেটাসেট ব্যবহার করা যাক দুটি বাস্তব বৈশিষ্ট্য x₁x₂, এবং তিনটি ক্লাস c₁c₂c₃ নিম্নলিখিত

 

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে
তথ্য, ভিজ্যুয়ালাইজড. লেখক দ্বারা ছবি.

 

আপনি এর মাধ্যমে এই সঠিক ডেটাসেট তৈরি করতে পারেন

from sklearn.datasets import make_blobs X, y = make_blobs(n_samples=20, centers=[(0,0), (5,5), (-5, 5)], random_state=0)

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

লেবেলযুক্ত 7 পয়েন্টের মধ্যে 20টি ক্লাস রয়েছে c₁ (নীল) ডেটাসেটে, তাই আমরা বলি p(c₁)=7/20। আমাদের ক্লাসের জন্য 7 পয়েন্ট আছে c₂ (লাল) পাশাপাশি, তাই আমরা সেট করি p(c₂)=7/20। শেষ ক্লাস c₃ (হলুদ) এর মাত্র 6 পয়েন্ট আছে, তাই p(c₃)=6/20।

শ্রেণী সম্ভাব্যতার এই সহজ গণনা একটি সর্বাধিক সম্ভাবনা পদ্ধতির অনুরূপ। তবে আপনি অন্যটিও ব্যবহার করতে পারেন পূর্বে বিতরণ, যদি আপনি চান। উদাহরণস্বরূপ, যদি আপনি জানেন যে এই ডেটাসেটটি প্রকৃত জনসংখ্যার প্রতিনিধি নয় কারণ বর্গ c₃ 50% ক্ষেত্রে উপস্থিত হওয়া উচিত, তারপর আপনি সেট করুন p(c₁)=0.25, p(c₂)=0.25 এবং p(c₃)=0.5। যাই হোক না কেন আপনাকে পরীক্ষার সেটে পারফরম্যান্স উন্নত করতে সহায়তা করে।

আমরা এখন চালু সম্ভাবনা p(x|c)=p(x₁x₂|c) এই সম্ভাবনা গণনা করার একটি পদ্ধতি হল লেবেল সহ নমুনার জন্য ডেটাসেট ফিল্টার করা এবং তারপর একটি ডিস্ট্রিবিউশন খুঁজে বের করার চেষ্টা করুন (যেমন একটি 2-মাত্রিক গাউসিয়ান) যা বৈশিষ্ট্যগুলি ক্যাপচার করে x₁x₂.

দুর্ভাগ্যবশত, সাধারণত, সম্ভাব্যতার সঠিক অনুমান করার জন্য আমাদের কাছে ক্লাস প্রতি পর্যাপ্ত নমুনা নেই।

আরও শক্তিশালী মডেল তৈরি করতে সক্ষম হওয়ার জন্য, আমরা তৈরি করি নিষ্পাপ অনুমান যে বৈশিষ্ট্য x₁x₂ হয় স্টোকাস্টিকভাবে স্বাধীনদেওয়া হয়েছে c. এটি গণিতকে সহজ করার একটি অভিনব উপায়

 

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে
লেখক দ্বারা ছবি

 

প্রতিটি ক্লাসের জন্য c। এই যেখানে সাদাসিধা নিষ্পাপ Bayes অংশ থেকে আসে কারণ এই সমীকরণ সাধারণভাবে রাখা হয় না. তবুও, তারপরও সাদামাটা বেইস ভাল ফল দেয়, কখনও কখনও অনুশীলনে অসামান্য ফলাফল দেয়। বিশেষ করে ব্যাগ-অফ-শব্দ বৈশিষ্ট্যগুলির সাথে এনএলপি সমস্যাগুলির জন্য, বহুপদী নিষ্পাপ বেইস উজ্জ্বল।

উপরে প্রদত্ত আর্গুমেন্ট আপনি খুঁজে পেতে পারেন যেকোন নিষ্পাপ Bayes ক্লাসিফায়ার জন্য একই. এখন এটা নির্ভর করে আপনি কিভাবে মডেল করবেন তার উপর p(x₁|c₁), p(x₂|c₁), p(x₁|c₂), p(x₂|c₂), p(x₁|c₃) এবং p(x₂|c₃).

যদি আপনার বৈশিষ্ট্যগুলি শুধুমাত্র 0 এবং 1 হয়, আপনি একটি ব্যবহার করতে পারেন বার্নোলি বিতরণ. যদি তারা পূর্ণসংখ্যা হয়, a বহুপদ বন্টন. যাইহোক, আমাদের বাস্তব বৈশিষ্ট্য মান আছে এবং একটি জন্য সিদ্ধান্ত গসিয়ান ডিস্ট্রিবিউশন, তাই নাম গাউসিয়ান নেভ বেইস। আমরা নিম্নলিখিত ফর্ম অনুমান

 

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে
লেখক দ্বারা ছবি.

 

কোথায় μᵢ,ⱼ গড় এবং σᵢ,ⱼ স্ট্যান্ডার্ড বিচ্যুতি যা আমাদের ডেটা থেকে অনুমান করতে হবে। এর মানে হল যে আমরা প্রতিটি বৈশিষ্ট্যের জন্য একটি গড় পাই i একটি ক্লাস সঙ্গে মিলিত cⱼ, আমাদের ক্ষেত্রে 2*3=6 মানে। একই মান বিচ্যুতি জন্য যায়. এই একটি উদাহরণ জন্য কল.

আসুন আমরা অনুমান করার চেষ্টা করি μ₂,₁ এবং σ₂,₁। কারণ j=1, আমরা শুধুমাত্র ক্লাসে আগ্রহী c₁, আমাদের শুধুমাত্র এই লেবেল সঙ্গে নমুনা রাখা যাক. নিম্নলিখিত নমুনা অবশিষ্ট আছে:

# samples with label = c_1 array([[ 0.14404357, 1.45427351], [ 0.97873798, 2.2408932 ], [ 1.86755799, -0.97727788], [ 1.76405235, 0.40015721], [ 0.76103773, 0.12167502], [-0.10321885, 0.4105985 ], [ 0.95008842, -0.15135721]])

এখন, কারণ i=2 আমাদের শুধুমাত্র দ্বিতীয় কলামটি বিবেচনা করতে হবে। μ₂,₁ হল গড় এবং σ₂,₁ এই কলামের জন্য আদর্শ বিচ্যুতি, যেমন μ₂,₁ = 0.49985176 এবং σ₂,₁ = ০.৯৭৮৯৯৭৬।

আপনি যদি উপরে থেকে স্ক্যাটার প্লটটি আবার দেখেন তবে এই সংখ্যাগুলি বোঝা যায়। বৈশিষ্ট্য x₂ ক্লাস থেকে নমুনা c₁ 0.5 এর কাছাকাছি, আপনি ছবিটি থেকে দেখতে পাচ্ছেন।

আমরা এখন অন্য পাঁচটি সংমিশ্রণের জন্য এটি গণনা করি এবং আমাদের কাজ শেষ!

পাইথনে, আপনি এটি এভাবে করতে পারেন:

from sklearn.datasets import make_blobs
import numpy as np # Create the data. The classes are c_1=0, c_2=1 and c_3=2.
X, y = make_blobs( n_samples=20, centers=[(0, 0), (5, 5), (-5, 5)], random_state=0
) # The class probabilities.
# np.bincounts counts the occurence of each label.
prior = np.bincount(y) / len(y) # np.where(y==i) returns all indices where the y==i.
# This is the filtering step.
means = np.array([X[np.where(y == i)].mean(axis=0) for i in range(3)])
stds = np.array([X[np.where(y == i)].std(axis=0) for i in range(3)])

আমরা গ্রহণ

# priors
array([0.35, 0.35, 0.3 ])
# means array([[ 0.90889988, 0.49985176], [ 5.4111385 , 4.6491892 ], [-4.7841679 , 5.15385848]])
# stds
array([[0.6853714 , 0.9789976 ], [1.40218915, 0.67078568], [0.88192625, 1.12879666]])

এটি একটি গাউসিয়ান নেভ বেইস ক্লাসিফায়ারের প্রশিক্ষণের ফলাফল।

ভবিষ্যদ্বাণী করা

সম্পূর্ণ ভবিষ্যদ্বাণী সূত্র হল

 

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে
লেখক দ্বারা ছবি.

 

এর একটি নতুন ডেটা পয়েন্ট অনুমান করা যাক x*=(-2, 5) আসে।

 

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে
লেখক দ্বারা ছবি.

 

এটি কোন শ্রেণীর অন্তর্গত তা দেখতে, আসুন গণনা করি p(c|x*) সব শ্রেণীর জন্য। ছবি থেকে, এটি ক্লাসের অন্তর্গত হওয়া উচিত c₃ = 2, তবে দেখা যাক। আমাদের হর উপেক্ষা করা যাক p(x) এক সেকেন্ডের জন্য. নিম্নলিখিত লুপ ব্যবহার করে মনোনীতদের গণনা করা হয়েছে j = 1, 2, 3।

x_new = np.array([-2, 5]) for j in range(3): print( f"Probability for class {j}: {(1/np.sqrt(2*np.pi*stds[j]**2)*np.exp(-0.5*((x_new-means[j])/stds[j])**2)).prod()*p[j]:.12f}" )

আমরা গ্রহণ

Probability for class 0: 0.000000000263
Probability for class 1: 0.000000044359
Probability for class 2: 0.000325643718

অবশ্যই, এই সম্ভাবনা (আমাদের সেভাবে বলা উচিত নয়) যেহেতু আমরা হরকে উপেক্ষা করেছি তাই একটিতে যোগ করবেন না। যাইহোক, এটি কোন সমস্যা নয় যেহেতু আমরা কেবল এই অস্বাভাবিক সম্ভাবনাগুলি নিতে পারি এবং তাদের যোগফল দিয়ে ভাগ করতে পারি, তারপর তারা একটি যোগ করবে। সুতরাং, এই তিনটি মানকে তাদের সমষ্টি 0.00032569 দ্বারা ভাগ করলে আমরা পাই

 

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে
লেখক দ্বারা ছবি.

 

একটি পরিষ্কার বিজয়ী, যেমন আমরা আশা করি। এখন, আমাদের এটি বাস্তবায়ন করা যাক!

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

শুধু মনে রাখবেন যে আমি একটি বাস্তবায়ন করেছি predict_proba সম্ভাব্যতা গণনা করার পদ্ধতি প্রথম। পদ্ধতি predict শুধু এই পদ্ধতিটি কল করে এবং একটি আর্গম্যাক্স ফাংশন ব্যবহার করে সর্বোচ্চ সম্ভাবনা সহ সূচক (=শ্রেণী) ফেরত দেয় (এটি আবার আছে!)। ক্লাস 0 থেকে ক্লাসের জন্য অপেক্ষা করছে k-1, কোথায় k ক্লাসের সংখ্যা।

import numpy as np
from sklearn.base import BaseEstimator, ClassifierMixin
from sklearn.utils.validation import check_X_y, check_array, check_is_fitted class GaussianNaiveBayesClassifier(BaseEstimator, ClassifierMixin): def fit(self, X, y): X, y = check_X_y(X, y) self.priors_ = np.bincount(y) / len(y) self.n_classes_ = np.max(y) + 1 self.means_ = np.array( [X[np.where(y == i)].mean(axis=0) for i in range(self.n_classes_)] ) self.stds_ = np.array( [X[np.where(y == i)].std(axis=0) for i in range(self.n_classes_)] ) return self def predict_proba(self, X): check_is_fitted(self) X = check_array(X) res = [] for i in range(len(X)): probas = [] for j in range(self.n_classes_): probas.append( ( 1 / np.sqrt(2 * np.pi * self.stds_[j] ** 2) * np.exp(-0.5 * ((X[i] - self.means_[j]) / self.stds_[j]) ** 2) ).prod() * self.priors_[j] ) probas = np.array(probas) res.append(probas / probas.sum()) return np.array(res) def predict(self, X): check_is_fitted(self) X = check_array(X) res = self.predict_proba(X) return res.argmax(axis=1)

বাস্তবায়ন পরীক্ষা

কোডটি বেশ সংক্ষিপ্ত হলেও আমরা কোন ভুল করিনি তা সম্পূর্ণরূপে নিশ্চিত হতে এখনও অনেক দীর্ঘ। সুতরাং, আসুন এটির বিপরীতে ভাড়া কীভাবে তা পরীক্ষা করে দেখুন scikit-learn GaussianNB ক্লাসিফায়ার.

my_gauss = GaussianNaiveBayesClassifier()
my_gauss.fit(X, y)
my_gauss.predict_proba([[-2, 5], [0,0], [6, -0.3]])

আউটপুট

array([[8.06313823e-07, 1.36201957e-04, 9.99862992e-01], [1.00000000e+00, 4.23258691e-14, 1.92051255e-11], [4.30879705e-01, 5.69120295e-01, 9.66618838e-27]])

ভবিষ্যদ্বাণী ব্যবহার করে predict পদ্ধতি হল

# my_gauss.predict([[-2, 5], [0,0], [6, -0.3]])
array([2, 0, 1])

এখন, স্কিট-লার্ন ব্যবহার করা যাক। কিছু কোড নিক্ষেপ

from sklearn.naive_bayes import GaussianNB gnb = GaussianNB()
gnb.fit(X, y)
gnb.predict_proba([[-2, 5], [0,0], [6, -0.3]])

উৎপাদনের

array([[8.06314158e-07, 1.36201959e-04, 9.99862992e-01], [1.00000000e+00, 4.23259111e-14, 1.92051343e-11], [4.30879698e-01, 5.69120302e-01, 9.66619630e-27]])

সংখ্যাগুলো দেখতে অনেকটা আমাদের শ্রেণীবদ্ধকারীর মতই, কিন্তু শেষ কয়েকটি প্রদর্শিত সংখ্যার মধ্যে সেগুলি কিছুটা কম। আমরা কি কিছু ভুল করেছি? না. স্কিট-লার্ন সংস্করণটি কেবলমাত্র আরেকটি হাইপারপ্যারামিটার ব্যবহার করে var_smoothing=1e-09 . যদি আমরা এই এক সেট শূন্য, আমরা ঠিক আমাদের সংখ্যা পেতে. নিখুঁত!

আমাদের শ্রেণীবিভাগের সিদ্ধান্তের অঞ্চলগুলি দেখুন। আমরা পরীক্ষার জন্য যে তিনটি পয়েন্ট ব্যবহার করেছি তাও আমি চিহ্নিত করেছি। সীমান্তের কাছাকাছি একটি পয়েন্টে লাল শ্রেণীর অন্তর্ভুক্ত হওয়ার সুযোগ মাত্র 56.9% আছে, যেমন আপনি দেখতে পাচ্ছেন predict_proba আউটপুট অন্য দুটি পয়েন্ট অনেক উচ্চ আত্মবিশ্বাস সঙ্গে শ্রেণীবদ্ধ করা হয়.

 

গাউসিয়ান নেভ বেইস, ব্যাখ্যা করা হয়েছে

এই সিদ্ধান্তে ৩টি নতুন পয়েন্ট নিয়ে অঞ্চল। লেখক দ্বারা ছবি.

 

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

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

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

 
 
ডঃ রবার্ট কুবলার পাবলিসিস মিডিয়ার একজন ডেটা সায়েন্টিস্ট এবং টুওয়ার্ডস ডেটা সায়েন্সের লেখক৷

 
মূল। অনুমতি নিয়ে পোস্ট করা।
 

সময় স্ট্যাম্প:

থেকে আরো কেডনুগেটস

KDnuggets™ সংবাদ 21:n39, অক্টোবর 13:8 ডেটা বিজ্ঞানীদের জন্য গিট কমান্ড থাকতে হবে; ডেটা সায়েন্সের জন্য কোর্সেরার উপর 38টি বিনামূল্যের কোর্স

উত্স নোড: 1181299
সময় স্ট্যাম্প: অক্টোবর 13, 2021