1. আপনি শুরু করার আগে
আপনি ভাবতে পারেন যে সামগ্রিক পরিসংখ্যান ব্যক্তিদের সম্পর্কে কোন তথ্য ফাঁস করে না যাদের সাথে তারা সম্পর্কিত। যাইহোক, এমন অনেক উপায় আছে যাতে একজন আক্রমণকারী সামগ্রিক পরিসংখ্যান থেকে ব্যক্তি সম্পর্কে সংবেদনশীল তথ্য জানতে পারে।
এই কোডল্যাবে, আপনি ব্যক্তিদের গোপনীয়তা রক্ষা করার জন্য পাইপলাইনডিপি থেকে পৃথকভাবে ব্যক্তিগত সমষ্টি সহ ব্যক্তিগত পরিসংখ্যান তৈরি করতে শিখবেন। PipelineDP হল একটি Python ফ্রেমওয়ার্ক যা আপনাকে Apache Spark এবং Apache Beam- এর মতো ব্যাচ-প্রসেসিং সিস্টেম সহ বড় ডেটাসেটে ডিফারেনশিয়াল গোপনীয়তা প্রয়োগ করতে দেয়। Go- তে কীভাবে আলাদাভাবে ব্যক্তিগত পরিসংখ্যান গণনা করা যায় সে সম্পর্কে আরও তথ্যের জন্য, Beam কোডল্যাবে গোপনীয়তা দেখুন।
প্রাইভেট মানে আউটপুট এমনভাবে উত্পাদিত হয় যা ডেটাতে থাকা ব্যক্তিদের সম্পর্কে কোনো ব্যক্তিগত তথ্য ফাঁস করে না। আপনি ডিফারেনশিয়াল গোপনীয়তার মাধ্যমে এই ফলাফল অর্জন করতে পারেন, বেনামীকরণের একটি শক্তিশালী গোপনীয়তা ধারণা, যা ব্যবহারকারীর গোপনীয়তা রক্ষা করার জন্য একাধিক ব্যবহারকারী জুড়ে ডেটা একত্রিত করার প্রক্রিয়া। সমস্ত বেনামী পদ্ধতি একত্রিতকরণ ব্যবহার করে, কিন্তু সমস্ত একত্রীকরণ পদ্ধতি বেনামীকরণ অর্জন করে না। অন্যদিকে, ডিফারেনশিয়াল গোপনীয়তা তথ্য ফাঁস এবং গোপনীয়তা সম্পর্কে পরিমাপযোগ্য গ্যারান্টি প্রদান করে।
পূর্বশর্ত
- পাইথনের সাথে পরিচিতি
- মৌলিক ডেটা একত্রিতকরণের সাথে পরিচিতি
- পান্ডা, স্পার্ক এবং বিমের সাথে অভিজ্ঞতা
আপনি কি শিখবেন
- ডিফারেনশিয়াল গোপনীয়তার মূল বিষয়
- পাইপলাইনডিপির সাথে কীভাবে আলাদাভাবে ব্যক্তিগত সারাংশের পরিসংখ্যান গণনা করা যায়
- অতিরিক্ত গোপনীয়তা এবং ইউটিলিটি পরামিতি সহ আপনার ফলাফলগুলিকে কীভাবে পরিবর্তন করবেন
আপনি কি প্রয়োজন হবে
- আপনি যদি নিজের পরিবেশে কোডল্যাব চালাতে চান, তাহলে আপনার কম্পিউটারে পাইথন 3.7 বা উচ্চতর ইনস্টল করা দরকার।
- আপনি যদি নিজের পরিবেশ ছাড়াই কোডল্যাব অনুসরণ করতে চান, তাহলে আপনার Colaboratory- তে অ্যাক্সেস প্রয়োজন।
2. ডিফারেনশিয়াল গোপনীয়তা বুঝুন
ডিফারেনশিয়াল গোপনীয়তা আরও ভালভাবে বুঝতে, এই সাধারণ উদাহরণটি দেখুন।
কল্পনা করুন যে আপনি একটি অনলাইন ফ্যাশন খুচরা বিক্রেতার বিপণন বিভাগে কাজ করেন এবং আপনি বুঝতে চান আপনার কোন পণ্য বিক্রি হওয়ার সম্ভাবনা সবচেয়ে বেশি।
এই চার্টটি দেখায় যে গ্রাহকরা দোকানের ওয়েবসাইট পরিদর্শন করার সময় প্রথমে কোন পণ্যগুলি দেখেছিলেন: টি-শার্ট, জাম্পার, মোজা বা জিন্স৷ টি-শার্ট সবচেয়ে জনপ্রিয় আইটেম যখন মোজা সবচেয়ে কম জনপ্রিয় আইটেম।
এটি দরকারী দেখায়, কিন্তু একটি ক্যাচ আছে. আপনি যখন অতিরিক্ত তথ্য বিবেচনা করতে চান, যেমন গ্রাহকরা কোন কেনাকাটা করেছেন কিনা বা কোন পণ্য তারা দ্বিতীয়বার দেখেছেন, আপনি আপনার ডেটাতে ব্যক্তিদের প্রকাশ করার ঝুঁকি নিয়ে থাকেন।
এই চার্টটি আপনাকে দেখায় যে শুধুমাত্র একজন গ্রাহক প্রথমে একটি জাম্পার দেখেছেন এবং তারপর আসলে একটি ক্রয় করেছেন:
এটি একটি গোপনীয়তা দৃষ্টিকোণ থেকে মহান নয়. বেনামী পরিসংখ্যান ব্যক্তিগত অবদান প্রকাশ করা উচিত নয়, তাই আপনি কি করবেন? আপনি তাদের একটু কম নির্ভুল করতে আপনার বার চার্টে এলোমেলো শব্দ যোগ করুন!
এই বার চার্টটি সম্পূর্ণরূপে সঠিক নয়, তবে এটি এখনও দরকারী এবং এটি ব্যক্তিগত অবদান প্রকাশ করে না:
ডিফারেনশিয়াল গোপনীয়তা হল পৃথক অবদানগুলিকে মুখোশ করার জন্য সঠিক পরিমাণে এলোমেলো শব্দ যোগ করা।
এই উদাহরণটি অতি সরলীকৃত। ডিফারেনশিয়াল গোপনীয়তার সঠিক বাস্তবায়ন আরও জড়িত এবং অপ্রত্যাশিত বাস্তবায়নের সূক্ষ্মতার সাথে আসে। ক্রিপ্টোগ্রাফির অনুরূপ, ডিফারেনশিয়াল গোপনীয়তার আপনার নিজস্ব বাস্তবায়ন তৈরি করা একটি দুর্দান্ত ধারণা নাও হতে পারে। পরিবর্তে, আপনি PipelineDP ব্যবহার করতে পারেন।
3. PipelineDP ডাউনলোড এবং ইনস্টল করুন
আপনাকে PipelineDP ইনস্টল করার দরকার নেই এই কোডল্যাব অনুসরণ করুন কারণ আপনি এই নথিতে সমস্ত প্রাসঙ্গিক কোড এবং গ্রাফ খুঁজে পেতে পারেন।
PipelineDP এর সাথে খেলতে, এটি নিজে চালান, অথবা পরে ব্যবহার করুন:
- পাইপলাইনডিপি ডাউনলোড এবং ইনস্টল করুন:
pip install pipeline-dp
আপনি যদি Apache Beam ব্যবহার করে উদাহরণটি চালাতে চান:
- Apache Beam ডাউনলোড এবং ইনস্টল করুন:
pip install apache_beam
আপনি PipelineDP/examples/codelab/
ডিরেক্টরিতে এই কোডল্যাব এবং ডেটাসেটের কোড খুঁজে পেতে পারেন।
4. প্রথম দেখা পণ্য প্রতি রূপান্তর মেট্রিক্স গণনা করুন
কল্পনা করুন যে আপনি একটি অনলাইন ফ্যাশন খুচরা বিক্রেতার সাথে কাজ করেন এবং আপনি বুঝতে চান যে আপনার বিভিন্ন পণ্য বিভাগের মধ্যে কোনটি প্রথম দেখা হলে রূপান্তরগুলির সর্বোচ্চ সংখ্যা এবং মান উৎপন্ন করে৷ আপনি এই তথ্যটি আপনার বিপণন সংস্থার পাশাপাশি অন্যান্য অভ্যন্তরীণ দলগুলির সাথে ভাগ করতে চান, তবে আপনি যেকোন পৃথক গ্রাহকের তথ্য ফাঁস প্রতিরোধ করতে চান৷
ওয়েবসাইটের জন্য দেখা প্রথম পণ্য প্রতি রূপান্তর মেট্রিক্স গণনা করতে:
-
PipelineDP/examples/codelab/
ডিরেক্টরিতে আপনার ওয়েবসাইটে ভিজিটের মক ডেটাসেট পর্যালোচনা করুন।
এই স্ক্রিনশটটি ডেটাসেটের একটি উদাহরণ। এতে ব্যবহারকারীর আইডি, ব্যবহারকারী যে পণ্যগুলি দেখেছেন, ভিজিটর রূপান্তর করেছেন কিনা এবং, যদি তাই হয়, রূপান্তরের মান রয়েছে৷
user_id | পণ্য_দর্শন_0 | পণ্য_দর্শন_1 | পণ্য_দর্শন_2 | পণ্য_দর্শন_3 | পণ্য_দর্শন_4 | আছে_রূপান্তর | রূপান্তর_মূল্য |
0 | জিন্স | টি_শার্ট | টি_শার্ট | কোনটি | কোনটি | মিথ্যা | 0.0 |
1 | জিন্স | টি_শার্ট | জিন্স | জাম্পার | কোনটি | মিথ্যা | 0.0 |
2 | টি_শার্ট | জাম্পার | টি_শার্ট | টি_শার্ট | কোনটি | সত্য | 105.19 |
3 | টি_শার্ট | টি_শার্ট | জিন্স | কোনটি | কোনটি | মিথ্যা | 0.0 |
4 | টি_শার্ট | মোজা | জিন্স | জিন্স | কোনটি | মিথ্যা | 0.0 |
আপনি এই মেট্রিক্সে আগ্রহী:
-
view_counts
: আপনার ওয়েবসাইটের দর্শকরা যতবার প্রতিটি পণ্য প্রথম দেখেন। -
total_conversion_value
: দর্শকরা রূপান্তর করার সময় যে পরিমাণ অর্থ ব্যয় করে। -
conversion_rate
: দর্শকরা যে হারে রূপান্তর করে।
- একটি অ-ব্যক্তিগত উপায়ে মেট্রিক্স তৈরি করুন:
conversion_metrics = df.groupby(['product_view_0'
])[['conversion_value', 'has_conversion']].agg({
'conversion_value': [len, np.sum],
'has_conversion': np.mean
})
conversion_metrics = conversion_metrics.rename(
columns={
'len': 'view_counts',
'sum': 'total_conversion_value',
'mean': 'conversion_rate'
}).droplevel(
0, axis=1)
যেমন আপনি আগে শিখেছেন, এই পরিসংখ্যানগুলি আপনার ডেটাসেটে থাকা ব্যক্তিদের সম্পর্কে তথ্য প্রকাশ করতে পারে। উদাহরণস্বরূপ, একজন ব্যক্তি প্রথমে একটি জাম্পার দেখার পরে শুধুমাত্র একজন ব্যক্তি ধর্মান্তরিত হয়েছেন। 22 বার দেখার জন্য, আপনার রূপান্তর হার প্রায় 0.05। এখন আপনাকে প্রতিটি বার চার্টকে একটি ব্যক্তিগত রূপে রূপান্তর করতে হবে।
-
pipeline_dp.NaiveBudgetAccountant
ক্লাসের সাথে আপনার গোপনীয়তার পরামিতিগুলি সংজ্ঞায়িত করুন এবং তারপরে আপনার বিশ্লেষণের জন্য যেepsilon
এবংdelta
আর্গুমেন্টগুলি ব্যবহার করতে চান তা নির্দিষ্ট করুন৷
আপনি কিভাবে এই আর্গুমেন্ট সেট আপনার নির্দিষ্ট সমস্যার উপর নির্ভর করে. তাদের সম্পর্কে আরও জানতে, ঐচ্ছিক দেখুন: ডিফারেনশিয়াল-প্রাইভেসি প্যারামিটারগুলিকে টুইক করুন।
এই কোড স্নিপেট উদাহরণ মান ব্যবহার করে:
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
total_epsilon=1, total_delta=1e-5)
-
LocalBackend
উদাহরণ শুরু করুন:
ops = pipeline_dp.LocalBackend()
আপনি LocalBackend
দৃষ্টান্ত ব্যবহার করতে পারেন কারণ আপনি এই প্রোগ্রামটিকে স্থানীয়ভাবে অতিরিক্ত ফ্রেমওয়ার্ক ছাড়াই চালান, যেমন বিম বা স্পার্ক।
-
DPEngine
ইনস্ট্যান্স শুরু করুন:
dp_engine = pipeline_dp.DPEngine(budget_accountant, ops)
PipelineDP আপনাকে pipeline_dp.AggregateParams
ক্লাসের মাধ্যমে আরও পরামিতি নির্দিষ্ট করতে দেয়, যা আপনার ব্যক্তিগত পরিসংখ্যানের প্রজন্মকে প্রভাবিত করে।
params = pipeline_dp.AggregateParams(
noise_kind=pipeline_dp.NoiseKind.LAPLACE,
metrics=[pipeline_dp.Metrics.COUNT],
max_partitions_contributed=1,
max_contributions_per_partition=1)
- নির্দিষ্ট করুন যে আপনি
count
মেট্রিক গণনা করতে চান এবংLAPLACE
শব্দ বিতরণ ব্যবহার করতে চান। -
max_partitions_contributed
আর্গুমেন্টটিকে1
মানতে সেট করুন।
এই যুক্তি একটি ব্যবহারকারী অবদান করতে পারেন কত বিভিন্ন ভিজিট সীমাবদ্ধ. আপনি আশা করেন যে ব্যবহারকারীরা প্রতিদিন একবার ওয়েবসাইটটি ভিজিট করবে এবং তারা দিনে একাধিকবার এটি পরিদর্শন করে কিনা তা আপনি চিন্তা করবেন না।
-
max_contributions_per_partitions
আর্গুমেন্ট একটি1
মান সেট করুন।
এই যুক্তিটি নির্দিষ্ট করে যে একজন একক দর্শক এই ক্ষেত্রে একটি পৃথক পার্টিশন বা একটি পণ্য বিভাগে কতগুলি অবদান রাখতে পারে।
- একটি
data_extractor
উদাহরণ তৈরি করুন যা নির্দিষ্ট করে যেprivacy_id
,partition
, এবংvalue
ক্ষেত্রগুলি কোথায় পাবেন৷
আপনার কোড এই কোড স্নিপেটের মত হওয়া উচিত:
def run_pipeline(data, ops):
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
total_epsilon=1, total_delta=1e-5)
dp_engine = pipeline_dp.DPEngine(budget_accountant, ops)
params = pipeline_dp.AggregateParams(
noise_kind=pipeline_dp.NoiseKind.LAPLACE,
metrics=[pipeline_dp.Metrics.COUNT],
max_partitions_contributed=1, # A single user can only contribute to one partition.
max_contributions_per_partition=1, # For a single partition, only one contribution per user is used.
)
data_extractors = pipeline_dp.DataExtractors(
privacy_id_extractor=lambda row: row.user_id,
partition_extractor=lambda row: row.product_view_0
value_extractor=lambda row: row.has_conversion)
dp_result = dp_engine.aggregate(data, params, data_extractors)
budget_accountant.compute_budgets()
return dp_result
- আপনার পান্ডাস ডেটাফ্রেমকে সারিগুলির একটি তালিকায় রূপান্তর করতে এই কোডটি যুক্ত করুন যেখান থেকে আপনি সরাসরি পৃথকভাবে ব্যক্তিগত পরিসংখ্যান গণনা করতে পারেন:
rows = [index_row[1] for index_row in df.iterrows()]
dp_result_local = run_pipeline(rows, ops) # Returns generator
list(dp_result_local)
অভিনন্দন! আপনি আপনার প্রথম ভিন্নভাবে ব্যক্তিগত পরিসংখ্যান গণনা করেছেন!
এই চার্টটি আপনার পূর্বে গণনা করা অ-ব্যক্তিগত গণনার পাশে আপনার পৃথকভাবে ব্যক্তিগত গণনার ফলাফল দেখায়:
আপনি কোড চালানোর সময় যে বার চার্টটি পাবেন তা এর থেকে আলাদা হতে পারে, যা ঠিক আছে। ডিফারেনশিয়াল প্রাইভেসির গোলমালের কারণে, আপনি প্রতিবার কোড চালানোর সময় একটি ভিন্ন বার চার্ট পাবেন, কিন্তু আপনি দেখতে পাচ্ছেন যে সেগুলি আসল নন-প্রাইভেট বার চার্টের মতো।
অনুগ্রহ করে মনে রাখবেন যে গোপনীয়তা গ্যারান্টির জন্য গোপনীয়তার গ্যারান্টির জন্য একাধিকবার পাইপলাইন চালানো না করা খুবই গুরুত্বপূর্ণ। আরও তথ্যের জন্য, একাধিক পরিসংখ্যান গণনা দেখুন।
5. পাবলিক পার্টিশন ব্যবহার করুন
পূর্ববর্তী বিভাগে, আপনি হয়তো লক্ষ্য করেছেন যে আপনি একটি পার্টিশনের জন্য সমস্ত ভিজিট ডেটা ফেলে দিয়েছেন, যেমন দর্শক যারা আপনার ওয়েবসাইটে প্রথম মোজা দেখেছিল।
এটি পার্টিশন নির্বাচন বা থ্রেশহোল্ডিংয়ের কারণে, যখন আউটপুট পার্টিশনের অস্তিত্ব ব্যবহারকারীর ডেটার উপর নির্ভর করে তখন ডিফারেনশিয়াল-গোপনীয়তা গ্যারান্টি নিশ্চিত করার একটি গুরুত্বপূর্ণ পদক্ষেপ। যখন এটি হয়, আউটপুটে একটি পার্টিশনের নিছক অস্তিত্ব ডেটাতে একটি পৃথক ব্যবহারকারীর অস্তিত্বকে ফাঁস করতে পারে। কেন এটি গোপনীয়তা লঙ্ঘন করে সে সম্পর্কে আরও জানতে, এই ব্লগ পোস্টটি দেখুন। এই গোপনীয়তা লঙ্ঘন প্রতিরোধ করার জন্য, PipelineDP শুধুমাত্র পর্যাপ্ত সংখ্যক ব্যবহারকারীর সাথে পার্টিশন রাখে।
যখন আউটপুট পার্টিশনের তালিকা ব্যক্তিগত ব্যবহারকারীর ডেটার উপর নির্ভর করে না, তখন আপনার এই পার্টিশন-নির্বাচনের পদক্ষেপের প্রয়োজন নেই। এটি আসলে আপনার উদাহরণের ক্ষেত্রে কারণ আপনি সমস্ত সম্ভাব্য পণ্য বিভাগ জানেন যা একজন গ্রাহক প্রথমে দেখতে পারে।
পার্টিশন ব্যবহার করতে:
- আপনার সম্ভাব্য পার্টিশনগুলির একটি তালিকা তৈরি করুন:
public_partitions_products = ['jeans', 'jumper', 'socks', 't-shirt']
- তালিকাটি
run_pipeline()
ফাংশনে পাস করুন, যা এটিকেpipeline_dp.AggregateParams
ক্লাসে একটি অতিরিক্ত ইনপুট হিসাবে সেট করে:
run_pipeline(
rows, ops, total_delta=0, public_partitions=public_partitions_products)
# Returns generator
params = pipeline_dp.AggregateParams(
noise_kind=pipeline_dp.NoiseKind.LAPLACE,
metrics=[pipeline_dp.Metrics.COUNT],
max_partitions_contributed=1,
max_contributions_per_partition=1,
public_partitions=public_partitions_products)
আপনি যদি পাবলিক পার্টিশন এবং LAPLACE
নয়েজ ব্যবহার করেন, তাহলে total_delta
আর্গুমেন্টকে 0
মান নির্ধারণ করা সম্ভব।
এখন আপনি ফলাফলে দেখতে পাচ্ছেন যে সমস্ত পার্টিশন বা পণ্যের ডেটা রিপোর্ট করা হয়েছে।
শুধুমাত্র পাবলিক পার্টিশনগুলি আপনাকে আরও পার্টিশন রাখতে দেয় না, তবে তারা মোটামুটি অর্ধেক শব্দও যোগ করে কারণ আপনি পার্টিশন নির্বাচনের জন্য কোনও গোপনীয়তা বাজেট ব্যয় করেন না, তাই আগের রানের তুলনায় কাঁচা এবং ব্যক্তিগত গণনার মধ্যে পার্থক্য সামান্য কম।
আপনি যখন পাবলিক পার্টিশন ব্যবহার করবেন তখন দুটি গুরুত্বপূর্ণ বিষয় মাথায় রাখতে হবে:
- অপরিশোধিত তথ্য থেকে পার্টিশনের তালিকা বের করার সময় সতর্ক থাকুন। আপনি যদি আলাদাভাবে ব্যক্তিগতভাবে এটি না করেন, তাহলে আপনার পাইপলাইন আর ডিফারেনশিয়াল গোপনীয়তার গ্যারান্টি প্রদান করে না। আরও তথ্যের জন্য, অ্যাডভান্সড দেখুন: ডেটা থেকে পার্টিশন আহরণ করুন।
- যদি কিছু পাবলিক পার্টিশনের জন্য কোন ডেটা না থাকে, তাহলে ডিফারেনশিয়াল গোপনীয়তা রক্ষা করার জন্য আপনাকে সেই পার্টিশনগুলিতে শব্দ প্রয়োগ করতে হবে। উদাহরণস্বরূপ, আপনি যদি ট্রাউজার্সের মতো একটি অতিরিক্ত পণ্য ব্যবহার করেন, যেটি আপনার ডেটাসেটে বা আপনার ওয়েবসাইটে দেখা যায় না, তবে এটি এখনও আওয়াজ করে এবং ফলাফলগুলি পণ্যগুলিতে কিছু পরিদর্শন দেখাতে পারে যখন কিছুই ছিল না।
উন্নত: ডেটা থেকে পার্টিশন আহরণ করুন
আপনি যদি একই পাইপলাইনে অ-পাবলিক আউটপুট পার্টিশনের একই তালিকার সাথে একাধিক একত্রীকরণ চালান, আপনি dp_engine.select_private_partitions()
পদ্ধতির মাধ্যমে একবার পার্টিশনের তালিকা পেতে পারেন এবং public_partitions
ইনপুট হিসাবে প্রতিটি একত্রিতকরণে পার্টিশন সরবরাহ করতে পারেন। এটি শুধুমাত্র গোপনীয়তার দৃষ্টিকোণ থেকে নিরাপদ নয়, তবে এটি আপনাকে কম শব্দ যোগ করতে দেয় কারণ আপনি সম্পূর্ণ পাইপলাইনের জন্য শুধুমাত্র একবার পার্টিশন নির্বাচনের গোপনীয়তা বাজেট ব্যবহার করেন।
def get_private_product_views(data, ops):
"""Obtains the list of product_views in a private manner.
This does not calculate any private metrics; it merely obtains the list of
product_views but does so while making sure the result is differentially private.
"""
# Set the total privacy budget.
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
total_epsilon=1, total_delta=1e-5)
# Create a DPEngine instance.
dp_engine = pipeline_dp.DPEngine(budget_accountant, ops)
# Specify how to extract privacy_id, partition_key, and value from a
# single element.
data_extractors = pipeline_dp.DataExtractors(
partition_extractor=lambda row: row.product_view_0,
privacy_id_extractor=lambda row: row.user_id)
# Run aggregation.
dp_result = dp_engine.select_partitions(
data, pipeline_dp.SelectPrivatePartitionsParams(
max_partitions_contributed=1),
data_extractors=data_extractors)
budget_accountant.compute_budgets()
return dp_result
6. একাধিক পরিসংখ্যান গণনা করুন
এখন যেহেতু আপনি জানেন যে পাইপলাইনডিপি কীভাবে কাজ করে, আপনি আরও কিছু উন্নত ব্যবহারের ক্ষেত্রে কীভাবে এটি ব্যবহার করতে পারেন তা দেখতে পারেন। শুরুতে উল্লিখিত হিসাবে, আপনি তিনটি পরিসংখ্যানে আগ্রহী। PipelineDP আপনাকে একই সময়ে একাধিক পরিসংখ্যান গণনা করতে দেয় যতক্ষণ না তারা AggregateParams
দৃষ্টান্তে একই পরামিতি ভাগ করে, যা আপনি পরে দেখতে পান। একযোগে একাধিক মেট্রিক্স গণনা করা কেবল পরিষ্কার এবং সহজ নয়, এটি গোপনীয়তার ক্ষেত্রেও আরও ভাল।
আপনি যদি NaiveBudgetAccountant
ক্লাসে যে epsilon
এবং delta
প্যারামিটারগুলি সরবরাহ করেন সেগুলি মনে রাখলে, তারা একটি গোপনীয়তা বাজেট নামে কিছু উপস্থাপন করে, যা ব্যবহারকারীর গোপনীয়তার পরিমাণের পরিমাপ যা আপনি ডেটা থেকে ফাঁস করেন।
গোপনীয়তা বাজেট সম্পর্কে মনে রাখা একটি গুরুত্বপূর্ণ বিষয় হল এটি সংযোজন। আপনি যদি একটি নির্দিষ্ট epsilon ε এবং delta δ দিয়ে একটি পাইপলাইন একবার চালান, তাহলে আপনি একটি (ε,δ) বাজেট ব্যয় করবেন। আপনি যদি এটি দ্বিতীয়বার চালান, তাহলে আপনি মোট বাজেট (2ε, 2δ) ব্যয় করেন। একইভাবে, আপনি যদি একটি NaiveBudgetAccountant
পদ্ধতিতে একাধিক পরিসংখ্যান গণনা করেন এবং ধারাবাহিকভাবে ε,δ এর একটি গোপনীয়তা বাজেট করেন, তাহলে আপনি মোট বাজেট (2ε, 2δ) ব্যয় করেন। এর মানে হল যে আপনি গোপনীয়তার গ্যারান্টি ক্ষুন্ন করেছেন।
এটিকে এড়াতে, আপনাকে মোট বাজেটের সাথে একটি একক NaiveBudgetAccountant
উদাহরণ ব্যবহার করতে হবে যা আপনি ব্যবহার করতে চান যখন আপনাকে একই ডেটাতে একাধিক পরিসংখ্যান গণনা করতে হবে। তারপরে আপনাকে epsilon
এবং delta
মানগুলি নির্দিষ্ট করতে হবে যা আপনি প্রতিটি সমষ্টির জন্য ব্যবহার করতে চান। শেষ পর্যন্ত, আপনি একই সামগ্রিক গোপনীয়তার গ্যারান্টি দিয়ে শেষ করবেন, তবে একটি নির্দিষ্ট একত্রিতকরণের উচ্চতর epsilon
এবং delta
মানগুলির উচ্চতর নির্ভুলতা রয়েছে।
এটি কর্মে দেখতে, আপনি count
, mean
, এবং sum
পরিসংখ্যান গণনা করতে পারেন৷
আপনি দুটি ভিন্ন মেট্রিকের উপরে পরিসংখ্যান গণনা করেন: একটি conversion_value
মেট্রিক, যা আপনি কোন পণ্যটি প্রথম দেখা হয়েছে তার উপর ভিত্তি করে উৎপন্ন আয়ের পরিমাণ অনুমান করতে ব্যবহার করেন এবং একটি has_conversion
মেট্রিক, যা আপনি আপনার ওয়েবসাইটের দর্শকের সংখ্যা গণনা করতে ব্যবহার করেন এবং গড় রূপান্তর হার।
প্রতিটি মেট্রিকের জন্য, আপনাকে পৃথকভাবে প্যারামিটারগুলি নির্দিষ্ট করতে হবে যা ব্যক্তিগত পরিসংখ্যানের গণনাকে গাইড করে। আপনি আপনার গোপনীয়তা বাজেট দুটি মেট্রিক্স জুড়ে বিভক্ত করেছেন। আপনি has_conversion
মেট্রিক থেকে দুটি পরিসংখ্যান গণনা করেন, তাই আপনি এটিকে আপনার প্রাথমিক বাজেটের দুই-তৃতীয়াংশ বরাদ্দ করতে চান এবং অন্য এক-তৃতীয়াংশ conversion_value
মেট্রিকে বরাদ্দ করতে চান।
একাধিক পরিসংখ্যান গণনা করতে:
- আপনি তিনটি পরিসংখ্যান জুড়ে ব্যবহার করতে চান এমন মোট
epsilon
এবংdelta
মানগুলির সাথে আপনার গোপনীয়তা বাজেট অ্যাকাউন্টেন্ট সেট আপ করুন:
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
total_epsilon=1, total_delta=0)
- আপনার মেট্রিক্স গণনা করতে
DPEngine
শুরু করুন:
dp_engine = pipeline_dp.DPEngine(budget_accountant, ops)
- এই মেট্রিকের জন্য পরামিতি নির্দিষ্ট করুন।
params_conversion_value_metrics = pipeline_dp.AggregateParams(
noise_kind=pipeline_dp.NoiseKind.LAPLACE,
metrics=[pipeline_dp.Metrics.SUM],
max_partitions_contributed=1,
max_contributions_per_partition=1,
min_value=0,
max_value=100,
public_partitions=public_partitions,
budget_weight=1/3)
শেষ যুক্তিটি ঐচ্ছিকভাবে আপনার গোপনীয়তা বাজেটের ওজন নির্দিষ্ট করে। আপনি সবাইকে একই ওজন দিতে পারেন, কিন্তু আপনি এই যুক্তিটিকে এক তৃতীয়াংশে সেট করতে চান যেমনটি আগে ব্যাখ্যা করা হয়েছে।
আপনি একটি min_value
এবং max_value
আর্গুমেন্টও সেট করেছেন একটি পার্টিশনে গোপনীয়তার একটি ইউনিট দ্বারা অবদানকৃত একটি মানতে প্রয়োগ করা নিম্ন এবং উপরের সীমা নির্দিষ্ট করার জন্য। আপনি যখন একটি ব্যক্তিগত যোগফল বা গড় গণনা করতে চান তখন এই পরামিতিগুলির প্রয়োজন হয়৷ আপনি নেতিবাচক মান আশা করেন না, তাই আপনি 0
এবং 100
যুক্তিসঙ্গত সীমা হিসাবে ধরে নিতে পারেন।
- প্রাসঙ্গিক ডেটা বের করুন এবং তারপরে এটি একত্রিতকরণ ফাংশনে পাস করুন:
data_extractors_conversion_value_metrics = pipeline_dp.DataExtractors(
privacy_id_extractor=lambda row: row.user_id,
partition_extractor=lambda row: row.product_view_0,
value_extractor=lambda row: row.conversion_value)
dp_result_conversion_value_metrics = (
dp_engine.aggregate(data, params_conversion_value_metrics,
data_extractors_conversion_value_metrics))
- আপনার
has_conversion
ভেরিয়েবলের উপর ভিত্তি করে দুটি মেট্রিক গণনা করতে একই পদক্ষেপগুলি অনুসরণ করুন:
params_conversion_rate_metrics = pipeline_dp.AggregateParams(
noise_kind=pipeline_dp.NoiseKind.LAPLACE,
metrics=[pipeline_dp.Metrics.COUNT, pipeline_dp.Metrics.MEAN],
max_partitions_contributed=1,
max_contributions_per_partition=1,
min_value=0,
max_value=1,
public_partitions=public_partitions,
budget_weight=2/3)
data_extractors_conversion_rate_metrics = pipeline_dp.DataExtractors(
privacy_id_extractor=lambda row: row.user_id,
partition_extractor=lambda row: row.product_view_0,
value_extractor=lambda row: row.has_conversion)
dp_result_conversion_rate_metrics = (
dp_engine.aggregate(data, params_conversion_rate_metrics,
data_extractors_conversion_rate_metrics))
একমাত্র পরিবর্তন হল pipeline_dp.AggregateParams
দৃষ্টান্তে, যেখানে আপনি এখন mean
সংজ্ঞায়িত করেন এবং সমষ্টি হিসাবে count
এবং এই গণনার জন্য আপনার গোপনীয়তা বাজেটের দুই-তৃতীয়াংশ বরাদ্দ করেন। যেহেতু আপনি উভয় পরিসংখ্যানের জন্য একই অবদানের সীমা রাখতে চান এবং একই has_conversion
ভেরিয়েবলের উপরে সেগুলি গণনা করতে চান, আপনি সেগুলিকে একই pipeline_dp.AggregateParams
উদাহরণে একত্রিত করতে পারেন এবং একই সময়ে তাদের গণনা করতে পারেন৷
-
budget_accountant.compute_budgets()
পদ্ধতিতে কল করুন:
budget_accountant.compute_budgets()
আপনি তিনটি ব্যক্তিগত পরিসংখ্যানকে তাদের মূল পরিসংখ্যানের তুলনায় প্লট করতে পারেন। যোগ করা গোলমালের উপর নির্ভর করে, আপনি দেখতে পাচ্ছেন যে ফলাফলগুলি প্রকৃতপক্ষে যুক্তিসঙ্গত স্কেলের বাইরে পড়তে পারে। এই উদাহরণে, আপনি জাম্পারদের জন্য একটি নেতিবাচক রূপান্তর হার এবং মোট রূপান্তর মান দেখতে পাচ্ছেন কারণ যোগ করা শব্দটি শূন্যের কাছাকাছি প্রতিসম। আরও বিশ্লেষণ এবং প্রক্রিয়াকরণের জন্য, ব্যক্তিগত পরিসংখ্যানগুলি ম্যানুয়ালি পোস্ট-প্রসেস না করাই ভাল, কিন্তু আপনি যদি সেই প্লটগুলিকে একটি প্রতিবেদনে যুক্ত করতে চান, তাহলে আপনি গোপনীয়তার গ্যারান্টি লঙ্ঘন না করেই পরবর্তীতে সর্বনিম্ন শূন্য সেট করতে পারেন৷
7. রশ্মি দিয়ে পাইপলাইন চালান
ডেটা প্রক্রিয়াকরণের জন্য আজকাল আপনাকে প্রচুর পরিমাণে ডেটা মোকাবেলা করতে হবে, যাতে আপনি স্থানীয়ভাবে এটি প্রক্রিয়া করতে পারবেন না। পরিবর্তে, অনেক লোক বিম বা স্পার্কের মতো বড় আকারের ডেটা প্রক্রিয়াকরণের জন্য ফ্রেমওয়ার্ক ব্যবহার করে এবং ক্লাউডে তাদের পাইপলাইন চালায়।
PipelineDP আপনার কোডে শুধুমাত্র ছোট পরিবর্তন সহ বীম এবং স্পার্ক সমর্থন করে।
private_beam
এপিআই সহ বীমের সাথে পাইপলাইন চালানোর জন্য:
- একটি
runner
ভেরিয়েবল শুরু করুন এবং তারপরে একটি পাইপলাইন তৈরি করুন যেখানে আপনি আপনারrows
একটি বিম উপস্থাপনায় আপনার গোপনীয়তা ক্রিয়াকলাপগুলি প্রয়োগ করবেন:
runner = fn_api_runner.FnApiRunner() # local runner
with beam.Pipeline(runner=runner) as pipeline:
beam_data = pipeline | beam.Create(rows)
- আপনার প্রয়োজনীয় গোপনীয়তা পরামিতিগুলির সাথে একটি
budget_accountant
ভেরিয়েবল তৈরি করুন:
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
total_epsilon=1, total_delta=0)
- একটি
pcol
, বা ব্যক্তিগত সংগ্রহ, ভেরিয়েবল তৈরি করুন, যা গ্যারান্টি দেয় যে কোনো একত্রীকরণ আপনার গোপনীয়তার প্রয়োজনীয়তার সাথে সামঞ্জস্যপূর্ণ:
pcol = beam_data | pbeam.MakePrivate(
budget_accountant=budget_accountant,
privacy_id_extractor=lambda
row: row.user_id)
- উপযুক্ত ক্লাসে আপনার ব্যক্তিগত সমষ্টির পরামিতিগুলি নির্দিষ্ট করুন।
এখানে, আপনি pipeline_dp.aggregate_params.SumParams()
ক্লাস ব্যবহার করেন কারণ আপনি পণ্যের দর্শনের যোগফল গণনা করেন।
- আপনার পরিসংখ্যান গণনা করার জন্য
pbeam.Sum
পদ্ধতিতে আপনার সমষ্টির পরামিতিগুলি পাস করুন:
dp_result = pcol | pbeam.Sum(params)
- শেষ পর্যন্ত, আপনার কোডটি এই কোড স্নিপেটের মতো হওয়া উচিত:
import pipeline_dp.private_beam as pbeam
runner = fn_api_runner.FnApiRunner() # local runner
with beam.Pipeline(runner=runner) as pipeline:
beam_data = pipeline | beam.Create(rows)
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
total_epsilon=1, total_delta=0)
# Create private collection.
pcol = beam_data | pbeam.MakePrivate(
budget_accountant=budget_accountant,
privacy_id_extractor=lambda row:
row.user_id)
# Specify parameters.
params = pipeline_dp.aggregate_params.SumParams(
noise_kind=pipeline_dp.NoiseKind.LAPLACE,
max_partitions_contributed=1,
max_contributions_per_partition=1,
min_value=0,
max_value=100,
public_partitions=public_partitions_product_views,
partition_extractor=lambda row: row.product_view_0,
value_extractor=lambda row:row.conversion_value)
dp_result = pcol | pbeam.Sum(params)
budget_accountant.compute_budgets()
dp_result | beam.Map(print)
8. ঐচ্ছিক: গোপনীয়তা এবং ইউটিলিটি পরামিতি পরিবর্তন করুন
আপনি এই কোডল্যাবে উল্লিখিত বেশ কয়েকটি প্যারামিটার দেখেছেন, যেমন epsilon
, delta
, এবং max_partitions_contributed
প্যারামিটার। আপনি এগুলিকে মোটামুটিভাবে দুটি বিভাগে ভাগ করতে পারেন: গোপনীয়তা প্যারামিটার এবং ইউটিলিটি প্যারামিটার ৷
গোপনীয়তা পরামিতি
epsilon
এবং delta
প্যারামিটারগুলি গোপনীয়তার পরিমাণ নির্ধারণ করে যা আপনি ডিফারেনশিয়াল গোপনীয়তার সাথে প্রদান করেন। আরো স্পষ্টভাবে, তারা একটি সম্ভাব্য আক্রমণকারী বেনামী আউটপুট থেকে ডেটা সম্পর্কে কত তথ্য লাভ করতে পারে তার একটি পরিমাপ। প্যারামিটারের মান যত বেশি হবে, আক্রমণকারী ডেটা সম্পর্কে তত বেশি তথ্য লাভ করবে, যা গোপনীয়তার ঝুঁকি। অন্যদিকে, epsilon
এবং delta
প্যারামিটারের মান যত কম হবে, এটিকে বেনামী করার জন্য আপনাকে আউটপুটে যত বেশি শব্দ যোগ করতে হবে এবং বেনামে রাখার জন্য প্রতিটি পার্টিশনে আপনার প্রয়োজনীয় অনন্য ব্যবহারকারীর সংখ্যা তত বেশি হবে। আউটপুট এই ক্ষেত্রে, ইউটিলিটি এবং গোপনীয়তার মধ্যে একটি ট্রেডঅফ আছে।
PipelineDP-তে, আপনি যখন NaiveBudgetAccountant
উদাহরণে মোট গোপনীয়তা বাজেট সেট করবেন তখন আপনাকে আপনার বেনামী আউটপুটের আপনার পছন্দসই গোপনীয়তার গ্যারান্টিগুলি নির্দিষ্ট করতে হবে। সতর্কতা হল যে আপনি যদি আপনার গোপনীয়তার গ্যারান্টিগুলি ধরে রাখতে চান তবে আপনাকে প্রতিটি সমষ্টির জন্য একটি পৃথক NaiveBudgetAccountant
উদাহরণ ব্যবহার করতে হবে বা আপনার বাজেটের অতিরিক্ত ব্যবহার এড়াতে একাধিকবার পাইপলাইন চালাতে হবে।
ডিফারেনশিয়াল প্রাইভেসি এবং প্রাইভেসি প্যারামিটার বলতে কী বোঝায় সে সম্পর্কে আরও তথ্যের জন্য, ডিফারেনশিয়াল প্রাইভেসির রিডিং লিস্ট দেখুন।
ইউটিলিটি প্যারামিটার
ইউটিলিটি প্যারামিটারগুলি গোপনীয়তার গ্যারান্টিগুলিকে প্রভাবিত করে না, তবে নির্ভুলতা এবং ফলস্বরূপ, আউটপুটের উপযোগিতাকে প্রভাবিত করে। এগুলি AggregateParams
উদাহরণে সরবরাহ করা হয় এবং যোগ করা শব্দ স্কেল করতে ব্যবহৃত হয়।
AggregateParams
ইন্সট্যান্সে প্রদত্ত একটি ইউটিলিটি প্যারামিটার এবং সমস্ত সমষ্টির ক্ষেত্রে প্রযোজ্য হল max_partitions_contributed
প্যারামিটার। একটি পার্টিশন পাইপলাইনডিপি অ্যাগ্রিগেশন অপারেশন দ্বারা ফেরত ডেটার একটি কীর সাথে মিলে যায়, তাই max_partitions_contributed
প্যারামিটারটি স্বতন্ত্র কী মানগুলির সংখ্যাকে সীমাবদ্ধ করে যা একজন ব্যবহারকারী আউটপুটে অবদান রাখতে পারে। কোনো ব্যবহারকারী যদি max_partitions_contributed
প্যারামিটারের মান অতিক্রম করে এমন কিছু কী-তে অবদান রাখে, তাহলে কিছু অবদান বাদ দেওয়া হয় যাতে তারা max_partitions_contributed
প্যারামিটারের সঠিক মানের জন্য অবদান রাখে।
একইভাবে, বেশিরভাগ সমষ্টির একটি max_contributions_per_partition
প্যারামিটার থাকে। এগুলি AggregateParams
দৃষ্টান্তেও প্রদান করা হয়েছে এবং প্রতিটি একত্রিতকরণের জন্য আলাদা মান থাকতে পারে। তারা প্রতিটি কীর জন্য একজন ব্যবহারকারীর অবদানকে আবদ্ধ করে।
আউটপুটে যোগ করা নয়েজ max_partitions_contributed
এবং max_contributions_per_partition
প্যারামিটার দ্বারা স্কেল করা হয়, তাই এখানে একটি ট্রেডঅফ রয়েছে: প্রতিটি প্যারামিটারের জন্য নির্ধারিত বড় মান মানে আপনি আরও ডেটা রাখেন, কিন্তু আপনি একটি শোরগোল ফলাফল পাবেন।
কিছু সমষ্টির জন্য একটি min_value
এবং max_value
প্যারামিটার প্রয়োজন, যা প্রতিটি ব্যবহারকারীর অবদানের সীমা নির্দিষ্ট করে। যদি একজন ব্যবহারকারী min_value
প্যারামিটারে নির্ধারিত মানের চেয়ে কম একটি মান অবদান রাখে, তাহলে মানটি প্যারামিটারের মানের সাথে বৃদ্ধি করা হয়। একইভাবে, যদি একজন ব্যবহারকারী max_value
প্যারামিটারের মানের চেয়ে বড় একটি মান অবদান রাখে, তাহলে মানটি প্যারামিটারের মানের সাথে কমে যায়। আরও মূল মান রাখতে, আপনাকে বড় সীমানা নির্দিষ্ট করতে হবে। গোলমাল সীমার আকার দ্বারা মাপানো হয়, তাই বড় সীমানা আপনাকে আরও ডেটা রাখতে দেয়, কিন্তু আপনি একটি গোলমালের ফলাফল দিয়ে শেষ করেন৷
অবশেষে, noise_kind
প্যারামিটার পাইপলাইনডিপি-তে দুটি ভিন্ন নয়েজ মেকানিজম সমর্থন করে: GAUSSIAN
এবং LAPLACE
নয়েজ। LAPLACE
ডিস্ট্রিবিউশন কম অবদানের সীমার সাথে আরও ভাল ইউটিলিটি দেয়, যে কারণে PipelineDP ডিফল্টরূপে এটি ব্যবহার করে। যাইহোক, আপনি যদি একটি GAUSSIAN
ডিস্ট্রিবিউশন নয়েজ ব্যবহার করতে চান, তাহলে আপনি এটিকে AggregateParams
উদাহরণে উল্লেখ করতে পারেন।
9. অভিনন্দন
দারুণ কাজ! আপনি PipelineDP কোডল্যাব শেষ করেছেন এবং ডিফারেনশিয়াল প্রাইভেসি এবং PipelineDP সম্পর্কে অনেক কিছু শিখেছেন।