diff --git a/translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.bn.png b/translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.bn.png
new file mode 100644
index 000000000..21ac354d7
Binary files /dev/null and b/translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.bn.png differ
diff --git a/translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.br.png b/translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.br.png
new file mode 100644
index 000000000..21ac354d7
Binary files /dev/null and b/translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.br.png differ
diff --git a/translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.bn.png b/translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.bn.png
new file mode 100644
index 000000000..c4dbb1e9c
Binary files /dev/null and b/translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.bn.png differ
diff --git a/translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.br.png b/translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.br.png
new file mode 100644
index 000000000..c4dbb1e9c
Binary files /dev/null and b/translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.br.png differ
diff --git a/translated_images/ROC.167a70519c5bf8983f04e959942bb550de0fa37c220ff12c0f272d1af16e764a.bn.png b/translated_images/ROC.167a70519c5bf8983f04e959942bb550de0fa37c220ff12c0f272d1af16e764a.bn.png
new file mode 100644
index 000000000..3117bbc41
Binary files /dev/null and b/translated_images/ROC.167a70519c5bf8983f04e959942bb550de0fa37c220ff12c0f272d1af16e764a.bn.png differ
diff --git a/translated_images/ROC.167a70519c5bf8983f04e959942bb550de0fa37c220ff12c0f272d1af16e764a.br.png b/translated_images/ROC.167a70519c5bf8983f04e959942bb550de0fa37c220ff12c0f272d1af16e764a.br.png
new file mode 100644
index 000000000..3117bbc41
Binary files /dev/null and b/translated_images/ROC.167a70519c5bf8983f04e959942bb550de0fa37c220ff12c0f272d1af16e764a.br.png differ
diff --git a/translated_images/ROC_2.777f20cdfc4988ca683ade6850ac832cb70c96c12f1b910d294f270ef36e1a1c.bn.png b/translated_images/ROC_2.777f20cdfc4988ca683ade6850ac832cb70c96c12f1b910d294f270ef36e1a1c.bn.png
new file mode 100644
index 000000000..b5ee41043
Binary files /dev/null and b/translated_images/ROC_2.777f20cdfc4988ca683ade6850ac832cb70c96c12f1b910d294f270ef36e1a1c.bn.png differ
diff --git a/translated_images/ROC_2.777f20cdfc4988ca683ade6850ac832cb70c96c12f1b910d294f270ef36e1a1c.br.png b/translated_images/ROC_2.777f20cdfc4988ca683ade6850ac832cb70c96c12f1b910d294f270ef36e1a1c.br.png
new file mode 100644
index 000000000..b5ee41043
Binary files /dev/null and b/translated_images/ROC_2.777f20cdfc4988ca683ade6850ac832cb70c96c12f1b910d294f270ef36e1a1c.br.png differ
diff --git a/translated_images/accessibility.c1be5ce816eaea652fe1879bbaf74d97ef15d895ee852a7b0e3542a77b735137.bn.png b/translated_images/accessibility.c1be5ce816eaea652fe1879bbaf74d97ef15d895ee852a7b0e3542a77b735137.bn.png
new file mode 100644
index 000000000..aa9d4d053
Binary files /dev/null and b/translated_images/accessibility.c1be5ce816eaea652fe1879bbaf74d97ef15d895ee852a7b0e3542a77b735137.bn.png differ
diff --git a/translated_images/accessibility.c1be5ce816eaea652fe1879bbaf74d97ef15d895ee852a7b0e3542a77b735137.br.png b/translated_images/accessibility.c1be5ce816eaea652fe1879bbaf74d97ef15d895ee852a7b0e3542a77b735137.br.png
new file mode 100644
index 000000000..aa9d4d053
Binary files /dev/null and b/translated_images/accessibility.c1be5ce816eaea652fe1879bbaf74d97ef15d895ee852a7b0e3542a77b735137.br.png differ
diff --git a/translated_images/accountability.41d8c0f4b85b6231301d97f17a450a805b7a07aaeb56b34015d71c757cad142e.bn.png b/translated_images/accountability.41d8c0f4b85b6231301d97f17a450a805b7a07aaeb56b34015d71c757cad142e.bn.png
new file mode 100644
index 000000000..591e7c695
Binary files /dev/null and b/translated_images/accountability.41d8c0f4b85b6231301d97f17a450a805b7a07aaeb56b34015d71c757cad142e.bn.png differ
diff --git a/translated_images/accountability.41d8c0f4b85b6231301d97f17a450a805b7a07aaeb56b34015d71c757cad142e.br.png b/translated_images/accountability.41d8c0f4b85b6231301d97f17a450a805b7a07aaeb56b34015d71c757cad142e.br.png
new file mode 100644
index 000000000..591e7c695
Binary files /dev/null and b/translated_images/accountability.41d8c0f4b85b6231301d97f17a450a805b7a07aaeb56b34015d71c757cad142e.br.png differ
diff --git a/translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.bn.png b/translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.bn.png
new file mode 100644
index 000000000..4fa08b2cc
Binary files /dev/null and b/translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.bn.png differ
diff --git a/translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.br.png b/translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.br.png
new file mode 100644
index 000000000..4fa08b2cc
Binary files /dev/null and b/translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.br.png differ
diff --git a/translated_images/ai-ml-ds.537ea441b124ebf69c144a52c0eb13a7af63c4355c2f92f440979380a2fb08b8.bn.png b/translated_images/ai-ml-ds.537ea441b124ebf69c144a52c0eb13a7af63c4355c2f92f440979380a2fb08b8.bn.png
new file mode 100644
index 000000000..8ab82c166
Binary files /dev/null and b/translated_images/ai-ml-ds.537ea441b124ebf69c144a52c0eb13a7af63c4355c2f92f440979380a2fb08b8.bn.png differ
diff --git a/translated_images/ai-ml-ds.537ea441b124ebf69c144a52c0eb13a7af63c4355c2f92f440979380a2fb08b8.br.png b/translated_images/ai-ml-ds.537ea441b124ebf69c144a52c0eb13a7af63c4355c2f92f440979380a2fb08b8.br.png
new file mode 100644
index 000000000..8ab82c166
Binary files /dev/null and b/translated_images/ai-ml-ds.537ea441b124ebf69c144a52c0eb13a7af63c4355c2f92f440979380a2fb08b8.br.png differ
diff --git a/translated_images/all-genres.1d56ef06cefbfcd61183023834ed3cb891a5ee638a3ba5c924b3151bf80208d7.bn.png b/translated_images/all-genres.1d56ef06cefbfcd61183023834ed3cb891a5ee638a3ba5c924b3151bf80208d7.bn.png
new file mode 100644
index 000000000..88f5c2e88
Binary files /dev/null and b/translated_images/all-genres.1d56ef06cefbfcd61183023834ed3cb891a5ee638a3ba5c924b3151bf80208d7.bn.png differ
diff --git a/translated_images/all-genres.1d56ef06cefbfcd61183023834ed3cb891a5ee638a3ba5c924b3151bf80208d7.br.png b/translated_images/all-genres.1d56ef06cefbfcd61183023834ed3cb891a5ee638a3ba5c924b3151bf80208d7.br.png
new file mode 100644
index 000000000..88f5c2e88
Binary files /dev/null and b/translated_images/all-genres.1d56ef06cefbfcd61183023834ed3cb891a5ee638a3ba5c924b3151bf80208d7.br.png differ
diff --git a/translated_images/apple.c81c8d5965e5e5daab4a5f6d6aa08162915f2118ce0e46f2867f1a46335e874c.bn.png b/translated_images/apple.c81c8d5965e5e5daab4a5f6d6aa08162915f2118ce0e46f2867f1a46335e874c.bn.png
new file mode 100644
index 000000000..a2f8cd88e
Binary files /dev/null and b/translated_images/apple.c81c8d5965e5e5daab4a5f6d6aa08162915f2118ce0e46f2867f1a46335e874c.bn.png differ
diff --git a/translated_images/apple.c81c8d5965e5e5daab4a5f6d6aa08162915f2118ce0e46f2867f1a46335e874c.br.png b/translated_images/apple.c81c8d5965e5e5daab4a5f6d6aa08162915f2118ce0e46f2867f1a46335e874c.br.png
new file mode 100644
index 000000000..a2f8cd88e
Binary files /dev/null and b/translated_images/apple.c81c8d5965e5e5daab4a5f6d6aa08162915f2118ce0e46f2867f1a46335e874c.br.png differ
diff --git a/translated_images/barchart.a833ea9194346d769c77a3a870f7d8aee51574cd1138ca902e5500830a41cbce.bn.png b/translated_images/barchart.a833ea9194346d769c77a3a870f7d8aee51574cd1138ca902e5500830a41cbce.bn.png
new file mode 100644
index 000000000..1689371ad
Binary files /dev/null and b/translated_images/barchart.a833ea9194346d769c77a3a870f7d8aee51574cd1138ca902e5500830a41cbce.bn.png differ
diff --git a/translated_images/barchart.a833ea9194346d769c77a3a870f7d8aee51574cd1138ca902e5500830a41cbce.br.png b/translated_images/barchart.a833ea9194346d769c77a3a870f7d8aee51574cd1138ca902e5500830a41cbce.br.png
new file mode 100644
index 000000000..1689371ad
Binary files /dev/null and b/translated_images/barchart.a833ea9194346d769c77a3a870f7d8aee51574cd1138ca902e5500830a41cbce.br.png differ
diff --git a/translated_images/bellman-equation.7c0c4c722e5a6b7c208071a0bae51664965050848e4f8a84bb377cd18bdd838b.bn.png b/translated_images/bellman-equation.7c0c4c722e5a6b7c208071a0bae51664965050848e4f8a84bb377cd18bdd838b.bn.png
new file mode 100644
index 000000000..d51931923
Binary files /dev/null and b/translated_images/bellman-equation.7c0c4c722e5a6b7c208071a0bae51664965050848e4f8a84bb377cd18bdd838b.bn.png differ
diff --git a/translated_images/bellman-equation.7c0c4c722e5a6b7c208071a0bae51664965050848e4f8a84bb377cd18bdd838b.br.png b/translated_images/bellman-equation.7c0c4c722e5a6b7c208071a0bae51664965050848e4f8a84bb377cd18bdd838b.br.png
new file mode 100644
index 000000000..d51931923
Binary files /dev/null and b/translated_images/bellman-equation.7c0c4c722e5a6b7c208071a0bae51664965050848e4f8a84bb377cd18bdd838b.br.png differ
diff --git a/translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.bn.png b/translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.bn.png
new file mode 100644
index 000000000..0a61a2ffc
Binary files /dev/null and b/translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.bn.png differ
diff --git a/translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.br.png b/translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.br.png
new file mode 100644
index 000000000..0a61a2ffc
Binary files /dev/null and b/translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.br.png differ
diff --git a/translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.bn.png b/translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.bn.png
new file mode 100644
index 000000000..14982b3aa
Binary files /dev/null and b/translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.bn.png differ
diff --git a/translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.br.png b/translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.br.png
new file mode 100644
index 000000000..14982b3aa
Binary files /dev/null and b/translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.br.png differ
diff --git a/translated_images/calculation.a209813050a1ddb141cdc4bc56f3af31e67157ed499e16a2ecf9837542704c94.bn.png b/translated_images/calculation.a209813050a1ddb141cdc4bc56f3af31e67157ed499e16a2ecf9837542704c94.bn.png
new file mode 100644
index 000000000..df42204e5
Binary files /dev/null and b/translated_images/calculation.a209813050a1ddb141cdc4bc56f3af31e67157ed499e16a2ecf9837542704c94.bn.png differ
diff --git a/translated_images/calculation.a209813050a1ddb141cdc4bc56f3af31e67157ed499e16a2ecf9837542704c94.br.png b/translated_images/calculation.a209813050a1ddb141cdc4bc56f3af31e67157ed499e16a2ecf9837542704c94.br.png
new file mode 100644
index 000000000..df42204e5
Binary files /dev/null and b/translated_images/calculation.a209813050a1ddb141cdc4bc56f3af31e67157ed499e16a2ecf9837542704c94.br.png differ
diff --git a/translated_images/cartpole.b5609cc0494a14f75d121299495ae24fd8f1c30465e7b40961af94ecda2e1cd0.bn.png b/translated_images/cartpole.b5609cc0494a14f75d121299495ae24fd8f1c30465e7b40961af94ecda2e1cd0.bn.png
new file mode 100644
index 000000000..76b66c47c
Binary files /dev/null and b/translated_images/cartpole.b5609cc0494a14f75d121299495ae24fd8f1c30465e7b40961af94ecda2e1cd0.bn.png differ
diff --git a/translated_images/cartpole.b5609cc0494a14f75d121299495ae24fd8f1c30465e7b40961af94ecda2e1cd0.br.png b/translated_images/cartpole.b5609cc0494a14f75d121299495ae24fd8f1c30465e7b40961af94ecda2e1cd0.br.png
new file mode 100644
index 000000000..76b66c47c
Binary files /dev/null and b/translated_images/cartpole.b5609cc0494a14f75d121299495ae24fd8f1c30465e7b40961af94ecda2e1cd0.br.png differ
diff --git a/translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.bn.png b/translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.bn.png
new file mode 100644
index 000000000..81c85893c
Binary files /dev/null and b/translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.bn.png differ
diff --git a/translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.br.png b/translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.br.png
new file mode 100644
index 000000000..81c85893c
Binary files /dev/null and b/translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.br.png differ
diff --git a/translated_images/ceos.3de5d092ce8d2753d22b48605c1d936a1477081c0646c006a07e9c80a2249fe4.bn.png b/translated_images/ceos.3de5d092ce8d2753d22b48605c1d936a1477081c0646c006a07e9c80a2249fe4.bn.png
new file mode 100644
index 000000000..bbb373a47
Binary files /dev/null and b/translated_images/ceos.3de5d092ce8d2753d22b48605c1d936a1477081c0646c006a07e9c80a2249fe4.bn.png differ
diff --git a/translated_images/ceos.3de5d092ce8d2753d22b48605c1d936a1477081c0646c006a07e9c80a2249fe4.br.png b/translated_images/ceos.3de5d092ce8d2753d22b48605c1d936a1477081c0646c006a07e9c80a2249fe4.br.png
new file mode 100644
index 000000000..bbb373a47
Binary files /dev/null and b/translated_images/ceos.3de5d092ce8d2753d22b48605c1d936a1477081c0646c006a07e9c80a2249fe4.br.png differ
diff --git a/translated_images/ceos.7a9a67871424a6c07986e7c22ddae062ac660c469f6a54435196e0ae73a1c4da.bn.png b/translated_images/ceos.7a9a67871424a6c07986e7c22ddae062ac660c469f6a54435196e0ae73a1c4da.bn.png
new file mode 100644
index 000000000..bbb373a47
Binary files /dev/null and b/translated_images/ceos.7a9a67871424a6c07986e7c22ddae062ac660c469f6a54435196e0ae73a1c4da.bn.png differ
diff --git a/translated_images/ceos.7a9a67871424a6c07986e7c22ddae062ac660c469f6a54435196e0ae73a1c4da.br.png b/translated_images/ceos.7a9a67871424a6c07986e7c22ddae062ac660c469f6a54435196e0ae73a1c4da.br.png
new file mode 100644
index 000000000..bbb373a47
Binary files /dev/null and b/translated_images/ceos.7a9a67871424a6c07986e7c22ddae062ac660c469f6a54435196e0ae73a1c4da.br.png differ
diff --git a/translated_images/cf-what-if-features.5a92a6924da3e9b58b654c974d7560bfbfc067c123b73e98ab4935448b3f70d5.bn.png b/translated_images/cf-what-if-features.5a92a6924da3e9b58b654c974d7560bfbfc067c123b73e98ab4935448b3f70d5.bn.png
new file mode 100644
index 000000000..126b60378
Binary files /dev/null and b/translated_images/cf-what-if-features.5a92a6924da3e9b58b654c974d7560bfbfc067c123b73e98ab4935448b3f70d5.bn.png differ
diff --git a/translated_images/cf-what-if-features.5a92a6924da3e9b58b654c974d7560bfbfc067c123b73e98ab4935448b3f70d5.br.png b/translated_images/cf-what-if-features.5a92a6924da3e9b58b654c974d7560bfbfc067c123b73e98ab4935448b3f70d5.br.png
new file mode 100644
index 000000000..126b60378
Binary files /dev/null and b/translated_images/cf-what-if-features.5a92a6924da3e9b58b654c974d7560bfbfc067c123b73e98ab4935448b3f70d5.br.png differ
diff --git a/translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.bn.png b/translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.bn.png
new file mode 100644
index 000000000..685bef623
Binary files /dev/null and b/translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.bn.png differ
diff --git a/translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.br.png b/translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.br.png
new file mode 100644
index 000000000..685bef623
Binary files /dev/null and b/translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.br.png differ
diff --git a/translated_images/chess.e704a268781bdad85d1876b6c2295742fa0d856e7dcf3659147052df9d3db205.bn.jpg b/translated_images/chess.e704a268781bdad85d1876b6c2295742fa0d856e7dcf3659147052df9d3db205.bn.jpg
new file mode 100644
index 000000000..afef99916
Binary files /dev/null and b/translated_images/chess.e704a268781bdad85d1876b6c2295742fa0d856e7dcf3659147052df9d3db205.bn.jpg differ
diff --git a/translated_images/chess.e704a268781bdad85d1876b6c2295742fa0d856e7dcf3659147052df9d3db205.br.jpg b/translated_images/chess.e704a268781bdad85d1876b6c2295742fa0d856e7dcf3659147052df9d3db205.br.jpg
new file mode 100644
index 000000000..afef99916
Binary files /dev/null and b/translated_images/chess.e704a268781bdad85d1876b6c2295742fa0d856e7dcf3659147052df9d3db205.br.jpg differ
diff --git a/translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.bn.png b/translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.bn.png
new file mode 100644
index 000000000..13cc9b4ed
Binary files /dev/null and b/translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.bn.png differ
diff --git a/translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.br.png b/translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.br.png
new file mode 100644
index 000000000..13cc9b4ed
Binary files /dev/null and b/translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.br.png differ
diff --git a/translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.bn.png b/translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.bn.png
new file mode 100644
index 000000000..5f991e289
Binary files /dev/null and b/translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.bn.png differ
diff --git a/translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.br.png b/translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.br.png
new file mode 100644
index 000000000..5f991e289
Binary files /dev/null and b/translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.br.png differ
diff --git a/translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.bn.png b/translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.bn.png
new file mode 100644
index 000000000..a64781283
Binary files /dev/null and b/translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.bn.png differ
diff --git a/translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.br.png b/translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.br.png
new file mode 100644
index 000000000..a64781283
Binary files /dev/null and b/translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.br.png differ
diff --git a/translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.bn.png b/translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.bn.png
new file mode 100644
index 000000000..aabba0910
Binary files /dev/null and b/translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.bn.png differ
diff --git a/translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.br.png b/translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.br.png
new file mode 100644
index 000000000..aabba0910
Binary files /dev/null and b/translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.br.png differ
diff --git a/translated_images/confusion-matrix.3cc5496a1a37c3e4311e74790f15a1426e03e27af7e611aaabda56bc0a802aaf.bn.png b/translated_images/confusion-matrix.3cc5496a1a37c3e4311e74790f15a1426e03e27af7e611aaabda56bc0a802aaf.bn.png
new file mode 100644
index 000000000..5dae1c7d5
Binary files /dev/null and b/translated_images/confusion-matrix.3cc5496a1a37c3e4311e74790f15a1426e03e27af7e611aaabda56bc0a802aaf.bn.png differ
diff --git a/translated_images/confusion-matrix.3cc5496a1a37c3e4311e74790f15a1426e03e27af7e611aaabda56bc0a802aaf.br.png b/translated_images/confusion-matrix.3cc5496a1a37c3e4311e74790f15a1426e03e27af7e611aaabda56bc0a802aaf.br.png
new file mode 100644
index 000000000..5dae1c7d5
Binary files /dev/null and b/translated_images/confusion-matrix.3cc5496a1a37c3e4311e74790f15a1426e03e27af7e611aaabda56bc0a802aaf.br.png differ
diff --git a/translated_images/correlation.a9356bb798f5eea51f47185968e1ebac5c078c92fce9931e28ccf0d7fab71c2b.bn.png b/translated_images/correlation.a9356bb798f5eea51f47185968e1ebac5c078c92fce9931e28ccf0d7fab71c2b.bn.png
new file mode 100644
index 000000000..fa4dd0b42
Binary files /dev/null and b/translated_images/correlation.a9356bb798f5eea51f47185968e1ebac5c078c92fce9931e28ccf0d7fab71c2b.bn.png differ
diff --git a/translated_images/correlation.a9356bb798f5eea51f47185968e1ebac5c078c92fce9931e28ccf0d7fab71c2b.br.png b/translated_images/correlation.a9356bb798f5eea51f47185968e1ebac5c078c92fce9931e28ccf0d7fab71c2b.br.png
new file mode 100644
index 000000000..fa4dd0b42
Binary files /dev/null and b/translated_images/correlation.a9356bb798f5eea51f47185968e1ebac5c078c92fce9931e28ccf0d7fab71c2b.br.png differ
diff --git a/translated_images/counterfactuals-examples.b38a50a504ee0a9fc6087aba050a212a5f838adc5b0d76c5c656f8b1ccaab822.bn.png b/translated_images/counterfactuals-examples.b38a50a504ee0a9fc6087aba050a212a5f838adc5b0d76c5c656f8b1ccaab822.bn.png
new file mode 100644
index 000000000..40dd5206e
Binary files /dev/null and b/translated_images/counterfactuals-examples.b38a50a504ee0a9fc6087aba050a212a5f838adc5b0d76c5c656f8b1ccaab822.bn.png differ
diff --git a/translated_images/counterfactuals-examples.b38a50a504ee0a9fc6087aba050a212a5f838adc5b0d76c5c656f8b1ccaab822.br.png b/translated_images/counterfactuals-examples.b38a50a504ee0a9fc6087aba050a212a5f838adc5b0d76c5c656f8b1ccaab822.br.png
new file mode 100644
index 000000000..40dd5206e
Binary files /dev/null and b/translated_images/counterfactuals-examples.b38a50a504ee0a9fc6087aba050a212a5f838adc5b0d76c5c656f8b1ccaab822.br.png differ
diff --git a/translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.bn.png b/translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.bn.png
new file mode 100644
index 000000000..97b45b02a
Binary files /dev/null and b/translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.bn.png differ
diff --git a/translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.br.png b/translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.br.png
new file mode 100644
index 000000000..97b45b02a
Binary files /dev/null and b/translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.br.png differ
diff --git a/translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.bn.png b/translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.bn.png
new file mode 100644
index 000000000..0f56c6528
Binary files /dev/null and b/translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.bn.png differ
diff --git a/translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.br.png b/translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.br.png
new file mode 100644
index 000000000..0f56c6528
Binary files /dev/null and b/translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.br.png differ
diff --git a/translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.bn.png b/translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.bn.png
new file mode 100644
index 000000000..76a1c12ad
Binary files /dev/null and b/translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.bn.png differ
diff --git a/translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.br.png b/translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.br.png
new file mode 100644
index 000000000..76a1c12ad
Binary files /dev/null and b/translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.br.png differ
diff --git a/translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.bn.png b/translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.bn.png
new file mode 100644
index 000000000..6568a1d64
Binary files /dev/null and b/translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.bn.png differ
diff --git a/translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.br.png b/translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.br.png
new file mode 100644
index 000000000..6568a1d64
Binary files /dev/null and b/translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.br.png differ
diff --git a/translated_images/datapoints.aaf6815cd5d873541b61b73b9a6ee6a53914b5d62ed2cbbedaa2e1d9a414c5c1.bn.png b/translated_images/datapoints.aaf6815cd5d873541b61b73b9a6ee6a53914b5d62ed2cbbedaa2e1d9a414c5c1.bn.png
new file mode 100644
index 000000000..86c6b1f1f
Binary files /dev/null and b/translated_images/datapoints.aaf6815cd5d873541b61b73b9a6ee6a53914b5d62ed2cbbedaa2e1d9a414c5c1.bn.png differ
diff --git a/translated_images/datapoints.aaf6815cd5d873541b61b73b9a6ee6a53914b5d62ed2cbbedaa2e1d9a414c5c1.br.png b/translated_images/datapoints.aaf6815cd5d873541b61b73b9a6ee6a53914b5d62ed2cbbedaa2e1d9a414c5c1.br.png
new file mode 100644
index 000000000..86c6b1f1f
Binary files /dev/null and b/translated_images/datapoints.aaf6815cd5d873541b61b73b9a6ee6a53914b5d62ed2cbbedaa2e1d9a414c5c1.br.png differ
diff --git a/translated_images/distribution.9be11df42356ca958dc8e06e87865e09d77cab78f94fe4fea8a1e6796c64dc4b.bn.png b/translated_images/distribution.9be11df42356ca958dc8e06e87865e09d77cab78f94fe4fea8a1e6796c64dc4b.bn.png
new file mode 100644
index 000000000..102756eae
Binary files /dev/null and b/translated_images/distribution.9be11df42356ca958dc8e06e87865e09d77cab78f94fe4fea8a1e6796c64dc4b.bn.png differ
diff --git a/translated_images/distribution.9be11df42356ca958dc8e06e87865e09d77cab78f94fe4fea8a1e6796c64dc4b.br.png b/translated_images/distribution.9be11df42356ca958dc8e06e87865e09d77cab78f94fe4fea8a1e6796c64dc4b.br.png
new file mode 100644
index 000000000..102756eae
Binary files /dev/null and b/translated_images/distribution.9be11df42356ca958dc8e06e87865e09d77cab78f94fe4fea8a1e6796c64dc4b.br.png differ
diff --git a/translated_images/dplyr_filter.b480b264b03439ff7051232a8de1df9a8fd4df723db316feb4f9f5e990db4318.bn.jpg b/translated_images/dplyr_filter.b480b264b03439ff7051232a8de1df9a8fd4df723db316feb4f9f5e990db4318.bn.jpg
new file mode 100644
index 000000000..a0790a754
Binary files /dev/null and b/translated_images/dplyr_filter.b480b264b03439ff7051232a8de1df9a8fd4df723db316feb4f9f5e990db4318.bn.jpg differ
diff --git a/translated_images/dplyr_filter.b480b264b03439ff7051232a8de1df9a8fd4df723db316feb4f9f5e990db4318.br.jpg b/translated_images/dplyr_filter.b480b264b03439ff7051232a8de1df9a8fd4df723db316feb4f9f5e990db4318.br.jpg
new file mode 100644
index 000000000..a0790a754
Binary files /dev/null and b/translated_images/dplyr_filter.b480b264b03439ff7051232a8de1df9a8fd4df723db316feb4f9f5e990db4318.br.jpg differ
diff --git a/translated_images/dplyr_wrangling.f5f99c64fd4580f1377fee3ea428b6f8fd073845ec0f8409d483cfe148f0984e.bn.png b/translated_images/dplyr_wrangling.f5f99c64fd4580f1377fee3ea428b6f8fd073845ec0f8409d483cfe148f0984e.bn.png
new file mode 100644
index 000000000..6f6a9f3c7
Binary files /dev/null and b/translated_images/dplyr_wrangling.f5f99c64fd4580f1377fee3ea428b6f8fd073845ec0f8409d483cfe148f0984e.bn.png differ
diff --git a/translated_images/dplyr_wrangling.f5f99c64fd4580f1377fee3ea428b6f8fd073845ec0f8409d483cfe148f0984e.br.png b/translated_images/dplyr_wrangling.f5f99c64fd4580f1377fee3ea428b6f8fd073845ec0f8409d483cfe148f0984e.br.png
new file mode 100644
index 000000000..6f6a9f3c7
Binary files /dev/null and b/translated_images/dplyr_wrangling.f5f99c64fd4580f1377fee3ea428b6f8fd073845ec0f8409d483cfe148f0984e.br.png differ
diff --git a/translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.bn.png b/translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.bn.png
new file mode 100644
index 000000000..1f3d2840b
Binary files /dev/null and b/translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.bn.png differ
diff --git a/translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.br.png b/translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.br.png
new file mode 100644
index 000000000..1f3d2840b
Binary files /dev/null and b/translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.br.png differ
diff --git a/translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.bn.png b/translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.bn.png
new file mode 100644
index 000000000..ddf5156e2
Binary files /dev/null and b/translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.bn.png differ
diff --git a/translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.br.png b/translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.br.png
new file mode 100644
index 000000000..ddf5156e2
Binary files /dev/null and b/translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.br.png differ
diff --git a/translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.bn.png b/translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.bn.png
new file mode 100644
index 000000000..ab9ecf66d
Binary files /dev/null and b/translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.bn.png differ
diff --git a/translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.br.png b/translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.br.png
new file mode 100644
index 000000000..ab9ecf66d
Binary files /dev/null and b/translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.br.png differ
diff --git a/translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.bn.png b/translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.bn.png
new file mode 100644
index 000000000..1528be449
Binary files /dev/null and b/translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.bn.png differ
diff --git a/translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.br.png b/translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.br.png
new file mode 100644
index 000000000..1528be449
Binary files /dev/null and b/translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.br.png differ
diff --git a/translated_images/electric-grid.0c21d5214db09ffae93c06a87ca2abbb9ba7475ef815129c5b423d7f9a7cf136.bn.jpg b/translated_images/electric-grid.0c21d5214db09ffae93c06a87ca2abbb9ba7475ef815129c5b423d7f9a7cf136.bn.jpg
new file mode 100644
index 000000000..9616118e7
Binary files /dev/null and b/translated_images/electric-grid.0c21d5214db09ffae93c06a87ca2abbb9ba7475ef815129c5b423d7f9a7cf136.bn.jpg differ
diff --git a/translated_images/electric-grid.0c21d5214db09ffae93c06a87ca2abbb9ba7475ef815129c5b423d7f9a7cf136.br.jpg b/translated_images/electric-grid.0c21d5214db09ffae93c06a87ca2abbb9ba7475ef815129c5b423d7f9a7cf136.br.jpg
new file mode 100644
index 000000000..9616118e7
Binary files /dev/null and b/translated_images/electric-grid.0c21d5214db09ffae93c06a87ca2abbb9ba7475ef815129c5b423d7f9a7cf136.br.jpg differ
diff --git a/translated_images/eliza.84397454cda9559bb5ec296b5b8fff067571c0cccc5405f9c1ab1c3f105c075c.bn.png b/translated_images/eliza.84397454cda9559bb5ec296b5b8fff067571c0cccc5405f9c1ab1c3f105c075c.bn.png
new file mode 100644
index 000000000..334858f4b
Binary files /dev/null and b/translated_images/eliza.84397454cda9559bb5ec296b5b8fff067571c0cccc5405f9c1ab1c3f105c075c.bn.png differ
diff --git a/translated_images/eliza.84397454cda9559bb5ec296b5b8fff067571c0cccc5405f9c1ab1c3f105c075c.br.png b/translated_images/eliza.84397454cda9559bb5ec296b5b8fff067571c0cccc5405f9c1ab1c3f105c075c.br.png
new file mode 100644
index 000000000..334858f4b
Binary files /dev/null and b/translated_images/eliza.84397454cda9559bb5ec296b5b8fff067571c0cccc5405f9c1ab1c3f105c075c.br.png differ
diff --git a/translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.bn.png b/translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.bn.png
new file mode 100644
index 000000000..459dcf565
Binary files /dev/null and b/translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.bn.png differ
diff --git a/translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.br.png b/translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.br.png
new file mode 100644
index 000000000..459dcf565
Binary files /dev/null and b/translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.br.png differ
diff --git a/translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.bn.jpg b/translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.bn.jpg
new file mode 100644
index 000000000..7e685a520
Binary files /dev/null and b/translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.bn.jpg differ
diff --git a/translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.br.jpg b/translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.br.jpg
new file mode 100644
index 000000000..7e685a520
Binary files /dev/null and b/translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.br.jpg differ
diff --git a/translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.bn.png b/translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.bn.png
new file mode 100644
index 000000000..9826bdb57
Binary files /dev/null and b/translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.bn.png differ
diff --git a/translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.br.png b/translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.br.png
new file mode 100644
index 000000000..9826bdb57
Binary files /dev/null and b/translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.br.png differ
diff --git a/translated_images/env_init.04e8f26d2d60089e128f21d22e5fef57d580e559f0d5937b06c689e5e7cdd438.bn.png b/translated_images/env_init.04e8f26d2d60089e128f21d22e5fef57d580e559f0d5937b06c689e5e7cdd438.bn.png
new file mode 100644
index 000000000..15f84e910
Binary files /dev/null and b/translated_images/env_init.04e8f26d2d60089e128f21d22e5fef57d580e559f0d5937b06c689e5e7cdd438.bn.png differ
diff --git a/translated_images/env_init.04e8f26d2d60089e128f21d22e5fef57d580e559f0d5937b06c689e5e7cdd438.br.png b/translated_images/env_init.04e8f26d2d60089e128f21d22e5fef57d580e559f0d5937b06c689e5e7cdd438.br.png
new file mode 100644
index 000000000..15f84e910
Binary files /dev/null and b/translated_images/env_init.04e8f26d2d60089e128f21d22e5fef57d580e559f0d5937b06c689e5e7cdd438.br.png differ
diff --git a/translated_images/environment.40ba3cb66256c93fa7e92f6f7214e1d1f588aafa97d266c11d108c5c5d101b6c.bn.png b/translated_images/environment.40ba3cb66256c93fa7e92f6f7214e1d1f588aafa97d266c11d108c5c5d101b6c.bn.png
new file mode 100644
index 000000000..f340cf46f
Binary files /dev/null and b/translated_images/environment.40ba3cb66256c93fa7e92f6f7214e1d1f588aafa97d266c11d108c5c5d101b6c.bn.png differ
diff --git a/translated_images/environment.40ba3cb66256c93fa7e92f6f7214e1d1f588aafa97d266c11d108c5c5d101b6c.br.png b/translated_images/environment.40ba3cb66256c93fa7e92f6f7214e1d1f588aafa97d266c11d108c5c5d101b6c.br.png
new file mode 100644
index 000000000..f340cf46f
Binary files /dev/null and b/translated_images/environment.40ba3cb66256c93fa7e92f6f7214e1d1f588aafa97d266c11d108c5c5d101b6c.br.png differ
diff --git a/translated_images/escape.18862db9930337e3fce23a9b6a76a06445f229dadea2268e12a6f0a1fde12115.bn.png b/translated_images/escape.18862db9930337e3fce23a9b6a76a06445f229dadea2268e12a6f0a1fde12115.bn.png
new file mode 100644
index 000000000..891e0750e
Binary files /dev/null and b/translated_images/escape.18862db9930337e3fce23a9b6a76a06445f229dadea2268e12a6f0a1fde12115.bn.png differ
diff --git a/translated_images/escape.18862db9930337e3fce23a9b6a76a06445f229dadea2268e12a6f0a1fde12115.br.png b/translated_images/escape.18862db9930337e3fce23a9b6a76a06445f229dadea2268e12a6f0a1fde12115.br.png
new file mode 100644
index 000000000..891e0750e
Binary files /dev/null and b/translated_images/escape.18862db9930337e3fce23a9b6a76a06445f229dadea2268e12a6f0a1fde12115.br.png differ
diff --git a/translated_images/facetgrid.9b2e65ce707eba1f983b7cdfed5d952e60f385947afa3011df6e3cc7d200eb5b.bn.png b/translated_images/facetgrid.9b2e65ce707eba1f983b7cdfed5d952e60f385947afa3011df6e3cc7d200eb5b.bn.png
new file mode 100644
index 000000000..e9871d987
Binary files /dev/null and b/translated_images/facetgrid.9b2e65ce707eba1f983b7cdfed5d952e60f385947afa3011df6e3cc7d200eb5b.bn.png differ
diff --git a/translated_images/facetgrid.9b2e65ce707eba1f983b7cdfed5d952e60f385947afa3011df6e3cc7d200eb5b.br.png b/translated_images/facetgrid.9b2e65ce707eba1f983b7cdfed5d952e60f385947afa3011df6e3cc7d200eb5b.br.png
new file mode 100644
index 000000000..e9871d987
Binary files /dev/null and b/translated_images/facetgrid.9b2e65ce707eba1f983b7cdfed5d952e60f385947afa3011df6e3cc7d200eb5b.br.png differ
diff --git a/translated_images/fairness.25d7c8ce9817272d25dd0e2b42a6addf7d3b8241cb6c3088fa9fc3eb7227781d.bn.png b/translated_images/fairness.25d7c8ce9817272d25dd0e2b42a6addf7d3b8241cb6c3088fa9fc3eb7227781d.bn.png
new file mode 100644
index 000000000..9a9d55f1d
Binary files /dev/null and b/translated_images/fairness.25d7c8ce9817272d25dd0e2b42a6addf7d3b8241cb6c3088fa9fc3eb7227781d.bn.png differ
diff --git a/translated_images/fairness.25d7c8ce9817272d25dd0e2b42a6addf7d3b8241cb6c3088fa9fc3eb7227781d.br.png b/translated_images/fairness.25d7c8ce9817272d25dd0e2b42a6addf7d3b8241cb6c3088fa9fc3eb7227781d.br.png
new file mode 100644
index 000000000..9a9d55f1d
Binary files /dev/null and b/translated_images/fairness.25d7c8ce9817272d25dd0e2b42a6addf7d3b8241cb6c3088fa9fc3eb7227781d.br.png differ
diff --git a/translated_images/fairness.b9f9893a4e3dc28bec350a714555c3be39040c3fe7e0aa4da10bb8e3c54a1cc9.bn.png b/translated_images/fairness.b9f9893a4e3dc28bec350a714555c3be39040c3fe7e0aa4da10bb8e3c54a1cc9.bn.png
new file mode 100644
index 000000000..9a9d55f1d
Binary files /dev/null and b/translated_images/fairness.b9f9893a4e3dc28bec350a714555c3be39040c3fe7e0aa4da10bb8e3c54a1cc9.bn.png differ
diff --git a/translated_images/fairness.b9f9893a4e3dc28bec350a714555c3be39040c3fe7e0aa4da10bb8e3c54a1cc9.br.png b/translated_images/fairness.b9f9893a4e3dc28bec350a714555c3be39040c3fe7e0aa4da10bb8e3c54a1cc9.br.png
new file mode 100644
index 000000000..9a9d55f1d
Binary files /dev/null and b/translated_images/fairness.b9f9893a4e3dc28bec350a714555c3be39040c3fe7e0aa4da10bb8e3c54a1cc9.br.png differ
diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.bn.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.bn.png
new file mode 100644
index 000000000..26e0ae439
Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.bn.png differ
diff --git a/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.br.png b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.br.png
new file mode 100644
index 000000000..26e0ae439
Binary files /dev/null and b/translated_images/favicon.37b561214b36d454f9fd1f725d77f310fe256eb88f2a0ae08b9cb18aeb30650c.br.png differ
diff --git a/translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.bn.png b/translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.bn.png
new file mode 100644
index 000000000..a1648bf77
Binary files /dev/null and b/translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.bn.png differ
diff --git a/translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.br.png b/translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.br.png
new file mode 100644
index 000000000..a1648bf77
Binary files /dev/null and b/translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.br.png differ
diff --git a/translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.bn.png b/translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.bn.png
new file mode 100644
index 000000000..23d0506f5
Binary files /dev/null and b/translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.bn.png differ
diff --git a/translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.br.png b/translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.br.png
new file mode 100644
index 000000000..23d0506f5
Binary files /dev/null and b/translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.br.png differ
diff --git a/translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.bn.png b/translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.bn.png
new file mode 100644
index 000000000..c1029876e
Binary files /dev/null and b/translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.bn.png differ
diff --git a/translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.br.png b/translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.br.png
new file mode 100644
index 000000000..c1029876e
Binary files /dev/null and b/translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.br.png differ
diff --git a/translated_images/gender-bias-translate-en-tr.bfd87c45da23c08526ec072e397d571d96b6051c8b538600b1ada80289d6ac58.bn.png b/translated_images/gender-bias-translate-en-tr.bfd87c45da23c08526ec072e397d571d96b6051c8b538600b1ada80289d6ac58.bn.png
new file mode 100644
index 000000000..253ddfd62
Binary files /dev/null and b/translated_images/gender-bias-translate-en-tr.bfd87c45da23c08526ec072e397d571d96b6051c8b538600b1ada80289d6ac58.bn.png differ
diff --git a/translated_images/gender-bias-translate-en-tr.bfd87c45da23c08526ec072e397d571d96b6051c8b538600b1ada80289d6ac58.br.png b/translated_images/gender-bias-translate-en-tr.bfd87c45da23c08526ec072e397d571d96b6051c8b538600b1ada80289d6ac58.br.png
new file mode 100644
index 000000000..253ddfd62
Binary files /dev/null and b/translated_images/gender-bias-translate-en-tr.bfd87c45da23c08526ec072e397d571d96b6051c8b538600b1ada80289d6ac58.br.png differ
diff --git a/translated_images/gender-bias-translate-en-tr.f185fd8822c2d4372912f2b690f6aaddd306ffbb49d795ad8d12a4bf141e7af0.bn.png b/translated_images/gender-bias-translate-en-tr.f185fd8822c2d4372912f2b690f6aaddd306ffbb49d795ad8d12a4bf141e7af0.bn.png
new file mode 100644
index 000000000..253ddfd62
Binary files /dev/null and b/translated_images/gender-bias-translate-en-tr.f185fd8822c2d4372912f2b690f6aaddd306ffbb49d795ad8d12a4bf141e7af0.bn.png differ
diff --git a/translated_images/gender-bias-translate-en-tr.f185fd8822c2d4372912f2b690f6aaddd306ffbb49d795ad8d12a4bf141e7af0.br.png b/translated_images/gender-bias-translate-en-tr.f185fd8822c2d4372912f2b690f6aaddd306ffbb49d795ad8d12a4bf141e7af0.br.png
new file mode 100644
index 000000000..253ddfd62
Binary files /dev/null and b/translated_images/gender-bias-translate-en-tr.f185fd8822c2d4372912f2b690f6aaddd306ffbb49d795ad8d12a4bf141e7af0.br.png differ
diff --git a/translated_images/gender-bias-translate-tr-en.1f97568ba9e40e20eb5b40e8538fc38994b794597d2e446f8e43cf40a4baced9.bn.png b/translated_images/gender-bias-translate-tr-en.1f97568ba9e40e20eb5b40e8538fc38994b794597d2e446f8e43cf40a4baced9.bn.png
new file mode 100644
index 000000000..c0847d32d
Binary files /dev/null and b/translated_images/gender-bias-translate-tr-en.1f97568ba9e40e20eb5b40e8538fc38994b794597d2e446f8e43cf40a4baced9.bn.png differ
diff --git a/translated_images/gender-bias-translate-tr-en.1f97568ba9e40e20eb5b40e8538fc38994b794597d2e446f8e43cf40a4baced9.br.png b/translated_images/gender-bias-translate-tr-en.1f97568ba9e40e20eb5b40e8538fc38994b794597d2e446f8e43cf40a4baced9.br.png
new file mode 100644
index 000000000..c0847d32d
Binary files /dev/null and b/translated_images/gender-bias-translate-tr-en.1f97568ba9e40e20eb5b40e8538fc38994b794597d2e446f8e43cf40a4baced9.br.png differ
diff --git a/translated_images/gender-bias-translate-tr-en.4eee7e3cecb8c70e13a8abbc379209bc8032714169e585bdeac75af09b1752aa.bn.png b/translated_images/gender-bias-translate-tr-en.4eee7e3cecb8c70e13a8abbc379209bc8032714169e585bdeac75af09b1752aa.bn.png
new file mode 100644
index 000000000..c0847d32d
Binary files /dev/null and b/translated_images/gender-bias-translate-tr-en.4eee7e3cecb8c70e13a8abbc379209bc8032714169e585bdeac75af09b1752aa.bn.png differ
diff --git a/translated_images/gender-bias-translate-tr-en.4eee7e3cecb8c70e13a8abbc379209bc8032714169e585bdeac75af09b1752aa.br.png b/translated_images/gender-bias-translate-tr-en.4eee7e3cecb8c70e13a8abbc379209bc8032714169e585bdeac75af09b1752aa.br.png
new file mode 100644
index 000000000..c0847d32d
Binary files /dev/null and b/translated_images/gender-bias-translate-tr-en.4eee7e3cecb8c70e13a8abbc379209bc8032714169e585bdeac75af09b1752aa.br.png differ
diff --git a/translated_images/globe.59f26379ceb40428672b4d9a568044618a2bf6292ecd53a5c481b90e3fa805eb.bn.jpg b/translated_images/globe.59f26379ceb40428672b4d9a568044618a2bf6292ecd53a5c481b90e3fa805eb.bn.jpg
new file mode 100644
index 000000000..31ba4b334
Binary files /dev/null and b/translated_images/globe.59f26379ceb40428672b4d9a568044618a2bf6292ecd53a5c481b90e3fa805eb.bn.jpg differ
diff --git a/translated_images/globe.59f26379ceb40428672b4d9a568044618a2bf6292ecd53a5c481b90e3fa805eb.br.jpg b/translated_images/globe.59f26379ceb40428672b4d9a568044618a2bf6292ecd53a5c481b90e3fa805eb.br.jpg
new file mode 100644
index 000000000..31ba4b334
Binary files /dev/null and b/translated_images/globe.59f26379ceb40428672b4d9a568044618a2bf6292ecd53a5c481b90e3fa805eb.br.jpg differ
diff --git a/translated_images/grid.464370ad00f3696ce81c7488a963158b69d3b1cfd3f020c58a28360e5cf4239c.bn.png b/translated_images/grid.464370ad00f3696ce81c7488a963158b69d3b1cfd3f020c58a28360e5cf4239c.bn.png
new file mode 100644
index 000000000..bde6517f7
Binary files /dev/null and b/translated_images/grid.464370ad00f3696ce81c7488a963158b69d3b1cfd3f020c58a28360e5cf4239c.bn.png differ
diff --git a/translated_images/grid.464370ad00f3696ce81c7488a963158b69d3b1cfd3f020c58a28360e5cf4239c.br.png b/translated_images/grid.464370ad00f3696ce81c7488a963158b69d3b1cfd3f020c58a28360e5cf4239c.br.png
new file mode 100644
index 000000000..bde6517f7
Binary files /dev/null and b/translated_images/grid.464370ad00f3696ce81c7488a963158b69d3b1cfd3f020c58a28360e5cf4239c.br.png differ
diff --git a/translated_images/heatmap.39952045da50b4eb206764735021552f31cff773a79997ece7481fe614897a25.bn.png b/translated_images/heatmap.39952045da50b4eb206764735021552f31cff773a79997ece7481fe614897a25.bn.png
new file mode 100644
index 000000000..bc2472735
Binary files /dev/null and b/translated_images/heatmap.39952045da50b4eb206764735021552f31cff773a79997ece7481fe614897a25.bn.png differ
diff --git a/translated_images/heatmap.39952045da50b4eb206764735021552f31cff773a79997ece7481fe614897a25.br.png b/translated_images/heatmap.39952045da50b4eb206764735021552f31cff773a79997ece7481fe614897a25.br.png
new file mode 100644
index 000000000..bc2472735
Binary files /dev/null and b/translated_images/heatmap.39952045da50b4eb206764735021552f31cff773a79997ece7481fe614897a25.br.png differ
diff --git a/translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.bn.png b/translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.bn.png
new file mode 100644
index 000000000..eb84fc9a7
Binary files /dev/null and b/translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.bn.png differ
diff --git a/translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.br.png b/translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.br.png
new file mode 100644
index 000000000..eb84fc9a7
Binary files /dev/null and b/translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.br.png differ
diff --git a/translated_images/human.e3840390a2ab76901f465c17f568637801ab0df39d7c3fdcb6a112b0c74c6288.bn.png b/translated_images/human.e3840390a2ab76901f465c17f568637801ab0df39d7c3fdcb6a112b0c74c6288.bn.png
new file mode 100644
index 000000000..3070781f6
Binary files /dev/null and b/translated_images/human.e3840390a2ab76901f465c17f568637801ab0df39d7c3fdcb6a112b0c74c6288.bn.png differ
diff --git a/translated_images/human.e3840390a2ab76901f465c17f568637801ab0df39d7c3fdcb6a112b0c74c6288.br.png b/translated_images/human.e3840390a2ab76901f465c17f568637801ab0df39d7c3fdcb6a112b0c74c6288.br.png
new file mode 100644
index 000000000..3070781f6
Binary files /dev/null and b/translated_images/human.e3840390a2ab76901f465c17f568637801ab0df39d7c3fdcb6a112b0c74c6288.br.png differ
diff --git a/translated_images/hype.07183d711a17aafe70915909a0e45aa286ede136ee9424d418026ab00fec344c.bn.png b/translated_images/hype.07183d711a17aafe70915909a0e45aa286ede136ee9424d418026ab00fec344c.bn.png
new file mode 100644
index 000000000..d0e31337f
Binary files /dev/null and b/translated_images/hype.07183d711a17aafe70915909a0e45aa286ede136ee9424d418026ab00fec344c.bn.png differ
diff --git a/translated_images/hype.07183d711a17aafe70915909a0e45aa286ede136ee9424d418026ab00fec344c.br.png b/translated_images/hype.07183d711a17aafe70915909a0e45aa286ede136ee9424d418026ab00fec344c.br.png
new file mode 100644
index 000000000..d0e31337f
Binary files /dev/null and b/translated_images/hype.07183d711a17aafe70915909a0e45aa286ede136ee9424d418026ab00fec344c.br.png differ
diff --git a/translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.bn.png b/translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.bn.png
new file mode 100644
index 000000000..ce4e65402
Binary files /dev/null and b/translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.bn.png differ
diff --git a/translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.br.png b/translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.br.png
new file mode 100644
index 000000000..ce4e65402
Binary files /dev/null and b/translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.br.png differ
diff --git a/translated_images/individual-causal-what-if.00e7b86b52a083cea6344c73c76463e9d41e0fe44fecd6f48671cb2a2d280d81.bn.png b/translated_images/individual-causal-what-if.00e7b86b52a083cea6344c73c76463e9d41e0fe44fecd6f48671cb2a2d280d81.bn.png
new file mode 100644
index 000000000..17be6837a
Binary files /dev/null and b/translated_images/individual-causal-what-if.00e7b86b52a083cea6344c73c76463e9d41e0fe44fecd6f48671cb2a2d280d81.bn.png differ
diff --git a/translated_images/individual-causal-what-if.00e7b86b52a083cea6344c73c76463e9d41e0fe44fecd6f48671cb2a2d280d81.br.png b/translated_images/individual-causal-what-if.00e7b86b52a083cea6344c73c76463e9d41e0fe44fecd6f48671cb2a2d280d81.br.png
new file mode 100644
index 000000000..17be6837a
Binary files /dev/null and b/translated_images/individual-causal-what-if.00e7b86b52a083cea6344c73c76463e9d41e0fe44fecd6f48671cb2a2d280d81.br.png differ
diff --git a/translated_images/jack-o-lanterns.181c661a9212457d7756f37219f660f1358af27554d856e5a991f16b4e15337c.bn.jpg b/translated_images/jack-o-lanterns.181c661a9212457d7756f37219f660f1358af27554d856e5a991f16b4e15337c.bn.jpg
new file mode 100644
index 000000000..97b3aa950
Binary files /dev/null and b/translated_images/jack-o-lanterns.181c661a9212457d7756f37219f660f1358af27554d856e5a991f16b4e15337c.bn.jpg differ
diff --git a/translated_images/jack-o-lanterns.181c661a9212457d7756f37219f660f1358af27554d856e5a991f16b4e15337c.br.jpg b/translated_images/jack-o-lanterns.181c661a9212457d7756f37219f660f1358af27554d856e5a991f16b4e15337c.br.jpg
new file mode 100644
index 000000000..97b3aa950
Binary files /dev/null and b/translated_images/jack-o-lanterns.181c661a9212457d7756f37219f660f1358af27554d856e5a991f16b4e15337c.br.jpg differ
diff --git a/translated_images/janitor.e4a77dd3d3e6a32e25327090b8a9c00dc7cf459c44fa9f184c5ecb0d48ce3794.bn.jpg b/translated_images/janitor.e4a77dd3d3e6a32e25327090b8a9c00dc7cf459c44fa9f184c5ecb0d48ce3794.bn.jpg
new file mode 100644
index 000000000..cccf08c43
Binary files /dev/null and b/translated_images/janitor.e4a77dd3d3e6a32e25327090b8a9c00dc7cf459c44fa9f184c5ecb0d48ce3794.bn.jpg differ
diff --git a/translated_images/janitor.e4a77dd3d3e6a32e25327090b8a9c00dc7cf459c44fa9f184c5ecb0d48ce3794.br.jpg b/translated_images/janitor.e4a77dd3d3e6a32e25327090b8a9c00dc7cf459c44fa9f184c5ecb0d48ce3794.br.jpg
new file mode 100644
index 000000000..cccf08c43
Binary files /dev/null and b/translated_images/janitor.e4a77dd3d3e6a32e25327090b8a9c00dc7cf459c44fa9f184c5ecb0d48ce3794.br.jpg differ
diff --git a/translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.bn.png b/translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.bn.png
new file mode 100644
index 000000000..cfdf5122d
Binary files /dev/null and b/translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.bn.png differ
diff --git a/translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.br.png b/translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.br.png
new file mode 100644
index 000000000..cfdf5122d
Binary files /dev/null and b/translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.br.png differ
diff --git a/translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.bn.png b/translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.bn.png
new file mode 100644
index 000000000..fe1c23bf3
Binary files /dev/null and b/translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.bn.png differ
diff --git a/translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.br.png b/translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.br.png
new file mode 100644
index 000000000..fe1c23bf3
Binary files /dev/null and b/translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.br.png differ
diff --git a/translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.bn.png b/translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.bn.png
new file mode 100644
index 000000000..1cdc61d30
Binary files /dev/null and b/translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.bn.png differ
diff --git a/translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.br.png b/translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.br.png
new file mode 100644
index 000000000..1cdc61d30
Binary files /dev/null and b/translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.br.png differ
diff --git a/translated_images/learned.ed28bcd8484b5287a31925c96c43b43e2c2bb876b8ca41a0e1e754f77bb3db20.bn.png b/translated_images/learned.ed28bcd8484b5287a31925c96c43b43e2c2bb876b8ca41a0e1e754f77bb3db20.bn.png
new file mode 100644
index 000000000..0fc22438a
Binary files /dev/null and b/translated_images/learned.ed28bcd8484b5287a31925c96c43b43e2c2bb876b8ca41a0e1e754f77bb3db20.bn.png differ
diff --git a/translated_images/learned.ed28bcd8484b5287a31925c96c43b43e2c2bb876b8ca41a0e1e754f77bb3db20.br.png b/translated_images/learned.ed28bcd8484b5287a31925c96c43b43e2c2bb876b8ca41a0e1e754f77bb3db20.br.png
new file mode 100644
index 000000000..0fc22438a
Binary files /dev/null and b/translated_images/learned.ed28bcd8484b5287a31925c96c43b43e2c2bb876b8ca41a0e1e754f77bb3db20.br.png differ
diff --git a/translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.bn.png b/translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.bn.png
new file mode 100644
index 000000000..7e7da0343
Binary files /dev/null and b/translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.bn.png differ
diff --git a/translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.br.png b/translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.br.png
new file mode 100644
index 000000000..7e7da0343
Binary files /dev/null and b/translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.br.png differ
diff --git a/translated_images/linear-results.f7c3552c85b0ed1ce2808276c870656733f6878c8fd37ec220812ee77686c3ef.bn.png b/translated_images/linear-results.f7c3552c85b0ed1ce2808276c870656733f6878c8fd37ec220812ee77686c3ef.bn.png
new file mode 100644
index 000000000..2b636a72e
Binary files /dev/null and b/translated_images/linear-results.f7c3552c85b0ed1ce2808276c870656733f6878c8fd37ec220812ee77686c3ef.bn.png differ
diff --git a/translated_images/linear-results.f7c3552c85b0ed1ce2808276c870656733f6878c8fd37ec220812ee77686c3ef.br.png b/translated_images/linear-results.f7c3552c85b0ed1ce2808276c870656733f6878c8fd37ec220812ee77686c3ef.br.png
new file mode 100644
index 000000000..2b636a72e
Binary files /dev/null and b/translated_images/linear-results.f7c3552c85b0ed1ce2808276c870656733f6878c8fd37ec220812ee77686c3ef.br.png differ
diff --git a/translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.bn.png b/translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.bn.png
new file mode 100644
index 000000000..cae05d6af
Binary files /dev/null and b/translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.bn.png differ
diff --git a/translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.br.png b/translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.br.png
new file mode 100644
index 000000000..cae05d6af
Binary files /dev/null and b/translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.br.png differ
diff --git a/translated_images/linear.a1b0760a56132551947c85988ff1753b2bccea6c29097394744d3f8a986ac3bf.bn.png b/translated_images/linear.a1b0760a56132551947c85988ff1753b2bccea6c29097394744d3f8a986ac3bf.bn.png
new file mode 100644
index 000000000..fd72fdf81
Binary files /dev/null and b/translated_images/linear.a1b0760a56132551947c85988ff1753b2bccea6c29097394744d3f8a986ac3bf.bn.png differ
diff --git a/translated_images/linear.a1b0760a56132551947c85988ff1753b2bccea6c29097394744d3f8a986ac3bf.br.png b/translated_images/linear.a1b0760a56132551947c85988ff1753b2bccea6c29097394744d3f8a986ac3bf.br.png
new file mode 100644
index 000000000..fd72fdf81
Binary files /dev/null and b/translated_images/linear.a1b0760a56132551947c85988ff1753b2bccea6c29097394744d3f8a986ac3bf.br.png differ
diff --git a/translated_images/lobe.2fa0806408ef9923ad81b63f5094b5d832a2e52227c4f0abb9fef6e1132fde15.bn.png b/translated_images/lobe.2fa0806408ef9923ad81b63f5094b5d832a2e52227c4f0abb9fef6e1132fde15.bn.png
new file mode 100644
index 000000000..73ca29080
Binary files /dev/null and b/translated_images/lobe.2fa0806408ef9923ad81b63f5094b5d832a2e52227c4f0abb9fef6e1132fde15.bn.png differ
diff --git a/translated_images/lobe.2fa0806408ef9923ad81b63f5094b5d832a2e52227c4f0abb9fef6e1132fde15.br.png b/translated_images/lobe.2fa0806408ef9923ad81b63f5094b5d832a2e52227c4f0abb9fef6e1132fde15.br.png
new file mode 100644
index 000000000..73ca29080
Binary files /dev/null and b/translated_images/lobe.2fa0806408ef9923ad81b63f5094b5d832a2e52227c4f0abb9fef6e1132fde15.br.png differ
diff --git a/translated_images/logistic-linear.0f2f6bb73b3134c1b1463fb22452aefe74b21b7c357ddccac31831a836dcce73.bn.png b/translated_images/logistic-linear.0f2f6bb73b3134c1b1463fb22452aefe74b21b7c357ddccac31831a836dcce73.bn.png
new file mode 100644
index 000000000..46e4c00ec
Binary files /dev/null and b/translated_images/logistic-linear.0f2f6bb73b3134c1b1463fb22452aefe74b21b7c357ddccac31831a836dcce73.bn.png differ
diff --git a/translated_images/logistic-linear.0f2f6bb73b3134c1b1463fb22452aefe74b21b7c357ddccac31831a836dcce73.br.png b/translated_images/logistic-linear.0f2f6bb73b3134c1b1463fb22452aefe74b21b7c357ddccac31831a836dcce73.br.png
new file mode 100644
index 000000000..46e4c00ec
Binary files /dev/null and b/translated_images/logistic-linear.0f2f6bb73b3134c1b1463fb22452aefe74b21b7c357ddccac31831a836dcce73.br.png differ
diff --git a/translated_images/logistic.b0cba6b7db4d57899f5a6ae74876bd34a0bd5dc492458b80b3293e948fa46a2d.bn.png b/translated_images/logistic.b0cba6b7db4d57899f5a6ae74876bd34a0bd5dc492458b80b3293e948fa46a2d.bn.png
new file mode 100644
index 000000000..d745453cd
Binary files /dev/null and b/translated_images/logistic.b0cba6b7db4d57899f5a6ae74876bd34a0bd5dc492458b80b3293e948fa46a2d.bn.png differ
diff --git a/translated_images/logistic.b0cba6b7db4d57899f5a6ae74876bd34a0bd5dc492458b80b3293e948fa46a2d.br.png b/translated_images/logistic.b0cba6b7db4d57899f5a6ae74876bd34a0bd5dc492458b80b3293e948fa46a2d.br.png
new file mode 100644
index 000000000..d745453cd
Binary files /dev/null and b/translated_images/logistic.b0cba6b7db4d57899f5a6ae74876bd34a0bd5dc492458b80b3293e948fa46a2d.br.png differ
diff --git a/translated_images/lpathlen.94f211521ed609400dc64c3d8423b9effc5406f33d2648d0002c14c04ba820c1.bn.png b/translated_images/lpathlen.94f211521ed609400dc64c3d8423b9effc5406f33d2648d0002c14c04ba820c1.bn.png
new file mode 100644
index 000000000..3d6401011
Binary files /dev/null and b/translated_images/lpathlen.94f211521ed609400dc64c3d8423b9effc5406f33d2648d0002c14c04ba820c1.bn.png differ
diff --git a/translated_images/lpathlen.94f211521ed609400dc64c3d8423b9effc5406f33d2648d0002c14c04ba820c1.br.png b/translated_images/lpathlen.94f211521ed609400dc64c3d8423b9effc5406f33d2648d0002c14c04ba820c1.br.png
new file mode 100644
index 000000000..3d6401011
Binary files /dev/null and b/translated_images/lpathlen.94f211521ed609400dc64c3d8423b9effc5406f33d2648d0002c14c04ba820c1.br.png differ
diff --git a/translated_images/lpathlen1.0534784add58d4ebf25c21d4a1da9bceab4f96743a35817f1b49ab963c64c572.bn.png b/translated_images/lpathlen1.0534784add58d4ebf25c21d4a1da9bceab4f96743a35817f1b49ab963c64c572.bn.png
new file mode 100644
index 000000000..ca5ced7c0
Binary files /dev/null and b/translated_images/lpathlen1.0534784add58d4ebf25c21d4a1da9bceab4f96743a35817f1b49ab963c64c572.bn.png differ
diff --git a/translated_images/lpathlen1.0534784add58d4ebf25c21d4a1da9bceab4f96743a35817f1b49ab963c64c572.br.png b/translated_images/lpathlen1.0534784add58d4ebf25c21d4a1da9bceab4f96743a35817f1b49ab963c64c572.br.png
new file mode 100644
index 000000000..ca5ced7c0
Binary files /dev/null and b/translated_images/lpathlen1.0534784add58d4ebf25c21d4a1da9bceab4f96743a35817f1b49ab963c64c572.br.png differ
diff --git a/translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.bn.png b/translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.bn.png
new file mode 100644
index 000000000..484731132
Binary files /dev/null and b/translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.bn.png differ
diff --git a/translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.br.png b/translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.br.png
new file mode 100644
index 000000000..484731132
Binary files /dev/null and b/translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.br.png differ
diff --git a/translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.bn.png b/translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.bn.png
new file mode 100644
index 000000000..6a061bf4d
Binary files /dev/null and b/translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.bn.png differ
diff --git a/translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.br.png b/translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.br.png
new file mode 100644
index 000000000..6a061bf4d
Binary files /dev/null and b/translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.br.png differ
diff --git a/translated_images/ml-fairness.ef296ebec6afc98a44566d7b6c1ed18dc2bf1115c13ec679bb626028e852fa1d.bn.png b/translated_images/ml-fairness.ef296ebec6afc98a44566d7b6c1ed18dc2bf1115c13ec679bb626028e852fa1d.bn.png
new file mode 100644
index 000000000..713b55034
Binary files /dev/null and b/translated_images/ml-fairness.ef296ebec6afc98a44566d7b6c1ed18dc2bf1115c13ec679bb626028e852fa1d.bn.png differ
diff --git a/translated_images/ml-fairness.ef296ebec6afc98a44566d7b6c1ed18dc2bf1115c13ec679bb626028e852fa1d.br.png b/translated_images/ml-fairness.ef296ebec6afc98a44566d7b6c1ed18dc2bf1115c13ec679bb626028e852fa1d.br.png
new file mode 100644
index 000000000..713b55034
Binary files /dev/null and b/translated_images/ml-fairness.ef296ebec6afc98a44566d7b6c1ed18dc2bf1115c13ec679bb626028e852fa1d.br.png differ
diff --git a/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.bn.png b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.bn.png
new file mode 100644
index 000000000..966c1b8c0
Binary files /dev/null and b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.bn.png differ
diff --git a/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.br.png b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.br.png
new file mode 100644
index 000000000..966c1b8c0
Binary files /dev/null and b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.br.png differ
diff --git a/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.it.png b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.it.png
new file mode 100644
index 000000000..966c1b8c0
Binary files /dev/null and b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.it.png differ
diff --git a/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.mo.png b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.mo.png
new file mode 100644
index 000000000..966c1b8c0
Binary files /dev/null and b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.mo.png differ
diff --git a/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.ru.png b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.ru.png
new file mode 100644
index 000000000..966c1b8c0
Binary files /dev/null and b/translated_images/ml-for-beginners-video-banner.63f694a100034bc6251134294459696e070a3a9a04632e9fe6a24aa0de4a7384.ru.png differ
diff --git a/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.bn.png b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.bn.png
new file mode 100644
index 000000000..2b2904a4b
Binary files /dev/null and b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.bn.png differ
diff --git a/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.br.png b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.br.png
new file mode 100644
index 000000000..2b2904a4b
Binary files /dev/null and b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.br.png differ
diff --git a/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.it.png b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.it.png
new file mode 100644
index 000000000..2b2904a4b
Binary files /dev/null and b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.it.png differ
diff --git a/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.mo.png b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.mo.png
new file mode 100644
index 000000000..2b2904a4b
Binary files /dev/null and b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.mo.png differ
diff --git a/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.ru.png b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.ru.png
new file mode 100644
index 000000000..2b2904a4b
Binary files /dev/null and b/translated_images/ml-for-beginners.9eecb963dbfbfb322dbf4d68360828af4abaf00a40e117c78d08605412dd3f31.ru.png differ
diff --git a/translated_images/ml-history.a1bdfd4ce1f464d9a0502f38d355ffda384c95cd5278297a46c9a391b5053bc4.bn.png b/translated_images/ml-history.a1bdfd4ce1f464d9a0502f38d355ffda384c95cd5278297a46c9a391b5053bc4.bn.png
new file mode 100644
index 000000000..b79ba265c
Binary files /dev/null and b/translated_images/ml-history.a1bdfd4ce1f464d9a0502f38d355ffda384c95cd5278297a46c9a391b5053bc4.bn.png differ
diff --git a/translated_images/ml-history.a1bdfd4ce1f464d9a0502f38d355ffda384c95cd5278297a46c9a391b5053bc4.br.png b/translated_images/ml-history.a1bdfd4ce1f464d9a0502f38d355ffda384c95cd5278297a46c9a391b5053bc4.br.png
new file mode 100644
index 000000000..b79ba265c
Binary files /dev/null and b/translated_images/ml-history.a1bdfd4ce1f464d9a0502f38d355ffda384c95cd5278297a46c9a391b5053bc4.br.png differ
diff --git a/translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.bn.png b/translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.bn.png
new file mode 100644
index 000000000..9bd65dae9
Binary files /dev/null and b/translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.bn.png differ
diff --git a/translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.br.png b/translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.br.png
new file mode 100644
index 000000000..9bd65dae9
Binary files /dev/null and b/translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.br.png differ
diff --git a/translated_images/ml-regression.4e4f70e3b3ed446e3ace348dec973e133fa5d3680fbc8412b61879507369b98d.bn.png b/translated_images/ml-regression.4e4f70e3b3ed446e3ace348dec973e133fa5d3680fbc8412b61879507369b98d.bn.png
new file mode 100644
index 000000000..a6a94731a
Binary files /dev/null and b/translated_images/ml-regression.4e4f70e3b3ed446e3ace348dec973e133fa5d3680fbc8412b61879507369b98d.bn.png differ
diff --git a/translated_images/ml-regression.4e4f70e3b3ed446e3ace348dec973e133fa5d3680fbc8412b61879507369b98d.br.png b/translated_images/ml-regression.4e4f70e3b3ed446e3ace348dec973e133fa5d3680fbc8412b61879507369b98d.br.png
new file mode 100644
index 000000000..a6a94731a
Binary files /dev/null and b/translated_images/ml-regression.4e4f70e3b3ed446e3ace348dec973e133fa5d3680fbc8412b61879507369b98d.br.png differ
diff --git a/translated_images/ml-reinforcement.94024374d63348dbb3571c343ca7ddabef72adac0b8086d47164b769ba3a8a1d.bn.png b/translated_images/ml-reinforcement.94024374d63348dbb3571c343ca7ddabef72adac0b8086d47164b769ba3a8a1d.bn.png
new file mode 100644
index 000000000..a6dfbc88c
Binary files /dev/null and b/translated_images/ml-reinforcement.94024374d63348dbb3571c343ca7ddabef72adac0b8086d47164b769ba3a8a1d.bn.png differ
diff --git a/translated_images/ml-reinforcement.94024374d63348dbb3571c343ca7ddabef72adac0b8086d47164b769ba3a8a1d.br.png b/translated_images/ml-reinforcement.94024374d63348dbb3571c343ca7ddabef72adac0b8086d47164b769ba3a8a1d.br.png
new file mode 100644
index 000000000..a6dfbc88c
Binary files /dev/null and b/translated_images/ml-reinforcement.94024374d63348dbb3571c343ca7ddabef72adac0b8086d47164b769ba3a8a1d.br.png differ
diff --git a/translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.bn.png b/translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.bn.png
new file mode 100644
index 000000000..d4259d60d
Binary files /dev/null and b/translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.bn.png differ
diff --git a/translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.br.png b/translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.br.png
new file mode 100644
index 000000000..d4259d60d
Binary files /dev/null and b/translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.br.png differ
diff --git a/translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.bn.png b/translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.bn.png
new file mode 100644
index 000000000..673aeaca4
Binary files /dev/null and b/translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.bn.png differ
diff --git a/translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.br.png b/translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.br.png
new file mode 100644
index 000000000..673aeaca4
Binary files /dev/null and b/translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.br.png differ
diff --git a/translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.bn.png b/translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.bn.png
new file mode 100644
index 000000000..c8f514d41
Binary files /dev/null and b/translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.bn.png differ
diff --git a/translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.br.png b/translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.br.png
new file mode 100644
index 000000000..c8f514d41
Binary files /dev/null and b/translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.br.png differ
diff --git a/translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.bn.png b/translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.bn.png
new file mode 100644
index 000000000..b8c9c5044
Binary files /dev/null and b/translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.bn.png differ
diff --git a/translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.br.png b/translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.br.png
new file mode 100644
index 000000000..b8c9c5044
Binary files /dev/null and b/translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.br.png differ
diff --git a/translated_images/mountaincar.43d56e588ce581c2d035f28cf038a9af112bec043b2ef8da40ac86119b1e3a93.bn.png b/translated_images/mountaincar.43d56e588ce581c2d035f28cf038a9af112bec043b2ef8da40ac86119b1e3a93.bn.png
new file mode 100644
index 000000000..f84dfd1a0
Binary files /dev/null and b/translated_images/mountaincar.43d56e588ce581c2d035f28cf038a9af112bec043b2ef8da40ac86119b1e3a93.bn.png differ
diff --git a/translated_images/mountaincar.43d56e588ce581c2d035f28cf038a9af112bec043b2ef8da40ac86119b1e3a93.br.png b/translated_images/mountaincar.43d56e588ce581c2d035f28cf038a9af112bec043b2ef8da40ac86119b1e3a93.br.png
new file mode 100644
index 000000000..f84dfd1a0
Binary files /dev/null and b/translated_images/mountaincar.43d56e588ce581c2d035f28cf038a9af112bec043b2ef8da40ac86119b1e3a93.br.png differ
diff --git a/translated_images/multinomial-ordinal.944fe02295fd6cdffa68facf540d0534c6f428a5d906edc40507cda4356950ee.bn.png b/translated_images/multinomial-ordinal.944fe02295fd6cdffa68facf540d0534c6f428a5d906edc40507cda4356950ee.bn.png
new file mode 100644
index 000000000..a9d28008e
Binary files /dev/null and b/translated_images/multinomial-ordinal.944fe02295fd6cdffa68facf540d0534c6f428a5d906edc40507cda4356950ee.bn.png differ
diff --git a/translated_images/multinomial-ordinal.944fe02295fd6cdffa68facf540d0534c6f428a5d906edc40507cda4356950ee.br.png b/translated_images/multinomial-ordinal.944fe02295fd6cdffa68facf540d0534c6f428a5d906edc40507cda4356950ee.br.png
new file mode 100644
index 000000000..a9d28008e
Binary files /dev/null and b/translated_images/multinomial-ordinal.944fe02295fd6cdffa68facf540d0534c6f428a5d906edc40507cda4356950ee.br.png differ
diff --git a/translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.bn.png b/translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.bn.png
new file mode 100644
index 000000000..8e9246960
Binary files /dev/null and b/translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.bn.png differ
diff --git a/translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.br.png b/translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.br.png
new file mode 100644
index 000000000..8e9246960
Binary files /dev/null and b/translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.br.png differ
diff --git a/translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.bn.png b/translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.bn.png
new file mode 100644
index 000000000..29e55a863
Binary files /dev/null and b/translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.bn.png differ
diff --git a/translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.br.png b/translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.br.png
new file mode 100644
index 000000000..29e55a863
Binary files /dev/null and b/translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.br.png differ
diff --git a/translated_images/notebook.4a3ee31f396b88325607afda33cadcc6368de98040ff33942424260aa84d75f2.bn.jpg b/translated_images/notebook.4a3ee31f396b88325607afda33cadcc6368de98040ff33942424260aa84d75f2.bn.jpg
new file mode 100644
index 000000000..d1e4f52d6
Binary files /dev/null and b/translated_images/notebook.4a3ee31f396b88325607afda33cadcc6368de98040ff33942424260aa84d75f2.bn.jpg differ
diff --git a/translated_images/notebook.4a3ee31f396b88325607afda33cadcc6368de98040ff33942424260aa84d75f2.br.jpg b/translated_images/notebook.4a3ee31f396b88325607afda33cadcc6368de98040ff33942424260aa84d75f2.br.jpg
new file mode 100644
index 000000000..d1e4f52d6
Binary files /dev/null and b/translated_images/notebook.4a3ee31f396b88325607afda33cadcc6368de98040ff33942424260aa84d75f2.br.jpg differ
diff --git a/translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.bn.png b/translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.bn.png
new file mode 100644
index 000000000..14649e72f
Binary files /dev/null and b/translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.bn.png differ
diff --git a/translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.br.png b/translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.br.png
new file mode 100644
index 000000000..14649e72f
Binary files /dev/null and b/translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.br.png differ
diff --git a/translated_images/overfitting.1c132d92bfd93cb63240baf63ebdf82c30e30a0a44e1ad49861b82ff600c2b5c.bn.png b/translated_images/overfitting.1c132d92bfd93cb63240baf63ebdf82c30e30a0a44e1ad49861b82ff600c2b5c.bn.png
new file mode 100644
index 000000000..65dc241c5
Binary files /dev/null and b/translated_images/overfitting.1c132d92bfd93cb63240baf63ebdf82c30e30a0a44e1ad49861b82ff600c2b5c.bn.png differ
diff --git a/translated_images/overfitting.1c132d92bfd93cb63240baf63ebdf82c30e30a0a44e1ad49861b82ff600c2b5c.br.png b/translated_images/overfitting.1c132d92bfd93cb63240baf63ebdf82c30e30a0a44e1ad49861b82ff600c2b5c.br.png
new file mode 100644
index 000000000..65dc241c5
Binary files /dev/null and b/translated_images/overfitting.1c132d92bfd93cb63240baf63ebdf82c30e30a0a44e1ad49861b82ff600c2b5c.br.png differ
diff --git a/translated_images/p&p.279f1c49ecd889419e4ce6206525e9aa30d32a976955cd24daa636c361c6391f.bn.jpg b/translated_images/p&p.279f1c49ecd889419e4ce6206525e9aa30d32a976955cd24daa636c361c6391f.bn.jpg
new file mode 100644
index 000000000..81cca6e4c
Binary files /dev/null and b/translated_images/p&p.279f1c49ecd889419e4ce6206525e9aa30d32a976955cd24daa636c361c6391f.bn.jpg differ
diff --git a/translated_images/p&p.279f1c49ecd889419e4ce6206525e9aa30d32a976955cd24daa636c361c6391f.br.jpg b/translated_images/p&p.279f1c49ecd889419e4ce6206525e9aa30d32a976955cd24daa636c361c6391f.br.jpg
new file mode 100644
index 000000000..81cca6e4c
Binary files /dev/null and b/translated_images/p&p.279f1c49ecd889419e4ce6206525e9aa30d32a976955cd24daa636c361c6391f.br.jpg differ
diff --git a/translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.bn.png b/translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.bn.png
new file mode 100644
index 000000000..f78d1dc36
Binary files /dev/null and b/translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.bn.png differ
diff --git a/translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.br.png b/translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.br.png
new file mode 100644
index 000000000..f78d1dc36
Binary files /dev/null and b/translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.br.png differ
diff --git a/translated_images/parsnip.cd2ce92622976502a80714e69ce67e3f2da3274a9ef5ac484c1308c5f3cb0f4a.bn.jpg b/translated_images/parsnip.cd2ce92622976502a80714e69ce67e3f2da3274a9ef5ac484c1308c5f3cb0f4a.bn.jpg
new file mode 100644
index 000000000..f25b446ec
Binary files /dev/null and b/translated_images/parsnip.cd2ce92622976502a80714e69ce67e3f2da3274a9ef5ac484c1308c5f3cb0f4a.bn.jpg differ
diff --git a/translated_images/parsnip.cd2ce92622976502a80714e69ce67e3f2da3274a9ef5ac484c1308c5f3cb0f4a.br.jpg b/translated_images/parsnip.cd2ce92622976502a80714e69ce67e3f2da3274a9ef5ac484c1308c5f3cb0f4a.br.jpg
new file mode 100644
index 000000000..f25b446ec
Binary files /dev/null and b/translated_images/parsnip.cd2ce92622976502a80714e69ce67e3f2da3274a9ef5ac484c1308c5f3cb0f4a.br.jpg differ
diff --git a/translated_images/peter.779730f9ba3a8a8d9290600dcf55f2e491c0640c785af7ac0d64f583c49b8864.bn.png b/translated_images/peter.779730f9ba3a8a8d9290600dcf55f2e491c0640c785af7ac0d64f583c49b8864.bn.png
new file mode 100644
index 000000000..43581e5f3
Binary files /dev/null and b/translated_images/peter.779730f9ba3a8a8d9290600dcf55f2e491c0640c785af7ac0d64f583c49b8864.bn.png differ
diff --git a/translated_images/peter.779730f9ba3a8a8d9290600dcf55f2e491c0640c785af7ac0d64f583c49b8864.br.png b/translated_images/peter.779730f9ba3a8a8d9290600dcf55f2e491c0640c785af7ac0d64f583c49b8864.br.png
new file mode 100644
index 000000000..43581e5f3
Binary files /dev/null and b/translated_images/peter.779730f9ba3a8a8d9290600dcf55f2e491c0640c785af7ac0d64f583c49b8864.br.png differ
diff --git a/translated_images/pie-pumpkins-scatter.d14f9804a53f927e7fe39aa072486f4ed1bdd7f31c8bb08f476855f4b02350c3.bn.png b/translated_images/pie-pumpkins-scatter.d14f9804a53f927e7fe39aa072486f4ed1bdd7f31c8bb08f476855f4b02350c3.bn.png
new file mode 100644
index 000000000..06ab9e06b
Binary files /dev/null and b/translated_images/pie-pumpkins-scatter.d14f9804a53f927e7fe39aa072486f4ed1bdd7f31c8bb08f476855f4b02350c3.bn.png differ
diff --git a/translated_images/pie-pumpkins-scatter.d14f9804a53f927e7fe39aa072486f4ed1bdd7f31c8bb08f476855f4b02350c3.br.png b/translated_images/pie-pumpkins-scatter.d14f9804a53f927e7fe39aa072486f4ed1bdd7f31c8bb08f476855f4b02350c3.br.png
new file mode 100644
index 000000000..06ab9e06b
Binary files /dev/null and b/translated_images/pie-pumpkins-scatter.d14f9804a53f927e7fe39aa072486f4ed1bdd7f31c8bb08f476855f4b02350c3.br.png differ
diff --git a/translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.bn.png b/translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.bn.png
new file mode 100644
index 000000000..e66b95652
Binary files /dev/null and b/translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.bn.png differ
diff --git a/translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.br.png b/translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.br.png
new file mode 100644
index 000000000..e66b95652
Binary files /dev/null and b/translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.br.png differ
diff --git a/translated_images/poly-results.ee587348f0f1f60bd16c471321b0b2f2457d0eaa99d99ec0ced4affc900fa96c.bn.png b/translated_images/poly-results.ee587348f0f1f60bd16c471321b0b2f2457d0eaa99d99ec0ced4affc900fa96c.bn.png
new file mode 100644
index 000000000..f6ee37ec1
Binary files /dev/null and b/translated_images/poly-results.ee587348f0f1f60bd16c471321b0b2f2457d0eaa99d99ec0ced4affc900fa96c.bn.png differ
diff --git a/translated_images/poly-results.ee587348f0f1f60bd16c471321b0b2f2457d0eaa99d99ec0ced4affc900fa96c.br.png b/translated_images/poly-results.ee587348f0f1f60bd16c471321b0b2f2457d0eaa99d99ec0ced4affc900fa96c.br.png
new file mode 100644
index 000000000..f6ee37ec1
Binary files /dev/null and b/translated_images/poly-results.ee587348f0f1f60bd16c471321b0b2f2457d0eaa99d99ec0ced4affc900fa96c.br.png differ
diff --git a/translated_images/polynomial.8fce4663e7283dfb9864eef62255b57cc2799e187c6d0a6dbfcf29fec6e52faa.bn.png b/translated_images/polynomial.8fce4663e7283dfb9864eef62255b57cc2799e187c6d0a6dbfcf29fec6e52faa.bn.png
new file mode 100644
index 000000000..bdf4f7ffe
Binary files /dev/null and b/translated_images/polynomial.8fce4663e7283dfb9864eef62255b57cc2799e187c6d0a6dbfcf29fec6e52faa.bn.png differ
diff --git a/translated_images/polynomial.8fce4663e7283dfb9864eef62255b57cc2799e187c6d0a6dbfcf29fec6e52faa.br.png b/translated_images/polynomial.8fce4663e7283dfb9864eef62255b57cc2799e187c6d0a6dbfcf29fec6e52faa.br.png
new file mode 100644
index 000000000..bdf4f7ffe
Binary files /dev/null and b/translated_images/polynomial.8fce4663e7283dfb9864eef62255b57cc2799e187c6d0a6dbfcf29fec6e52faa.br.png differ
diff --git a/translated_images/popular.9c48d84b3386705f98bf44e26e9655bee9eb7c849d73be65195e37895bfedb5d.bn.png b/translated_images/popular.9c48d84b3386705f98bf44e26e9655bee9eb7c849d73be65195e37895bfedb5d.bn.png
new file mode 100644
index 000000000..384e2d9e3
Binary files /dev/null and b/translated_images/popular.9c48d84b3386705f98bf44e26e9655bee9eb7c849d73be65195e37895bfedb5d.bn.png differ
diff --git a/translated_images/popular.9c48d84b3386705f98bf44e26e9655bee9eb7c849d73be65195e37895bfedb5d.br.png b/translated_images/popular.9c48d84b3386705f98bf44e26e9655bee9eb7c849d73be65195e37895bfedb5d.br.png
new file mode 100644
index 000000000..384e2d9e3
Binary files /dev/null and b/translated_images/popular.9c48d84b3386705f98bf44e26e9655bee9eb7c849d73be65195e37895bfedb5d.br.png differ
diff --git a/translated_images/price-by-variety.744a2f9925d9bcb43a9a8c69469ce2520c9524fabfa270b1b2422cc2450d6d11.bn.png b/translated_images/price-by-variety.744a2f9925d9bcb43a9a8c69469ce2520c9524fabfa270b1b2422cc2450d6d11.bn.png
new file mode 100644
index 000000000..11efe5d61
Binary files /dev/null and b/translated_images/price-by-variety.744a2f9925d9bcb43a9a8c69469ce2520c9524fabfa270b1b2422cc2450d6d11.bn.png differ
diff --git a/translated_images/price-by-variety.744a2f9925d9bcb43a9a8c69469ce2520c9524fabfa270b1b2422cc2450d6d11.br.png b/translated_images/price-by-variety.744a2f9925d9bcb43a9a8c69469ce2520c9524fabfa270b1b2422cc2450d6d11.br.png
new file mode 100644
index 000000000..11efe5d61
Binary files /dev/null and b/translated_images/price-by-variety.744a2f9925d9bcb43a9a8c69469ce2520c9524fabfa270b1b2422cc2450d6d11.br.png differ
diff --git a/translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.bn.png b/translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.bn.png
new file mode 100644
index 000000000..55a81a2f3
Binary files /dev/null and b/translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.bn.png differ
diff --git a/translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.br.png b/translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.br.png
new file mode 100644
index 000000000..55a81a2f3
Binary files /dev/null and b/translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.br.png differ
diff --git a/translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.bn.png b/translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.bn.png
new file mode 100644
index 000000000..3e303968f
Binary files /dev/null and b/translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.bn.png differ
diff --git a/translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.br.png b/translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.br.png
new file mode 100644
index 000000000..3e303968f
Binary files /dev/null and b/translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.br.png differ
diff --git a/translated_images/pumpkins_catplot_1.c55c409b71fea2ecc01921e64b91970542101f90bcccfa4aa3a205db8936f48b.bn.png b/translated_images/pumpkins_catplot_1.c55c409b71fea2ecc01921e64b91970542101f90bcccfa4aa3a205db8936f48b.bn.png
new file mode 100644
index 000000000..01a2dc518
Binary files /dev/null and b/translated_images/pumpkins_catplot_1.c55c409b71fea2ecc01921e64b91970542101f90bcccfa4aa3a205db8936f48b.bn.png differ
diff --git a/translated_images/pumpkins_catplot_1.c55c409b71fea2ecc01921e64b91970542101f90bcccfa4aa3a205db8936f48b.br.png b/translated_images/pumpkins_catplot_1.c55c409b71fea2ecc01921e64b91970542101f90bcccfa4aa3a205db8936f48b.br.png
new file mode 100644
index 000000000..01a2dc518
Binary files /dev/null and b/translated_images/pumpkins_catplot_1.c55c409b71fea2ecc01921e64b91970542101f90bcccfa4aa3a205db8936f48b.br.png differ
diff --git a/translated_images/pumpkins_catplot_2.87a354447880b3889278155957f8f60dd63db4598de5a6d0fda91c334d31f9f1.bn.png b/translated_images/pumpkins_catplot_2.87a354447880b3889278155957f8f60dd63db4598de5a6d0fda91c334d31f9f1.bn.png
new file mode 100644
index 000000000..7de8e90f5
Binary files /dev/null and b/translated_images/pumpkins_catplot_2.87a354447880b3889278155957f8f60dd63db4598de5a6d0fda91c334d31f9f1.bn.png differ
diff --git a/translated_images/pumpkins_catplot_2.87a354447880b3889278155957f8f60dd63db4598de5a6d0fda91c334d31f9f1.br.png b/translated_images/pumpkins_catplot_2.87a354447880b3889278155957f8f60dd63db4598de5a6d0fda91c334d31f9f1.br.png
new file mode 100644
index 000000000..7de8e90f5
Binary files /dev/null and b/translated_images/pumpkins_catplot_2.87a354447880b3889278155957f8f60dd63db4598de5a6d0fda91c334d31f9f1.br.png differ
diff --git a/translated_images/r_learners_sm.cd14eb3581a9f28d32086cc042ee8c46f621a5b4e0d59c75f7c642d891327043.bn.jpeg b/translated_images/r_learners_sm.cd14eb3581a9f28d32086cc042ee8c46f621a5b4e0d59c75f7c642d891327043.bn.jpeg
new file mode 100644
index 000000000..2d42e2f24
Binary files /dev/null and b/translated_images/r_learners_sm.cd14eb3581a9f28d32086cc042ee8c46f621a5b4e0d59c75f7c642d891327043.bn.jpeg differ
diff --git a/translated_images/r_learners_sm.cd14eb3581a9f28d32086cc042ee8c46f621a5b4e0d59c75f7c642d891327043.br.jpeg b/translated_images/r_learners_sm.cd14eb3581a9f28d32086cc042ee8c46f621a5b4e0d59c75f7c642d891327043.br.jpeg
new file mode 100644
index 000000000..2d42e2f24
Binary files /dev/null and b/translated_images/r_learners_sm.cd14eb3581a9f28d32086cc042ee8c46f621a5b4e0d59c75f7c642d891327043.br.jpeg differ
diff --git a/translated_images/r_learners_sm.e25fa9c205b3a3f98d66476321637b48f61d9c23526309ce82d0a43e88b90f66.bn.jpeg b/translated_images/r_learners_sm.e25fa9c205b3a3f98d66476321637b48f61d9c23526309ce82d0a43e88b90f66.bn.jpeg
new file mode 100644
index 000000000..2d42e2f24
Binary files /dev/null and b/translated_images/r_learners_sm.e25fa9c205b3a3f98d66476321637b48f61d9c23526309ce82d0a43e88b90f66.bn.jpeg differ
diff --git a/translated_images/r_learners_sm.e25fa9c205b3a3f98d66476321637b48f61d9c23526309ce82d0a43e88b90f66.br.jpeg b/translated_images/r_learners_sm.e25fa9c205b3a3f98d66476321637b48f61d9c23526309ce82d0a43e88b90f66.br.jpeg
new file mode 100644
index 000000000..2d42e2f24
Binary files /dev/null and b/translated_images/r_learners_sm.e25fa9c205b3a3f98d66476321637b48f61d9c23526309ce82d0a43e88b90f66.br.jpeg differ
diff --git a/translated_images/r_learners_sm.e4a71b113ffbedfe727048ec69741a9295954195d8761c35c46f20277de5f684.bn.jpeg b/translated_images/r_learners_sm.e4a71b113ffbedfe727048ec69741a9295954195d8761c35c46f20277de5f684.bn.jpeg
new file mode 100644
index 000000000..2d42e2f24
Binary files /dev/null and b/translated_images/r_learners_sm.e4a71b113ffbedfe727048ec69741a9295954195d8761c35c46f20277de5f684.bn.jpeg differ
diff --git a/translated_images/r_learners_sm.e4a71b113ffbedfe727048ec69741a9295954195d8761c35c46f20277de5f684.br.jpeg b/translated_images/r_learners_sm.e4a71b113ffbedfe727048ec69741a9295954195d8761c35c46f20277de5f684.br.jpeg
new file mode 100644
index 000000000..2d42e2f24
Binary files /dev/null and b/translated_images/r_learners_sm.e4a71b113ffbedfe727048ec69741a9295954195d8761c35c46f20277de5f684.br.jpeg differ
diff --git a/translated_images/r_learners_sm.f9199f76f1e2e49304b19155ebcfb8bad375aface4625be7e95404486a48d332.bn.jpeg b/translated_images/r_learners_sm.f9199f76f1e2e49304b19155ebcfb8bad375aface4625be7e95404486a48d332.bn.jpeg
new file mode 100644
index 000000000..2d42e2f24
Binary files /dev/null and b/translated_images/r_learners_sm.f9199f76f1e2e49304b19155ebcfb8bad375aface4625be7e95404486a48d332.bn.jpeg differ
diff --git a/translated_images/r_learners_sm.f9199f76f1e2e49304b19155ebcfb8bad375aface4625be7e95404486a48d332.br.jpeg b/translated_images/r_learners_sm.f9199f76f1e2e49304b19155ebcfb8bad375aface4625be7e95404486a48d332.br.jpeg
new file mode 100644
index 000000000..2d42e2f24
Binary files /dev/null and b/translated_images/r_learners_sm.f9199f76f1e2e49304b19155ebcfb8bad375aface4625be7e95404486a48d332.br.jpeg differ
diff --git a/translated_images/recipes.186acfa8ed2e8f0059ce17ef22c9452d7b25e7e1e4b044573bacec9a18e040d2.bn.png b/translated_images/recipes.186acfa8ed2e8f0059ce17ef22c9452d7b25e7e1e4b044573bacec9a18e040d2.bn.png
new file mode 100644
index 000000000..75cc4826e
Binary files /dev/null and b/translated_images/recipes.186acfa8ed2e8f0059ce17ef22c9452d7b25e7e1e4b044573bacec9a18e040d2.bn.png differ
diff --git a/translated_images/recipes.186acfa8ed2e8f0059ce17ef22c9452d7b25e7e1e4b044573bacec9a18e040d2.br.png b/translated_images/recipes.186acfa8ed2e8f0059ce17ef22c9452d7b25e7e1e4b044573bacec9a18e040d2.br.png
new file mode 100644
index 000000000..75cc4826e
Binary files /dev/null and b/translated_images/recipes.186acfa8ed2e8f0059ce17ef22c9452d7b25e7e1e4b044573bacec9a18e040d2.br.png differ
diff --git a/translated_images/recipes.9ad10d8a4056bf89413fc33644924e0bd29d7c12fb2154e03a1ca3d2d6ea9323.bn.png b/translated_images/recipes.9ad10d8a4056bf89413fc33644924e0bd29d7c12fb2154e03a1ca3d2d6ea9323.bn.png
new file mode 100644
index 000000000..75cc4826e
Binary files /dev/null and b/translated_images/recipes.9ad10d8a4056bf89413fc33644924e0bd29d7c12fb2154e03a1ca3d2d6ea9323.bn.png differ
diff --git a/translated_images/recipes.9ad10d8a4056bf89413fc33644924e0bd29d7c12fb2154e03a1ca3d2d6ea9323.br.png b/translated_images/recipes.9ad10d8a4056bf89413fc33644924e0bd29d7c12fb2154e03a1ca3d2d6ea9323.br.png
new file mode 100644
index 000000000..75cc4826e
Binary files /dev/null and b/translated_images/recipes.9ad10d8a4056bf89413fc33644924e0bd29d7c12fb2154e03a1ca3d2d6ea9323.br.png differ
diff --git a/translated_images/scaled.91897dfbaa26ca4a5f45c99aaabe79b1f1bcd1237f8124c20c0510df482e9f49.bn.png b/translated_images/scaled.91897dfbaa26ca4a5f45c99aaabe79b1f1bcd1237f8124c20c0510df482e9f49.bn.png
new file mode 100644
index 000000000..a11e46fae
Binary files /dev/null and b/translated_images/scaled.91897dfbaa26ca4a5f45c99aaabe79b1f1bcd1237f8124c20c0510df482e9f49.bn.png differ
diff --git a/translated_images/scaled.91897dfbaa26ca4a5f45c99aaabe79b1f1bcd1237f8124c20c0510df482e9f49.br.png b/translated_images/scaled.91897dfbaa26ca4a5f45c99aaabe79b1f1bcd1237f8124c20c0510df482e9f49.br.png
new file mode 100644
index 000000000..a11e46fae
Binary files /dev/null and b/translated_images/scaled.91897dfbaa26ca4a5f45c99aaabe79b1f1bcd1237f8124c20c0510df482e9f49.br.png differ
diff --git a/translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.bn.png b/translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.bn.png
new file mode 100644
index 000000000..a11e46fae
Binary files /dev/null and b/translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.bn.png differ
diff --git a/translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.br.png b/translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.br.png
new file mode 100644
index 000000000..a11e46fae
Binary files /dev/null and b/translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.br.png differ
diff --git a/translated_images/scatter-dayofyear-color.65790faefbb9d54fb8f6223c566c445b9fac58a1c15f41f8641c3842af9d548b.bn.png b/translated_images/scatter-dayofyear-color.65790faefbb9d54fb8f6223c566c445b9fac58a1c15f41f8641c3842af9d548b.bn.png
new file mode 100644
index 000000000..be0bf88f9
Binary files /dev/null and b/translated_images/scatter-dayofyear-color.65790faefbb9d54fb8f6223c566c445b9fac58a1c15f41f8641c3842af9d548b.bn.png differ
diff --git a/translated_images/scatter-dayofyear-color.65790faefbb9d54fb8f6223c566c445b9fac58a1c15f41f8641c3842af9d548b.br.png b/translated_images/scatter-dayofyear-color.65790faefbb9d54fb8f6223c566c445b9fac58a1c15f41f8641c3842af9d548b.br.png
new file mode 100644
index 000000000..be0bf88f9
Binary files /dev/null and b/translated_images/scatter-dayofyear-color.65790faefbb9d54fb8f6223c566c445b9fac58a1c15f41f8641c3842af9d548b.br.png differ
diff --git a/translated_images/scatter-dayofyear.bc171c189c9fd553fe93030180b9c00ed123148a577640e4d7481c4c01811972.bn.png b/translated_images/scatter-dayofyear.bc171c189c9fd553fe93030180b9c00ed123148a577640e4d7481c4c01811972.bn.png
new file mode 100644
index 000000000..38538e271
Binary files /dev/null and b/translated_images/scatter-dayofyear.bc171c189c9fd553fe93030180b9c00ed123148a577640e4d7481c4c01811972.bn.png differ
diff --git a/translated_images/scatter-dayofyear.bc171c189c9fd553fe93030180b9c00ed123148a577640e4d7481c4c01811972.br.png b/translated_images/scatter-dayofyear.bc171c189c9fd553fe93030180b9c00ed123148a577640e4d7481c4c01811972.br.png
new file mode 100644
index 000000000..38538e271
Binary files /dev/null and b/translated_images/scatter-dayofyear.bc171c189c9fd553fe93030180b9c00ed123148a577640e4d7481c4c01811972.br.png differ
diff --git a/translated_images/scatterplot.ad8b356bcbb33be68d54050e09b9b7bfc03e94fde7371f2609ae43f4c563b2d7.bn.png b/translated_images/scatterplot.ad8b356bcbb33be68d54050e09b9b7bfc03e94fde7371f2609ae43f4c563b2d7.bn.png
new file mode 100644
index 000000000..0b61bb73f
Binary files /dev/null and b/translated_images/scatterplot.ad8b356bcbb33be68d54050e09b9b7bfc03e94fde7371f2609ae43f4c563b2d7.bn.png differ
diff --git a/translated_images/scatterplot.ad8b356bcbb33be68d54050e09b9b7bfc03e94fde7371f2609ae43f4c563b2d7.br.png b/translated_images/scatterplot.ad8b356bcbb33be68d54050e09b9b7bfc03e94fde7371f2609ae43f4c563b2d7.br.png
new file mode 100644
index 000000000..0b61bb73f
Binary files /dev/null and b/translated_images/scatterplot.ad8b356bcbb33be68d54050e09b9b7bfc03e94fde7371f2609ae43f4c563b2d7.br.png differ
diff --git a/translated_images/scatterplot.b6868f44cbd2051c6680ccdbb1510697d06a3ff6cd4abda656f5009c0ed4e3fc.bn.png b/translated_images/scatterplot.b6868f44cbd2051c6680ccdbb1510697d06a3ff6cd4abda656f5009c0ed4e3fc.bn.png
new file mode 100644
index 000000000..1dce2f9c3
Binary files /dev/null and b/translated_images/scatterplot.b6868f44cbd2051c6680ccdbb1510697d06a3ff6cd4abda656f5009c0ed4e3fc.bn.png differ
diff --git a/translated_images/scatterplot.b6868f44cbd2051c6680ccdbb1510697d06a3ff6cd4abda656f5009c0ed4e3fc.br.png b/translated_images/scatterplot.b6868f44cbd2051c6680ccdbb1510697d06a3ff6cd4abda656f5009c0ed4e3fc.br.png
new file mode 100644
index 000000000..1dce2f9c3
Binary files /dev/null and b/translated_images/scatterplot.b6868f44cbd2051c6680ccdbb1510697d06a3ff6cd4abda656f5009c0ed4e3fc.br.png differ
diff --git a/translated_images/shakey.4dc17819c447c05bf4b52f76da0bdd28817d056fdb906252ec20124dd4cfa55e.bn.jpg b/translated_images/shakey.4dc17819c447c05bf4b52f76da0bdd28817d056fdb906252ec20124dd4cfa55e.bn.jpg
new file mode 100644
index 000000000..cfaa90905
Binary files /dev/null and b/translated_images/shakey.4dc17819c447c05bf4b52f76da0bdd28817d056fdb906252ec20124dd4cfa55e.bn.jpg differ
diff --git a/translated_images/shakey.4dc17819c447c05bf4b52f76da0bdd28817d056fdb906252ec20124dd4cfa55e.br.jpg b/translated_images/shakey.4dc17819c447c05bf4b52f76da0bdd28817d056fdb906252ec20124dd4cfa55e.br.jpg
new file mode 100644
index 000000000..cfaa90905
Binary files /dev/null and b/translated_images/shakey.4dc17819c447c05bf4b52f76da0bdd28817d056fdb906252ec20124dd4cfa55e.br.jpg differ
diff --git a/translated_images/sigmoid.8b7ba9d095c789cf72780675d0d1d44980c3736617329abfc392dfc859799704.bn.png b/translated_images/sigmoid.8b7ba9d095c789cf72780675d0d1d44980c3736617329abfc392dfc859799704.bn.png
new file mode 100644
index 000000000..41dbdc339
Binary files /dev/null and b/translated_images/sigmoid.8b7ba9d095c789cf72780675d0d1d44980c3736617329abfc392dfc859799704.bn.png differ
diff --git a/translated_images/sigmoid.8b7ba9d095c789cf72780675d0d1d44980c3736617329abfc392dfc859799704.br.png b/translated_images/sigmoid.8b7ba9d095c789cf72780675d0d1d44980c3736617329abfc392dfc859799704.br.png
new file mode 100644
index 000000000..41dbdc339
Binary files /dev/null and b/translated_images/sigmoid.8b7ba9d095c789cf72780675d0d1d44980c3736617329abfc392dfc859799704.br.png differ
diff --git a/translated_images/slope.f3c9d5910ddbfcf9096eb5564254ba22c9a32d7acd7694cab905d29ad8261db3.bn.png b/translated_images/slope.f3c9d5910ddbfcf9096eb5564254ba22c9a32d7acd7694cab905d29ad8261db3.bn.png
new file mode 100644
index 000000000..024fcdc3f
Binary files /dev/null and b/translated_images/slope.f3c9d5910ddbfcf9096eb5564254ba22c9a32d7acd7694cab905d29ad8261db3.bn.png differ
diff --git a/translated_images/slope.f3c9d5910ddbfcf9096eb5564254ba22c9a32d7acd7694cab905d29ad8261db3.br.png b/translated_images/slope.f3c9d5910ddbfcf9096eb5564254ba22c9a32d7acd7694cab905d29ad8261db3.br.png
new file mode 100644
index 000000000..024fcdc3f
Binary files /dev/null and b/translated_images/slope.f3c9d5910ddbfcf9096eb5564254ba22c9a32d7acd7694cab905d29ad8261db3.br.png differ
diff --git a/translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.bn.png b/translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.bn.png
new file mode 100644
index 000000000..9a25f6739
Binary files /dev/null and b/translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.bn.png differ
diff --git a/translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.br.png b/translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.br.png
new file mode 100644
index 000000000..9a25f6739
Binary files /dev/null and b/translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.br.png differ
diff --git a/translated_images/svm.621ae7b516d678e08ed23af77ff1750b5fe392976917f0606861567b779e8862.bn.png b/translated_images/svm.621ae7b516d678e08ed23af77ff1750b5fe392976917f0606861567b779e8862.bn.png
new file mode 100644
index 000000000..636c5f258
Binary files /dev/null and b/translated_images/svm.621ae7b516d678e08ed23af77ff1750b5fe392976917f0606861567b779e8862.bn.png differ
diff --git a/translated_images/svm.621ae7b516d678e08ed23af77ff1750b5fe392976917f0606861567b779e8862.br.png b/translated_images/svm.621ae7b516d678e08ed23af77ff1750b5fe392976917f0606861567b779e8862.br.png
new file mode 100644
index 000000000..636c5f258
Binary files /dev/null and b/translated_images/svm.621ae7b516d678e08ed23af77ff1750b5fe392976917f0606861567b779e8862.br.png differ
diff --git a/translated_images/swarm.56d253ae80a2c0f5940dec8ed3c02e57161891ff44cc0dce5c3cb2f65a4233e7.bn.png b/translated_images/swarm.56d253ae80a2c0f5940dec8ed3c02e57161891ff44cc0dce5c3cb2f65a4233e7.bn.png
new file mode 100644
index 000000000..13510aa1f
Binary files /dev/null and b/translated_images/swarm.56d253ae80a2c0f5940dec8ed3c02e57161891ff44cc0dce5c3cb2f65a4233e7.bn.png differ
diff --git a/translated_images/swarm.56d253ae80a2c0f5940dec8ed3c02e57161891ff44cc0dce5c3cb2f65a4233e7.br.png b/translated_images/swarm.56d253ae80a2c0f5940dec8ed3c02e57161891ff44cc0dce5c3cb2f65a4233e7.br.png
new file mode 100644
index 000000000..13510aa1f
Binary files /dev/null and b/translated_images/swarm.56d253ae80a2c0f5940dec8ed3c02e57161891ff44cc0dce5c3cb2f65a4233e7.br.png differ
diff --git a/translated_images/swarm_2.efeacfca536c2b577dc7b5f8891f28926663fbf62d893ab5e1278ae734ca104e.bn.png b/translated_images/swarm_2.efeacfca536c2b577dc7b5f8891f28926663fbf62d893ab5e1278ae734ca104e.bn.png
new file mode 100644
index 000000000..425f08cd7
Binary files /dev/null and b/translated_images/swarm_2.efeacfca536c2b577dc7b5f8891f28926663fbf62d893ab5e1278ae734ca104e.bn.png differ
diff --git a/translated_images/swarm_2.efeacfca536c2b577dc7b5f8891f28926663fbf62d893ab5e1278ae734ca104e.br.png b/translated_images/swarm_2.efeacfca536c2b577dc7b5f8891f28926663fbf62d893ab5e1278ae734ca104e.br.png
new file mode 100644
index 000000000..425f08cd7
Binary files /dev/null and b/translated_images/swarm_2.efeacfca536c2b577dc7b5f8891f28926663fbf62d893ab5e1278ae734ca104e.br.png differ
diff --git a/translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.bn.png b/translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.bn.png
new file mode 100644
index 000000000..1aa2d71ab
Binary files /dev/null and b/translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.bn.png differ
diff --git a/translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.br.png b/translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.br.png
new file mode 100644
index 000000000..1aa2d71ab
Binary files /dev/null and b/translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.br.png differ
diff --git a/translated_images/thai-food.c47a7a7f9f05c21892a1f9dc7bf30669e6d18dfda420c5c7ebb4153f6a304edd.bn.jpg b/translated_images/thai-food.c47a7a7f9f05c21892a1f9dc7bf30669e6d18dfda420c5c7ebb4153f6a304edd.bn.jpg
new file mode 100644
index 000000000..d9f7349ab
Binary files /dev/null and b/translated_images/thai-food.c47a7a7f9f05c21892a1f9dc7bf30669e6d18dfda420c5c7ebb4153f6a304edd.bn.jpg differ
diff --git a/translated_images/thai-food.c47a7a7f9f05c21892a1f9dc7bf30669e6d18dfda420c5c7ebb4153f6a304edd.br.jpg b/translated_images/thai-food.c47a7a7f9f05c21892a1f9dc7bf30669e6d18dfda420c5c7ebb4153f6a304edd.br.jpg
new file mode 100644
index 000000000..d9f7349ab
Binary files /dev/null and b/translated_images/thai-food.c47a7a7f9f05c21892a1f9dc7bf30669e6d18dfda420c5c7ebb4153f6a304edd.br.jpg differ
diff --git a/translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.bn.png b/translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.bn.png
new file mode 100644
index 000000000..d680b55de
Binary files /dev/null and b/translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.bn.png differ
diff --git a/translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.br.png b/translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.br.png
new file mode 100644
index 000000000..d680b55de
Binary files /dev/null and b/translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.br.png differ
diff --git a/translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.bn.png b/translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.bn.png
new file mode 100644
index 000000000..990cacf94
Binary files /dev/null and b/translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.bn.png differ
diff --git a/translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.br.png b/translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.br.png
new file mode 100644
index 000000000..990cacf94
Binary files /dev/null and b/translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.br.png differ
diff --git a/translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.bn.png b/translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.bn.png
new file mode 100644
index 000000000..253c13709
Binary files /dev/null and b/translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.bn.png differ
diff --git a/translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.br.png b/translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.br.png
new file mode 100644
index 000000000..253c13709
Binary files /dev/null and b/translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.br.png differ
diff --git a/translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.bn.png b/translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.bn.png
new file mode 100644
index 000000000..1149b1644
Binary files /dev/null and b/translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.bn.png differ
diff --git a/translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.br.png b/translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.br.png
new file mode 100644
index 000000000..1149b1644
Binary files /dev/null and b/translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.br.png differ
diff --git a/translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.bn.png b/translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.bn.png
new file mode 100644
index 000000000..1149b1644
Binary files /dev/null and b/translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.bn.png differ
diff --git a/translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.br.png b/translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.br.png
new file mode 100644
index 000000000..1149b1644
Binary files /dev/null and b/translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.br.png differ
diff --git a/translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.bn.png b/translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.bn.png
new file mode 100644
index 000000000..b995b24b9
Binary files /dev/null and b/translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.bn.png differ
diff --git a/translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.br.png b/translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.br.png
new file mode 100644
index 000000000..b995b24b9
Binary files /dev/null and b/translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.br.png differ
diff --git a/translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.bn.png b/translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.bn.png
new file mode 100644
index 000000000..f5527d750
Binary files /dev/null and b/translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.bn.png differ
diff --git a/translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.br.png b/translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.br.png
new file mode 100644
index 000000000..f5527d750
Binary files /dev/null and b/translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.br.png differ
diff --git a/translated_images/turntable.f2b86b13c53302dc106aa741de9dc96ac372864cf458dd6f879119857aab01da.bn.jpg b/translated_images/turntable.f2b86b13c53302dc106aa741de9dc96ac372864cf458dd6f879119857aab01da.bn.jpg
new file mode 100644
index 000000000..631db5fad
Binary files /dev/null and b/translated_images/turntable.f2b86b13c53302dc106aa741de9dc96ac372864cf458dd6f879119857aab01da.bn.jpg differ
diff --git a/translated_images/turntable.f2b86b13c53302dc106aa741de9dc96ac372864cf458dd6f879119857aab01da.br.jpg b/translated_images/turntable.f2b86b13c53302dc106aa741de9dc96ac372864cf458dd6f879119857aab01da.br.jpg
new file mode 100644
index 000000000..631db5fad
Binary files /dev/null and b/translated_images/turntable.f2b86b13c53302dc106aa741de9dc96ac372864cf458dd6f879119857aab01da.br.jpg differ
diff --git a/translated_images/ufo.9e787f5161da9d4d1dafc537e1da09be8210f2ee996cb638aa5cee1d92867a04.bn.jpg b/translated_images/ufo.9e787f5161da9d4d1dafc537e1da09be8210f2ee996cb638aa5cee1d92867a04.bn.jpg
new file mode 100644
index 000000000..0db92ac89
Binary files /dev/null and b/translated_images/ufo.9e787f5161da9d4d1dafc537e1da09be8210f2ee996cb638aa5cee1d92867a04.bn.jpg differ
diff --git a/translated_images/ufo.9e787f5161da9d4d1dafc537e1da09be8210f2ee996cb638aa5cee1d92867a04.br.jpg b/translated_images/ufo.9e787f5161da9d4d1dafc537e1da09be8210f2ee996cb638aa5cee1d92867a04.br.jpg
new file mode 100644
index 000000000..0db92ac89
Binary files /dev/null and b/translated_images/ufo.9e787f5161da9d4d1dafc537e1da09be8210f2ee996cb638aa5cee1d92867a04.br.jpg differ
diff --git a/translated_images/unruly_data.0eedc7ced92d2d919cf5ea197bfe0fe9a30780c4bf7cdcf14ff4e9dc5a4c7267.bn.jpg b/translated_images/unruly_data.0eedc7ced92d2d919cf5ea197bfe0fe9a30780c4bf7cdcf14ff4e9dc5a4c7267.bn.jpg
new file mode 100644
index 000000000..d09c41c8c
Binary files /dev/null and b/translated_images/unruly_data.0eedc7ced92d2d919cf5ea197bfe0fe9a30780c4bf7cdcf14ff4e9dc5a4c7267.bn.jpg differ
diff --git a/translated_images/unruly_data.0eedc7ced92d2d919cf5ea197bfe0fe9a30780c4bf7cdcf14ff4e9dc5a4c7267.br.jpg b/translated_images/unruly_data.0eedc7ced92d2d919cf5ea197bfe0fe9a30780c4bf7cdcf14ff4e9dc5a4c7267.br.jpg
new file mode 100644
index 000000000..d09c41c8c
Binary files /dev/null and b/translated_images/unruly_data.0eedc7ced92d2d919cf5ea197bfe0fe9a30780c4bf7cdcf14ff4e9dc5a4c7267.br.jpg differ
diff --git a/translated_images/violin.ffceb68923177011dc8f1ae08f78297c69f2b868d82fa4e754cc923b185d4f7d.bn.png b/translated_images/violin.ffceb68923177011dc8f1ae08f78297c69f2b868d82fa4e754cc923b185d4f7d.bn.png
new file mode 100644
index 000000000..935f6530f
Binary files /dev/null and b/translated_images/violin.ffceb68923177011dc8f1ae08f78297c69f2b868d82fa4e754cc923b185d4f7d.bn.png differ
diff --git a/translated_images/violin.ffceb68923177011dc8f1ae08f78297c69f2b868d82fa4e754cc923b185d4f7d.br.png b/translated_images/violin.ffceb68923177011dc8f1ae08f78297c69f2b868d82fa4e754cc923b185d4f7d.br.png
new file mode 100644
index 000000000..935f6530f
Binary files /dev/null and b/translated_images/violin.ffceb68923177011dc8f1ae08f78297c69f2b868d82fa4e754cc923b185d4f7d.br.png differ
diff --git a/translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.bn.png b/translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.bn.png
new file mode 100644
index 000000000..e4db5db46
Binary files /dev/null and b/translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.bn.png differ
diff --git a/translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.br.png b/translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.br.png
new file mode 100644
index 000000000..e4db5db46
Binary files /dev/null and b/translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.br.png differ
diff --git a/translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.bn.png b/translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.bn.png
new file mode 100644
index 000000000..ebb533ea9
Binary files /dev/null and b/translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.bn.png differ
diff --git a/translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.br.png b/translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.br.png
new file mode 100644
index 000000000..ebb533ea9
Binary files /dev/null and b/translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.br.png differ
diff --git a/translated_images/wolf.a56d3d4070ca0c79007b28aa2203a1801ebd496f242525381225992ece6c369d.bn.png b/translated_images/wolf.a56d3d4070ca0c79007b28aa2203a1801ebd496f242525381225992ece6c369d.bn.png
new file mode 100644
index 000000000..a7f831a76
Binary files /dev/null and b/translated_images/wolf.a56d3d4070ca0c79007b28aa2203a1801ebd496f242525381225992ece6c369d.bn.png differ
diff --git a/translated_images/wolf.a56d3d4070ca0c79007b28aa2203a1801ebd496f242525381225992ece6c369d.br.png b/translated_images/wolf.a56d3d4070ca0c79007b28aa2203a1801ebd496f242525381225992ece6c369d.br.png
new file mode 100644
index 000000000..a7f831a76
Binary files /dev/null and b/translated_images/wolf.a56d3d4070ca0c79007b28aa2203a1801ebd496f242525381225992ece6c369d.br.png differ
diff --git a/translations/bn/1-Introduction/1-intro-to-ML/README.md b/translations/bn/1-Introduction/1-intro-to-ML/README.md
new file mode 100644
index 000000000..fcc0fad4d
--- /dev/null
+++ b/translations/bn/1-Introduction/1-intro-to-ML/README.md
@@ -0,0 +1,157 @@
+
+# মেশিন লার্নিং পরিচিতি
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/1/)
+
+---
+
+[](https://youtu.be/6mSx_KJxcHI "শিক্ষার্থীদের জন্য মেশিন লার্নিং - মেশিন লার্নিং পরিচিতি")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন এই পাঠের একটি সংক্ষিপ্ত ভিডিও দেখার জন্য।
+
+এই কোর্সে আপনাকে স্বাগতম! এটি ক্লাসিক্যাল মেশিন লার্নিং-এর জন্য একটি প্রাথমিক কোর্স। আপনি যদি এই বিষয়ে একেবারে নতুন হন বা একজন অভিজ্ঞ মেশিন লার্নিং প্র্যাকটিশনার হিসেবে আপনার জ্ঞান ঝালাই করতে চান, আমরা আনন্দিত যে আপনি আমাদের সাথে যোগ দিয়েছেন। আমরা একটি বন্ধুত্বপূর্ণ শিক্ষার পরিবেশ তৈরি করতে চাই এবং আপনার [মতামত](https://github.com/microsoft/ML-For-Beginners/discussions) গ্রহণ করতে আগ্রহী।
+
+[](https://youtu.be/h0e2HAPTGF4 "মেশিন লার্নিং পরিচিতি")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিও দেখার জন্য: MIT-এর জন গুটটাগ মেশিন লার্নিং পরিচয় করিয়ে দিচ্ছেন।
+
+---
+## মেশিন লার্নিং শুরু করা
+
+এই পাঠক্রম শুরু করার আগে, আপনার কম্পিউটারটি প্রস্তুত এবং লোকাল নোটবুক চালানোর জন্য কনফিগার করা থাকা প্রয়োজন।
+
+- **এই ভিডিওগুলির সাহায্যে আপনার মেশিন কনফিগার করুন**। [পাইথন ইনস্টল করার পদ্ধতি](https://youtu.be/CXZYvNRIAKM) এবং [ডেভেলপমেন্টের জন্য একটি টেক্সট এডিটর সেটআপ করার পদ্ধতি](https://youtu.be/EU8eayHWoZg) শিখুন।
+- **পাইথন শিখুন**। [পাইথন](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott) সম্পর্কে একটি মৌলিক ধারণা থাকা প্রয়োজন, যা এই কোর্সে ব্যবহৃত একটি গুরুত্বপূর্ণ প্রোগ্রামিং ভাষা।
+- **নোড.জেএস এবং জাভাস্ক্রিপ্ট শিখুন**। আমরা এই কোর্সে ওয়েব অ্যাপ তৈরি করার সময় কয়েকবার জাভাস্ক্রিপ্ট ব্যবহার করব, তাই [নোড](https://nodejs.org) এবং [এনপিএম](https://www.npmjs.com/) ইনস্টল করুন এবং [ভিজ্যুয়াল স্টুডিও কোড](https://code.visualstudio.com/) প্রস্তুত রাখুন।
+- **গিটহাব অ্যাকাউন্ট তৈরি করুন**। যদি আপনার ইতিমধ্যে একটি গিটহাব অ্যাকাউন্ট না থাকে, তাহলে একটি তৈরি করুন এবং এই পাঠক্রমটি ফর্ক করুন। (আমাদের একটি স্টার দিতে ভুলবেন না 😊)
+- **স্কিকিট-লার্ন এক্সপ্লোর করুন**। [স্কিকিট-লার্ন](https://scikit-learn.org/stable/user_guide.html) সম্পর্কে জানুন, যা আমরা এই পাঠে ব্যবহার করব।
+
+---
+## মেশিন লার্নিং কী?
+
+'মেশিন লার্নিং' শব্দটি আজকের দিনে সবচেয়ে জনপ্রিয় এবং বহুল ব্যবহৃত শব্দগুলির মধ্যে একটি। আপনি যদি প্রযুক্তির সাথে সামান্য পরিচিত হন, তবে এই শব্দটি অন্তত একবার শুনে থাকবেন। তবে, মেশিন লার্নিংয়ের কার্যপ্রণালী বেশিরভাগ মানুষের কাছে একটি রহস্য। একজন মেশিন লার্নিং শিক্ষার্থীর জন্য বিষয়টি কখনও কখনও জটিল মনে হতে পারে। তাই, মেশিন লার্নিং কী তা ধাপে ধাপে এবং ব্যবহারিক উদাহরণের মাধ্যমে শেখা গুরুত্বপূর্ণ।
+
+---
+## হাইপ কার্ভ
+
+
+
+> গুগল ট্রেন্ডস 'মেশিন লার্নিং' শব্দটির সাম্প্রতিক 'হাইপ কার্ভ' দেখাচ্ছে।
+
+---
+## একটি রহস্যময় মহাবিশ্ব
+
+আমরা একটি রহস্যময় মহাবিশ্বে বাস করি। স্টিফেন হকিং, আলবার্ট আইনস্টাইন এবং আরও অনেক মহান বিজ্ঞানী তাদের জীবন উৎসর্গ করেছেন এই পৃথিবীর রহস্য উদঘাটনের জন্য। এটি মানুষের শেখার স্বভাব: একটি শিশু নতুন জিনিস শেখে এবং ধীরে ধীরে তার চারপাশের পৃথিবীর গঠন বুঝতে শেখে।
+
+---
+## শিশুর মস্তিষ্ক
+
+একটি শিশুর মস্তিষ্ক এবং ইন্দ্রিয় তার চারপাশের তথ্য গ্রহণ করে এবং ধীরে ধীরে জীবনের লুকানো প্যাটার্নগুলি শিখে। এই শেখার প্রক্রিয়া মানুষকে পৃথিবীর সবচেয়ে উন্নত জীব হিসেবে গড়ে তোলে। লুকানো প্যাটার্ন আবিষ্কার করে এবং সেগুলির উপর ভিত্তি করে উদ্ভাবন করে আমরা আমাদের জীবনকে ক্রমাগত উন্নত করি। এই শেখার ক্ষমতা এবং বিকাশের সক্ষমতা একটি ধারণার সাথে সম্পর্কিত, যাকে [মস্তিষ্কের প্লাস্টিসিটি](https://www.simplypsychology.org/brain-plasticity.html) বলা হয়। আমরা মানুষের মস্তিষ্কের শেখার প্রক্রিয়া এবং মেশিন লার্নিংয়ের ধারণার মধ্যে কিছু প্রেরণাদায়ক সাদৃশ্য খুঁজে পেতে পারি।
+
+---
+## মানুষের মস্তিষ্ক
+
+[মানুষের মস্তিষ্ক](https://www.livescience.com/29365-human-brain.html) বাস্তব জগত থেকে তথ্য গ্রহণ করে, সেই তথ্য প্রক্রিয়া করে, যৌক্তিক সিদ্ধান্ত নেয় এবং পরিস্থিতি অনুযায়ী নির্দিষ্ট কাজ সম্পাদন করে। এটিকে আমরা বুদ্ধিমত্তার সাথে আচরণ বলা হয়। যখন আমরা এই বুদ্ধিমত্তার আচরণের একটি অনুকরণ মেশিনে প্রোগ্রাম করি, তখন তাকে কৃত্রিম বুদ্ধিমত্তা (AI) বলা হয়।
+
+---
+## কিছু পরিভাষা
+
+যদিও পরিভাষাগুলি বিভ্রান্তিকর হতে পারে, মেশিন লার্নিং (ML) কৃত্রিম বুদ্ধিমত্তার একটি গুরুত্বপূর্ণ উপসেট। **ML বিশেষ অ্যালগরিদম ব্যবহার করে তথ্য থেকে অর্থবহ তথ্য আবিষ্কার এবং লুকানো প্যাটার্ন খুঁজে বের করার উপর দৃষ্টি নিবদ্ধ করে, যা যৌক্তিক সিদ্ধান্ত গ্রহণ প্রক্রিয়াকে সমর্থন করে।**
+
+---
+## এআই, এমএল, ডিপ লার্নিং
+
+
+
+> একটি ডায়াগ্রাম যা এআই, এমএল, ডিপ লার্নিং এবং ডেটা সায়েন্সের মধ্যে সম্পর্ক দেখায়। [জেন লুপার](https://twitter.com/jenlooper)-এর ইনফোগ্রাফিক, [এই গ্রাফিক](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining) দ্বারা অনুপ্রাণিত।
+
+---
+## কাভার করার বিষয়বস্তু
+
+এই পাঠক্রমে, আমরা শুধুমাত্র মেশিন লার্নিংয়ের মৌলিক ধারণাগুলি কভার করব যা একজন শিক্ষার্থীর জানা প্রয়োজন। আমরা 'ক্লাসিক্যাল মেশিন লার্নিং' শেখাব, প্রধানত স্কিকিট-লার্ন ব্যবহার করে। কৃত্রিম বুদ্ধিমত্তা বা ডিপ লার্নিংয়ের বিস্তৃত ধারণাগুলি বোঝার জন্য মেশিন লার্নিংয়ের একটি শক্তিশালী মৌলিক জ্ঞান অপরিহার্য, এবং আমরা এটি এখানে প্রদান করতে চাই।
+
+---
+## এই কোর্সে আপনি শিখবেন:
+
+- মেশিন লার্নিংয়ের মৌলিক ধারণা
+- মেশিন লার্নিংয়ের ইতিহাস
+- মেশিন লার্নিং এবং ন্যায্যতা
+- রিগ্রেশন টেকনিক
+- ক্লাসিফিকেশন টেকনিক
+- ক্লাস্টারিং টেকনিক
+- প্রাকৃতিক ভাষা প্রক্রিয়াকরণ
+- টাইম সিরিজ পূর্বাভাস
+- রিইনফোর্সমেন্ট লার্নিং
+- বাস্তব জীবনের প্রয়োগ
+
+---
+## আমরা যা কভার করব না
+
+- ডিপ লার্নিং
+- নিউরাল নেটওয়ার্ক
+- এআই
+
+শেখার অভিজ্ঞতাকে সহজতর করার জন্য, আমরা নিউরাল নেটওয়ার্ক এবং ডিপ লার্নিংয়ের জটিলতাগুলি এড়িয়ে যাব। আমরা একটি আলাদা পাঠক্রমে এআই এবং ডেটা সায়েন্সের উপর আলোকপাত করব।
+
+---
+## কেন মেশিন লার্নিং পড়বেন?
+
+সিস্টেমের দৃষ্টিকোণ থেকে, মেশিন লার্নিং এমন স্বয়ংক্রিয় সিস্টেম তৈরি করা যা ডেটা থেকে লুকানো প্যাটার্ন শিখে বুদ্ধিমান সিদ্ধান্ত গ্রহণে সহায়তা করে।
+
+✅ এক মিনিট চিন্তা করুন কেন একটি ব্যবসা মেশিন লার্নিং কৌশল ব্যবহার করতে চাইবে, কঠোর কোডেড নিয়ম-ভিত্তিক ইঞ্জিন তৈরির পরিবর্তে।
+
+---
+## মেশিন লার্নিংয়ের প্রয়োগ
+
+মেশিন লার্নিংয়ের প্রয়োগ এখন প্রায় সর্বত্র, এবং এটি আমাদের স্মার্টফোন, সংযুক্ত ডিভাইস এবং অন্যান্য সিস্টেম দ্বারা উৎপন্ন ডেটার মতো সর্বব্যাপী। মেশিন লার্নিং অ্যালগরিদমের বিশাল সম্ভাবনা বিবেচনা করে, গবেষকরা বাস্তব জীবনের বহু-মাত্রিক এবং বহু-শাখার সমস্যাগুলি সমাধানের জন্য এর ক্ষমতা অন্বেষণ করছেন।
+
+---
+## প্রয়োগকৃত মেশিন লার্নিংয়ের উদাহরণ
+
+**আপনি বিভিন্ন উপায়ে মেশিন লার্নিং ব্যবহার করতে পারেন**:
+
+- রোগীর মেডিকেল ইতিহাস থেকে রোগের সম্ভাবনা পূর্বাভাস দিতে।
+- আবহাওয়ার ডেটা ব্যবহার করে আবহাওয়ার ঘটনা পূর্বাভাস দিতে।
+- একটি টেক্সটের অনুভূতি বুঝতে।
+- ভুয়া খবর শনাক্ত করতে এবং প্রোপাগান্ডা ছড়ানো বন্ধ করতে।
+
+অর্থনীতি, ভূবিজ্ঞান, মহাকাশ অনুসন্ধান, বায়োমেডিকেল ইঞ্জিনিয়ারিং, কগনিটিভ সায়েন্স এবং এমনকি মানবিক শাখাগুলিও মেশিন লার্নিং ব্যবহার করছে তাদের ডেটা-প্রসেসিং-নির্ভর সমস্যাগুলি সমাধানের জন্য।
+
+---
+## উপসংহার
+
+মেশিন লার্নিং বাস্তব বা তৈরি ডেটা থেকে অর্থবহ অন্তর্দৃষ্টি আবিষ্কার করার প্রক্রিয়াকে স্বয়ংক্রিয় করে। এটি ব্যবসা, স্বাস্থ্য এবং আর্থিক প্রয়োগ সহ বিভিন্ন ক্ষেত্রে অত্যন্ত মূল্যবান প্রমাণিত হয়েছে।
+
+অদূর ভবিষ্যতে, মেশিন লার্নিংয়ের মৌলিক বিষয়গুলি বোঝা যেকোনো ক্ষেত্রের মানুষের জন্য অপরিহার্য হয়ে উঠবে এর ব্যাপক গ্রহণযোগ্যতার কারণে।
+
+---
+# 🚀 চ্যালেঞ্জ
+
+কাগজে বা একটি অনলাইন অ্যাপ ব্যবহার করে ([Excalidraw](https://excalidraw.com/)), এআই, এমএল, ডিপ লার্নিং এবং ডেটা সায়েন্সের মধ্যে পার্থক্যগুলি আপনার বোঝাপড়া আঁকুন। প্রতিটি কৌশল কোন ধরনের সমস্যার জন্য উপযুক্ত তা নিয়ে কিছু ধারণা যোগ করুন।
+
+# [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/2/)
+
+---
+# পুনরায় দেখুন এবং স্ব-অধ্যয়ন
+
+ক্লাউডে কীভাবে মেশিন লার্নিং অ্যালগরিদম নিয়ে কাজ করবেন তা শিখতে এই [লার্নিং পাথ](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott) অনুসরণ করুন।
+
+মেশিন লার্নিংয়ের মৌলিক বিষয়গুলি সম্পর্কে জানতে একটি [লার্নিং পাথ](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) নিন।
+
+---
+# অ্যাসাইনমেন্ট
+
+[শুরু করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/1-Introduction/1-intro-to-ML/assignment.md b/translations/bn/1-Introduction/1-intro-to-ML/assignment.md
new file mode 100644
index 000000000..9cac01077
--- /dev/null
+++ b/translations/bn/1-Introduction/1-intro-to-ML/assignment.md
@@ -0,0 +1,23 @@
+
+# শুরু করুন এবং চালু করুন
+
+## নির্দেশাবলী
+
+এই গ্রেডবিহীন অ্যাসাইনমেন্টে, আপনাকে পাইথন সম্পর্কে পুনরায় জ্ঞান অর্জন করতে হবে এবং আপনার পরিবেশ সেটআপ করতে হবে যাতে নোটবুক চালানো যায়।
+
+এই [Python Learning Path](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott) অনুসরণ করুন, তারপর আপনার সিস্টেম সেটআপ করুন এই প্রাথমিক ভিডিওগুলো দেখে:
+
+https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/1-Introduction/2-history-of-ML/README.md b/translations/bn/1-Introduction/2-history-of-ML/README.md
new file mode 100644
index 000000000..7786992d2
--- /dev/null
+++ b/translations/bn/1-Introduction/2-history-of-ML/README.md
@@ -0,0 +1,164 @@
+
+# মেশিন লার্নিং এর ইতিহাস
+
+
+> স্কেচনোট: [Tomomi Imura](https://www.twitter.com/girlie_mac)
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/3/)
+
+---
+
+[](https://youtu.be/N6wxM4wZ7V0 "শুরু থেকে মেশিন লার্নিং - মেশিন লার্নিং এর ইতিহাস")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন এই পাঠের সংক্ষিপ্ত ভিডিও দেখার জন্য।
+
+এই পাঠে আমরা মেশিন লার্নিং এবং কৃত্রিম বুদ্ধিমত্তার ইতিহাসের গুরুত্বপূর্ণ মাইলফলকগুলো নিয়ে আলোচনা করব।
+
+কৃত্রিম বুদ্ধিমত্তা (AI) এর ইতিহাস মেশিন লার্নিং এর ইতিহাসের সাথে গভীরভাবে জড়িত, কারণ ML এর ভিত্তি গড়ে তোলা অ্যালগরিদম এবং কম্পিউটেশনাল অগ্রগতি AI এর বিকাশে সহায়তা করেছে। মনে রাখা গুরুত্বপূর্ণ যে, যদিও এই ক্ষেত্রগুলো ১৯৫০ এর দশকে পৃথক গবেষণার ক্ষেত্র হিসেবে গঠিত হতে শুরু করে, তবুও [অ্যালগরিদমিক, পরিসংখ্যানগত, গাণিতিক, কম্পিউটেশনাল এবং প্রযুক্তিগত আবিষ্কার](https://wikipedia.org/wiki/Timeline_of_machine_learning) এই সময়ের আগেই শুরু হয়েছিল এবং এর সাথে মিশে গিয়েছিল। আসলে, মানুষ [শত শত বছর ধরে](https://wikipedia.org/wiki/History_of_artificial_intelligence) এই প্রশ্নগুলো নিয়ে চিন্তা করে আসছে: এই নিবন্ধটি 'চিন্তা করতে সক্ষম যন্ত্র' ধারণার ঐতিহাসিক বুদ্ধিবৃত্তিক ভিত্তি নিয়ে আলোচনা করে।
+
+---
+## উল্লেখযোগ্য আবিষ্কার
+
+- ১৭৬৩, ১৮১২ [বায়েস থিওরেম](https://wikipedia.org/wiki/Bayes%27_theorem) এবং এর পূর্বসূরী। এই থিওরেম এবং এর প্রয়োগ অনুমানের ভিত্তি তৈরি করে, যা পূর্বের জ্ঞান থেকে কোনো ঘটনার সম্ভাবনা বর্ণনা করে।
+- ১৮০৫ [লিস্ট স্কয়ার থিওরি](https://wikipedia.org/wiki/Least_squares) ফরাসি গণিতবিদ Adrien-Marie Legendre দ্বারা। এই থিওরি, যা আপনি আমাদের রিগ্রেশন ইউনিটে শিখবেন, ডেটা ফিটিংয়ে সহায়তা করে।
+- ১৯১৩ [মারকভ চেইন](https://wikipedia.org/wiki/Markov_chain), রাশিয়ান গণিতবিদ Andrey Markov এর নামে নামকরণ করা হয়েছে, যা পূর্ববর্তী অবস্থার ভিত্তিতে সম্ভাব্য ঘটনার একটি ক্রম বর্ণনা করে।
+- ১৯৫৭ [পারসেপট্রন](https://wikipedia.org/wiki/Perceptron) একটি ধরনের লিনিয়ার ক্লাসিফায়ার যা আমেরিকান মনোবিজ্ঞানী Frank Rosenblatt আবিষ্কার করেছিলেন এবং যা ডিপ লার্নিং এর উন্নতির ভিত্তি তৈরি করে।
+
+---
+
+- ১৯৬৭ [নিয়ারেস্ট নেবার](https://wikipedia.org/wiki/Nearest_neighbor) একটি অ্যালগরিদম যা মূলত রুট ম্যাপ করার জন্য ডিজাইন করা হয়েছিল। ML এর ক্ষেত্রে এটি প্যাটার্ন সনাক্ত করতে ব্যবহৃত হয়।
+- ১৯৭০ [ব্যাকপ্রপাগেশন](https://wikipedia.org/wiki/Backpropagation) [ফিডফরওয়ার্ড নিউরাল নেটওয়ার্ক](https://wikipedia.org/wiki/Feedforward_neural_network) প্রশিক্ষণের জন্য ব্যবহৃত হয়।
+- ১৯৮২ [রিকারেন্ট নিউরাল নেটওয়ার্ক](https://wikipedia.org/wiki/Recurrent_neural_network) ফিডফরওয়ার্ড নিউরাল নেটওয়ার্ক থেকে উদ্ভূত কৃত্রিম নিউরাল নেটওয়ার্ক যা সময়গত গ্রাফ তৈরি করে।
+
+✅ একটু গবেষণা করুন। ML এবং AI এর ইতিহাসে আর কোন তারিখগুলো গুরুত্বপূর্ণ বলে মনে হয়?
+
+---
+## ১৯৫০: চিন্তা করতে সক্ষম যন্ত্র
+
+Alan Turing, একজন সত্যিই অসাধারণ ব্যক্তি যাকে [২০১৯ সালে জনসাধারণের দ্বারা](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) ২০ শতকের সর্বশ্রেষ্ঠ বিজ্ঞানী হিসেবে ভোট দেওয়া হয়েছিল, 'চিন্তা করতে সক্ষম যন্ত্র' ধারণার ভিত্তি স্থাপনে সহায়তা করার জন্য কৃতিত্ব দেওয়া হয়। তিনি এই ধারণার জন্য প্রমাণের প্রয়োজনীয়তা এবং সমালোচকদের সাথে লড়াই করেছিলেন এবং [টুরিং টেস্ট](https://www.bbc.com/news/technology-18475646) তৈরি করেছিলেন, যা আপনি আমাদের NLP পাঠে অন্বেষণ করবেন।
+
+---
+## ১৯৫৬: ডার্টমাউথ সামার রিসার্চ প্রজেক্ট
+
+"ডার্টমাউথ সামার রিসার্চ প্রজেক্ট অন আর্টিফিশিয়াল ইন্টেলিজেন্স কৃত্রিম বুদ্ধিমত্তার ক্ষেত্রে একটি গুরুত্বপূর্ণ ঘটনা ছিল," এবং এখানেই 'কৃত্রিম বুদ্ধিমত্তা' শব্দটি তৈরি করা হয়েছিল ([source](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth))।
+
+> শেখার প্রতিটি দিক বা বুদ্ধিমত্তার অন্য কোনো বৈশিষ্ট্য এমনভাবে বর্ণনা করা যেতে পারে যে একটি যন্ত্র এটি অনুকরণ করতে সক্ষম হয়।
+
+---
+
+প্রধান গবেষক, গণিতের অধ্যাপক John McCarthy, আশা করেছিলেন "এই অনুমানের ভিত্তিতে এগিয়ে যাওয়ার যে শেখার প্রতিটি দিক বা বুদ্ধিমত্তার অন্য কোনো বৈশিষ্ট্য এমনভাবে বর্ণনা করা যেতে পারে যে একটি যন্ত্র এটি অনুকরণ করতে সক্ষম হয়।" অংশগ্রহণকারীদের মধ্যে ছিলেন এই ক্ষেত্রের আরেকজন বিশিষ্ট ব্যক্তি Marvin Minsky।
+
+এই কর্মশালাটি "প্রতীকী পদ্ধতির উত্থান, সীমিত ডোমেইনগুলিতে ফোকাস করা সিস্টেম (প্রাথমিক এক্সপার্ট সিস্টেম), এবং ডিডাকটিভ সিস্টেম বনাম ইনডাকটিভ সিস্টেম" সহ বেশ কয়েকটি আলোচনার সূচনা এবং উৎসাহ দেওয়ার জন্য কৃতিত্ব দেওয়া হয়। ([source](https://wikipedia.org/wiki/Dartmouth_workshop))।
+
+---
+## ১৯৫৬ - ১৯৭৪: "সোনালী বছর"
+
+১৯৫০ এর দশক থেকে ৭০ এর দশকের মাঝামাঝি পর্যন্ত, AI এর মাধ্যমে অনেক সমস্যার সমাধানের আশা নিয়ে উচ্চ আশাবাদ ছিল। ১৯৬৭ সালে Marvin Minsky আত্মবিশ্বাসের সাথে বলেছিলেন, "এক প্রজন্মের মধ্যে ... 'কৃত্রিম বুদ্ধিমত্তা' তৈরির সমস্যা উল্লেখযোগ্যভাবে সমাধান হবে।" (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall)
+
+প্রাকৃতিক ভাষা প্রক্রিয়াকরণ গবেষণা বিকশিত হয়েছিল, অনুসন্ধান আরও পরিশীলিত এবং শক্তিশালী হয়েছিল, এবং 'মাইক্রো-ওয়ার্ল্ড' ধারণা তৈরি হয়েছিল, যেখানে সাধারণ কাজগুলো সাধারণ ভাষার নির্দেশনা ব্যবহার করে সম্পন্ন করা হয়েছিল।
+
+---
+
+গভর্নমেন্ট এজেন্সিগুলোর দ্বারা গবেষণা ভালোভাবে অর্থায়িত হয়েছিল, কম্পিউটেশন এবং অ্যালগরিদমে অগ্রগতি হয়েছিল, এবং বুদ্ধিমান যন্ত্রের প্রোটোটাইপ তৈরি করা হয়েছিল। এই যন্ত্রগুলোর মধ্যে কিছু হলো:
+
+* [Shakey the robot](https://wikipedia.org/wiki/Shakey_the_robot), যে বুদ্ধিমত্তার সাথে কাজ সম্পাদনের জন্য সিদ্ধান্ত নিতে এবং চলাচল করতে পারত।
+
+ 
+ > Shakey, ১৯৭২ সালে
+
+---
+
+* Eliza, একটি প্রাথমিক 'চ্যাটারবট', মানুষের সাথে কথা বলতে এবং একটি প্রাথমিক 'থেরাপিস্ট' হিসেবে কাজ করতে পারত। NLP পাঠে আপনি Eliza সম্পর্কে আরও জানবেন।
+
+ 
+ > Eliza এর একটি সংস্করণ, একটি চ্যাটবট
+
+---
+
+* "Blocks world" ছিল একটি মাইক্রো-ওয়ার্ল্ডের উদাহরণ যেখানে ব্লকগুলো স্তূপ করা এবং সাজানো যেত, এবং যন্ত্রকে সিদ্ধান্ত নিতে শেখানোর পরীক্ষাগুলো করা যেত। [SHRDLU](https://wikipedia.org/wiki/SHRDLU) এর মতো লাইব্রেরি দিয়ে তৈরি অগ্রগতি ভাষা প্রক্রিয়াকরণকে এগিয়ে নিয়ে গিয়েছিল।
+
+ [](https://www.youtube.com/watch?v=QAJz4YKUwqw "SHRDLU সহ ব্লকস ওয়ার্ল্ড")
+
+ > 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিও দেখার জন্য: SHRDLU সহ ব্লকস ওয়ার্ল্ড
+
+---
+## ১৯৭৪ - ১৯৮০: "AI শীতকাল"
+
+১৯৭০ এর দশকের মাঝামাঝি সময়ে, 'বুদ্ধিমান যন্ত্র' তৈরির জটিলতা কম করে দেখানো হয়েছিল এবং এর প্রতিশ্রুতি, উপলব্ধ কম্পিউট ক্ষমতার ভিত্তিতে, অতিরিক্তভাবে মূল্যায়ন করা হয়েছিল। অর্থায়ন বন্ধ হয়ে যায় এবং এই ক্ষেত্রের প্রতি আত্মবিশ্বাস কমে যায়। কিছু বিষয় যা আত্মবিশ্বাসে প্রভাব ফেলেছিল তা হলো:
+---
+- **সীমাবদ্ধতা**। কম্পিউট ক্ষমতা খুব সীমিত ছিল।
+- **কম্বিনেটোরিয়াল বিস্ফোরণ**। কম্পিউটারের কাছে আরও বেশি কিছু চাওয়া হলে প্রশিক্ষণের জন্য প্রয়োজনীয় প্যারামিটারগুলোর সংখ্যা গাণিতিকভাবে বৃদ্ধি পায়, কিন্তু কম্পিউট ক্ষমতা এবং সক্ষমতার সমান্তরাল উন্নতি হয়নি।
+- **ডেটার অভাব**। ডেটার অভাব ছিল যা অ্যালগরিদম পরীক্ষা, উন্নয়ন এবং পরিমার্জনের প্রক্রিয়াকে বাধাগ্রস্ত করেছিল।
+- **আমরা কি সঠিক প্রশ্ন করছি?**। যে প্রশ্নগুলো করা হচ্ছিল তা নিয়ে প্রশ্ন উঠতে শুরু করে। গবেষকরা তাদের পদ্ধতির সমালোচনা মোকাবিলা করতে শুরু করেন:
+ - টুরিং টেস্ট বিভিন্ন ধারণার মাধ্যমে প্রশ্নবিদ্ধ হয়, যেমন 'চাইনিজ রুম থিওরি' যা বলেছিল, "একটি ডিজিটাল কম্পিউটার প্রোগ্রাম করা হলে এটি ভাষা বুঝতে সক্ষম বলে মনে হতে পারে কিন্তু প্রকৃত বোঝার সৃষ্টি করতে পারে না।" ([source](https://plato.stanford.edu/entries/chinese-room/))
+ - কৃত্রিম বুদ্ধিমত্তা যেমন "থেরাপিস্ট" ELIZA কে সমাজে পরিচিত করানোর নৈতিকতা চ্যালেঞ্জ করা হয়।
+
+---
+
+একই সময়ে, বিভিন্ন AI চিন্তাধারা গড়ে উঠতে শুরু করে। ["স্ক্রাফি" বনাম "নিট AI"](https://wikipedia.org/wiki/Neats_and_scruffies) পদ্ধতির মধ্যে একটি বিভাজন তৈরি হয়। _স্ক্রাফি_ ল্যাবগুলো প্রোগ্রামগুলোকে কাঙ্ক্ষিত ফলাফল পাওয়ার জন্য ঘন্টার পর ঘন্টা টুইক করত। _নিট_ ল্যাবগুলো "লজিক এবং আনুষ্ঠানিক সমস্যা সমাধানে" ফোকাস করত। ELIZA এবং SHRDLU ছিল পরিচিত _স্ক্রাফি_ সিস্টেম। ১৯৮০ এর দশকে, যখন ML সিস্টেমগুলোকে পুনরুত্পাদনযোগ্য করার চাহিদা দেখা দেয়, _নিট_ পদ্ধতি ধীরে ধীরে অগ্রাধিকার পায় কারণ এর ফলাফলগুলো আরও ব্যাখ্যাযোগ্য।
+
+---
+## ১৯৮০ এর দশক: এক্সপার্ট সিস্টেম
+
+যেমন এই ক্ষেত্রটি বৃদ্ধি পায়, এর ব্যবসায়িক সুবিধা আরও স্পষ্ট হয়ে ওঠে, এবং ১৯৮০ এর দশকে 'এক্সপার্ট সিস্টেম' এর প্রসার ঘটে। "এক্সপার্ট সিস্টেমগুলো ছিল কৃত্রিম বুদ্ধিমত্তা (AI) সফটওয়্যারের প্রথম সত্যিকারের সফল রূপগুলোর মধ্যে একটি।" ([source](https://wikipedia.org/wiki/Expert_system))।
+
+এই ধরনের সিস্টেম আসলে _হাইব্রিড_, যা আংশিকভাবে একটি রুলস ইঞ্জিন নিয়ে গঠিত যা ব্যবসায়িক প্রয়োজনীয়তা সংজ্ঞায়িত করে, এবং একটি ইনফারেন্স ইঞ্জিন যা রুলস সিস্টেম ব্যবহার করে নতুন তথ্য অনুমান করে।
+
+এই যুগে নিউরাল নেটওয়ার্কের প্রতি আরও বেশি মনোযোগ দেওয়া হয়।
+
+---
+## ১৯৮৭ - ১৯৯৩: AI 'চিল'
+
+বিশেষায়িত এক্সপার্ট সিস্টেম হার্ডওয়্যারের প্রসারিত হওয়া দুর্ভাগ্যজনকভাবে খুব বেশি বিশেষায়িত হয়ে ওঠে। ব্যক্তিগত কম্পিউটারের উত্থান এই বড়, বিশেষায়িত, কেন্দ্রীভূত সিস্টেমগুলোর সাথে প্রতিযোগিতা করে। কম্পিউটিং এর গণতন্ত্রায়ন শুরু হয়, যা শেষ পর্যন্ত বড় ডেটার আধুনিক বিস্ফোরণের পথ প্রশস্ত করে।
+
+---
+## ১৯৯৩ - ২০১১
+
+এই যুগে ML এবং AI এর জন্য নতুন একটি সময় শুরু হয় যেখানে আগের ডেটার অভাব এবং কম্পিউট ক্ষমতার সমস্যাগুলো সমাধান করা সম্ভব হয়। ডেটার পরিমাণ দ্রুত বৃদ্ধি পেতে শুরু করে এবং আরও সহজলভ্য হয়ে ওঠে, ভালো এবং খারাপ উভয়ের জন্যই, বিশেষ করে ২০০৭ সালের আশেপাশে স্মার্টফোনের আবির্ভাবের সাথে। কম্পিউট ক্ষমতা গাণিতিকভাবে বৃদ্ধি পায়, এবং অ্যালগরিদমগুলোও এর সাথে বিকশিত হয়। ক্ষেত্রটি পরিপক্ক হতে শুরু করে কারণ অতীতের স্বাধীন গবেষণাগুলো একটি সত্যিকারের শৃঙ্খলায় রূপ নিতে শুরু করে।
+
+---
+## বর্তমান
+
+আজ মেশিন লার্নিং এবং AI আমাদের জীবনের প্রায় প্রতিটি অংশকে স্পর্শ করে। এই যুগে এই অ্যালগরিদমগুলো মানুষের জীবনে কী প্রভাব ফেলতে পারে তা নিয়ে সতর্কভাবে বোঝার প্রয়োজন রয়েছে। Microsoft's Brad Smith বলেছেন, "তথ্য প্রযুক্তি এমন বিষয়গুলো উত্থাপন করে যা মৌলিক মানবাধিকার সুরক্ষার মতো বিষয়গুলোর সাথে সম্পর্কিত, যেমন গোপনীয়তা এবং মত প্রকাশের স্বাধীনতা। এই বিষয়গুলো এই পণ্যগুলো তৈরি করা প্রযুক্তি কোম্পানিগুলোর জন্য দায়িত্ব বাড়িয়ে দেয়। আমাদের দৃষ্টিতে, এগুলো চিন্তাশীল সরকারি নিয়ন্ত্রণ এবং গ্রহণযোগ্য ব্যবহারের চারপাশে মানদণ্ডের বিকাশের জন্যও আহ্বান জানায়।" ([source](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/))।
+
+---
+
+ভবিষ্যতে কী অপেক্ষা করছে তা দেখা বাকি, তবে এই কম্পিউটার সিস্টেম এবং সেগুলো যে সফটওয়্যার এবং অ্যালগরিদম চালায় তা বোঝা গুরুত্বপূর্ণ। আমরা আশা করি এই পাঠ্যক্রম আপনাকে আরও ভালোভাবে বুঝতে সাহায্য করবে যাতে আপনি নিজের জন্য সিদ্ধান্ত নিতে পারেন।
+
+[](https://www.youtube.com/watch?v=mTtDfKgLm54 "ডিপ লার্নিং এর ইতিহাস")
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিও দেখার জন্য: Yann LeCun এই লেকচারে ডিপ লার্নিং এর ইতিহাস নিয়ে আলোচনা করেছেন
+
+---
+## 🚀চ্যালেঞ্জ
+
+এই ঐতিহাসিক মুহূর্তগুলোর মধ্যে একটি নিয়ে গভীরভাবে গবেষণা করুন এবং এর পেছনের মানুষগুলো সম্পর্কে আরও জানুন। এখানে আকর্ষণীয় চরিত্র রয়েছে, এবং কোনো বৈজ্ঞানিক আবিষ্কার কখনোই সাংস্কৃতিক শূন্যতায় তৈরি হয়নি। আপনি কী আবিষ্কার করেন?
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/4/)
+
+---
+## পর্যালোচনা এবং স্ব-অধ্যয়ন
+
+এখানে দেখার এবং শোনার জন্য কিছু আইটেম দেওয়া হলো:
+
+[Amy Boyd এর সাথে এই পডকাস্ট যেখানে AI এর বিবর্তন নিয়ে আলোচনা করা হয়েছে](http://runasradio.com/Shows/Show/739)
+
+[](https://www.youtube.com/watch?v=EJt3_bFYKss "Amy Boyd এর AI এর ইতিহাস")
+
+---
+
+## অ্যাসাইনমেন্ট
+
+[একটি টাইমলাইন তৈরি করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/1-Introduction/2-history-of-ML/assignment.md b/translations/bn/1-Introduction/2-history-of-ML/assignment.md
new file mode 100644
index 000000000..88aaecab9
--- /dev/null
+++ b/translations/bn/1-Introduction/2-history-of-ML/assignment.md
@@ -0,0 +1,25 @@
+
+# একটি টাইমলাইন তৈরি করুন
+
+## নির্দেশনা
+
+[এই রিপোজিটরি](https://github.com/Digital-Humanities-Toolkit/timeline-builder) ব্যবহার করে অ্যালগরিদম, গণিত, পরিসংখ্যান, AI, বা ML-এর ইতিহাসের কোনো একটি দিকের টাইমলাইন তৈরি করুন, অথবা এগুলোর সংমিশ্রণ নিয়ে কাজ করুন। আপনি একজন ব্যক্তি, একটি ধারণা, অথবা দীর্ঘ সময়ের চিন্তাধারার উপর ফোকাস করতে পারেন। নিশ্চিত করুন যে মাল্টিমিডিয়া উপাদান যোগ করা হয়েছে।
+
+## মূল্যায়ন
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ------------------------------------------------- | --------------------------------------- | ---------------------------------------------------------------- |
+| | একটি ডিপ্লয় করা টাইমলাইন GitHub পেজ হিসেবে উপস্থাপন করা হয়েছে | কোড অসম্পূর্ণ এবং ডিপ্লয় করা হয়নি | টাইমলাইন অসম্পূর্ণ, ভালোভাবে গবেষণা করা হয়নি এবং ডিপ্লয় করা হয়নি |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/1-Introduction/3-fairness/README.md b/translations/bn/1-Introduction/3-fairness/README.md
new file mode 100644
index 000000000..3b97b1006
--- /dev/null
+++ b/translations/bn/1-Introduction/3-fairness/README.md
@@ -0,0 +1,154 @@
+
+# দায়িত্বশীল AI দিয়ে মেশিন লার্নিং সমাধান তৈরি করা
+
+
+> স্কেচনোট: [Tomomi Imura](https://www.twitter.com/girlie_mac)
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/5/)
+
+## ভূমিকা
+
+এই পাঠ্যক্রমে, আপনি শিখতে শুরু করবেন কীভাবে মেশিন লার্নিং আমাদের দৈনন্দিন জীবনে প্রভাব ফেলছে। এমনকি এখন, সিস্টেম এবং মডেলগুলি স্বাস্থ্যসেবা নির্ণয়, ঋণ অনুমোদন বা প্রতারণা সনাক্তকরণের মতো দৈনন্দিন সিদ্ধান্ত গ্রহণের কাজে জড়িত। তাই এটি গুরুত্বপূর্ণ যে এই মডেলগুলি এমন ফলাফল প্রদান করে যা বিশ্বাসযোগ্য। যেকোনো সফটওয়্যার অ্যাপ্লিকেশনের মতো, AI সিস্টেমগুলি প্রত্যাশা পূরণে ব্যর্থ হতে পারে বা অনাকাঙ্ক্ষিত ফলাফল দিতে পারে। এজন্য AI মডেলের আচরণ বুঝতে এবং ব্যাখ্যা করতে সক্ষম হওয়া অত্যন্ত গুরুত্বপূর্ণ।
+
+কল্পনা করুন, আপনি যখন এই মডেলগুলি তৈরি করতে যে ডেটা ব্যবহার করছেন তাতে যদি নির্দিষ্ট জনসংখ্যার অভাব থাকে, যেমন জাতি, লিঙ্গ, রাজনৈতিক মতামত, ধর্ম, বা যদি এই জনসংখ্যা অসমভাবে প্রতিনিধিত্ব করে। যদি মডেলের আউটপুট কিছু জনসংখ্যাকে প্রাধান্য দেয়, তাহলে এর ফলাফল কী হতে পারে? এছাড়াও, যদি মডেলটি ক্ষতিকর ফলাফল দেয় এবং মানুষের জন্য ক্ষতিকর হয়, তাহলে এর জন্য কে দায়ী হবে? এই পাঠ্যক্রমে আমরা এই প্রশ্নগুলো নিয়ে আলোচনা করব।
+
+এই পাঠে আপনি:
+
+- মেশিন লার্নিং-এ ন্যায্যতার গুরুত্ব এবং ন্যায্যতা-সম্পর্কিত ক্ষতির বিষয়ে সচেতনতা বৃদ্ধি করবেন।
+- আউটলায়ার এবং অস্বাভাবিক পরিস্থিতি অন্বেষণের অনুশীলনে পরিচিত হবেন যাতে নির্ভরযোগ্যতা এবং নিরাপত্তা নিশ্চিত করা যায়।
+- অন্তর্ভুক্তিমূলক সিস্টেম ডিজাইন করে সবাইকে ক্ষমতায়নের প্রয়োজনীয়তা বুঝবেন।
+- ডেটা এবং মানুষের গোপনীয়তা এবং নিরাপত্তা রক্ষার গুরুত্ব অন্বেষণ করবেন।
+- AI মডেলের আচরণ ব্যাখ্যা করার জন্য একটি স্বচ্ছ পদ্ধতির গুরুত্ব দেখবেন।
+- AI সিস্টেমে বিশ্বাস তৈরি করতে জবাবদিহিতার গুরুত্ব সম্পর্কে সচেতন হবেন।
+
+## পূর্বশর্ত
+
+পূর্বশর্ত হিসেবে, "Responsible AI Principles" শেখার পথটি সম্পন্ন করুন এবং নিচের ভিডিওটি দেখুন:
+
+[Responsible AI শেখার পথ](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
+
+[](https://youtu.be/dnC8-uUZXSc "Microsoft-এর Responsible AI পদ্ধতি")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন: Microsoft-এর Responsible AI পদ্ধতি
+
+## ন্যায্যতা
+
+AI সিস্টেমগুলোকে সবার প্রতি ন্যায্য আচরণ করতে হবে এবং একই ধরনের গোষ্ঠীর মানুষের উপর ভিন্নভাবে প্রভাব ফেলতে হবে না। উদাহরণস্বরূপ, যখন AI সিস্টেমগুলো চিকিৎসা, ঋণ আবেদন বা চাকরির ক্ষেত্রে পরামর্শ দেয়, তখন তাদের একই উপসর্গ, আর্থিক পরিস্থিতি বা পেশাগত যোগ্যতার ভিত্তিতে সবার জন্য একই সুপারিশ করতে হবে। আমাদের প্রত্যেকের মধ্যে এমন উত্তরাধিকারসূত্রে প্রাপ্ত পক্ষপাত রয়েছে যা আমাদের সিদ্ধান্ত এবং কর্মে প্রভাব ফেলে। এই পক্ষপাতগুলো সেই ডেটায় প্রতিফলিত হতে পারে যা আমরা AI সিস্টেম প্রশিক্ষণের জন্য ব্যবহার করি। এমন হেরফের কখনও কখনও অনিচ্ছাকৃতভাবে ঘটে। ডেটায় পক্ষপাত যুক্ত করার সময় সচেতনভাবে তা জানা প্রায়ই কঠিন।
+
+**“অন্যায়”** বলতে একটি গোষ্ঠীর জন্য নেতিবাচক প্রভাব বা “ক্ষতি” বোঝায়, যেমন জাতি, লিঙ্গ, বয়স বা অক্ষমতার ভিত্তিতে সংজ্ঞায়িত। ন্যায্যতা-সম্পর্কিত প্রধান ক্ষতিগুলোকে নিম্নরূপ শ্রেণীবদ্ধ করা যায়:
+
+- **বণ্টন**, যদি একটি লিঙ্গ বা জাতি অন্যটির তুলনায় প্রাধান্য পায়।
+- **সেবার গুণমান**। যদি আপনি একটি নির্দিষ্ট পরিস্থিতির জন্য ডেটা প্রশিক্ষণ করেন কিন্তু বাস্তবতা অনেক বেশি জটিল হয়, তাহলে এটি একটি দুর্বল সেবার দিকে নিয়ে যায়। উদাহরণস্বরূপ, একটি হাত ধোয়ার সাবানের ডিসপেনসার যা গাঢ় ত্বকের মানুষকে সনাক্ত করতে পারে না। [তথ্যসূত্র](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
+- **অপমান**। অন্যায়ভাবে সমালোচনা করা বা কিছু বা কাউকে লেবেল করা। উদাহরণস্বরূপ, একটি ইমেজ লেবেলিং প্রযুক্তি গাঢ় ত্বকের মানুষের ছবি ভুলভাবে গরিলা হিসেবে চিহ্নিত করেছিল।
+- **অতিরিক্ত বা কম প্রতিনিধিত্ব**। ধারণাটি হলো একটি নির্দিষ্ট গোষ্ঠীকে একটি নির্দিষ্ট পেশায় দেখা যায় না, এবং যেকোনো সেবা বা কার্যক্রম যা এটি প্রচার করে তা ক্ষতির দিকে অবদান রাখে।
+- **স্টেরিওটাইপিং**। একটি নির্দিষ্ট গোষ্ঠীকে পূর্বনির্ধারিত বৈশিষ্ট্যের সাথে যুক্ত করা। উদাহরণস্বরূপ, ইংরেজি এবং তুর্কি ভাষার মধ্যে একটি ভাষা অনুবাদ সিস্টেমে লিঙ্গ-সম্পর্কিত স্টেরিওটাইপের কারণে ভুল হতে পারে।
+
+
+> তুর্কিতে অনুবাদ
+
+
+> ইংরেজিতে পুনরায় অনুবাদ
+
+AI সিস্টেম ডিজাইন এবং পরীক্ষা করার সময়, আমাদের নিশ্চিত করতে হবে যে AI ন্যায্য এবং পক্ষপাতমূলক বা বৈষম্যমূলক সিদ্ধান্ত নিতে প্রোগ্রাম করা হয়নি, যা মানুষের জন্যও নিষিদ্ধ। AI এবং মেশিন লার্নিং-এ ন্যায্যতা নিশ্চিত করা একটি জটিল সামাজিক-প্রযুক্তিগত চ্যালেঞ্জ।
+
+### নির্ভরযোগ্যতা এবং নিরাপত্তা
+
+বিশ্বাস তৈরি করতে, AI সিস্টেমগুলোকে স্বাভাবিক এবং অপ্রত্যাশিত পরিস্থিতিতে নির্ভরযোগ্য, নিরাপদ এবং ধারাবাহিক হতে হবে। বিভিন্ন পরিস্থিতিতে AI সিস্টেমগুলো কীভাবে আচরণ করবে তা জানা গুরুত্বপূর্ণ, বিশেষত যখন তারা অস্বাভাবিক পরিস্থিতিতে থাকে। AI সমাধান তৈরি করার সময়, AI সমাধানগুলো যে বিভিন্ন পরিস্থিতির সম্মুখীন হবে তা পরিচালনা করার জন্য যথেষ্ট মনোযোগ দেওয়া প্রয়োজন। উদাহরণস্বরূপ, একটি স্বয়ংচালিত গাড়িকে মানুষের নিরাপত্তাকে সর্বোচ্চ অগ্রাধিকার দিতে হবে। ফলস্বরূপ, গাড়ির AI-কে রাত, বজ্রঝড় বা তুষারঝড়, রাস্তা পার হওয়া শিশু, পোষা প্রাণী, রাস্তা নির্মাণ ইত্যাদির মতো সমস্ত সম্ভাব্য পরিস্থিতি বিবেচনা করতে হবে। একটি AI সিস্টেম কতটা নির্ভরযোগ্য এবং নিরাপদভাবে বিভিন্ন পরিস্থিতি পরিচালনা করতে পারে তা ডেটা বিজ্ঞানী বা AI ডেভেলপার ডিজাইন বা পরীক্ষার সময় কতটা প্রত্যাশা করেছেন তা প্রতিফলিত করে।
+
+> [🎥 এখানে ক্লিক করুন একটি ভিডিওর জন্য: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
+
+### অন্তর্ভুক্তি
+
+AI সিস্টেমগুলোকে এমনভাবে ডিজাইন করা উচিত যাতে সবাইকে সম্পৃক্ত এবং ক্ষমতায়িত করা যায়। AI সিস্টেম ডিজাইন এবং বাস্তবায়নের সময় ডেটা বিজ্ঞানী এবং AI ডেভেলপাররা সিস্টেমে সম্ভাব্য বাধাগুলো চিহ্নিত করেন এবং সমাধান করেন যা অনিচ্ছাকৃতভাবে মানুষকে বাদ দিতে পারে। উদাহরণস্বরূপ, বিশ্বে ১ বিলিয়ন প্রতিবন্ধী মানুষ রয়েছে। AI-এর অগ্রগতির মাধ্যমে, তারা তাদের দৈনন্দিন জীবনে আরও সহজে তথ্য এবং সুযোগগুলোতে প্রবেশ করতে পারে। বাধাগুলো দূর করার মাধ্যমে, এটি উদ্ভাবনের সুযোগ তৈরি করে এবং সবার জন্য আরও ভালো অভিজ্ঞতা সহ AI পণ্য তৈরি করে।
+
+> [🎥 এখানে ক্লিক করুন একটি ভিডিওর জন্য: AI-তে অন্তর্ভুক্তি](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
+
+### নিরাপত্তা এবং গোপনীয়তা
+
+AI সিস্টেমগুলোকে নিরাপদ এবং মানুষের গোপনীয়তার প্রতি শ্রদ্ধাশীল হতে হবে। এমন সিস্টেমে মানুষের কম বিশ্বাস থাকে যা তাদের গোপনীয়তা, তথ্য বা জীবনকে ঝুঁকিতে ফেলে। মেশিন লার্নিং মডেল প্রশিক্ষণের সময়, আমরা সেরা ফলাফল পেতে ডেটার উপর নির্ভর করি। এটি করার সময়, ডেটার উৎস এবং অখণ্ডতা বিবেচনা করা গুরুত্বপূর্ণ। উদাহরণস্বরূপ, ডেটা ব্যবহারকারী জমা দিয়েছে নাকি এটি প্রকাশ্যে উপলব্ধ ছিল? পরবর্তী ধাপে, ডেটার সাথে কাজ করার সময়, এটি অত্যন্ত গুরুত্বপূর্ণ যে AI সিস্টেমগুলো গোপনীয় তথ্য রক্ষা করতে এবং আক্রমণ প্রতিরোধ করতে সক্ষম। AI আরও ব্যাপক হওয়ার সাথে সাথে গোপনীয়তা রক্ষা এবং গুরুত্বপূর্ণ ব্যক্তিগত এবং ব্যবসায়িক তথ্য সুরক্ষিত করা আরও গুরুত্বপূর্ণ এবং জটিল হয়ে উঠছে। গোপনীয়তা এবং ডেটা নিরাপত্তার বিষয়গুলো AI-এর জন্য বিশেষভাবে ঘনিষ্ঠ মনোযোগ প্রয়োজন কারণ ডেটার অ্যাক্সেস AI সিস্টেমগুলোকে মানুষের সম্পর্কে সঠিক এবং তথ্যপূর্ণ পূর্বাভাস এবং সিদ্ধান্ত নিতে সক্ষম করে।
+
+> [🎥 এখানে ক্লিক করুন একটি ভিডিওর জন্য: AI-তে নিরাপত্তা](https://www.microsoft.com/videoplayer/embed/RE4voJF)
+
+- শিল্প হিসেবে আমরা গোপনীয়তা এবং নিরাপত্তায় উল্লেখযোগ্য অগ্রগতি করেছি, যা GDPR (General Data Protection Regulation)-এর মতো নিয়ম দ্বারা উল্লেখযোগ্যভাবে চালিত হয়েছে।
+- তবে AI সিস্টেমের ক্ষেত্রে আমাদের স্বীকার করতে হবে যে সিস্টেমগুলোকে আরও ব্যক্তিগত এবং কার্যকর করতে আরও ব্যক্তিগত ডেটার প্রয়োজন এবং গোপনীয়তার মধ্যে একটি টান রয়েছে।
+- ইন্টারনেটের সাথে সংযুক্ত কম্পিউটারগুলোর জন্মের মতো, আমরা AI-সম্পর্কিত নিরাপত্তা সমস্যার সংখ্যায়ও একটি বড় বৃদ্ধি দেখছি।
+- একই সময়ে, আমরা দেখেছি AI নিরাপত্তা উন্নত করতে ব্যবহৃত হচ্ছে। উদাহরণস্বরূপ, আজকের বেশিরভাগ আধুনিক অ্যান্টি-ভাইরাস স্ক্যানার AI হিউরিস্টিক দ্বারা চালিত।
+- আমাদের নিশ্চিত করতে হবে যে আমাদের ডেটা সায়েন্স প্রক্রিয়াগুলো সর্বশেষ গোপনীয়তা এবং নিরাপত্তা অনুশীলনের সাথে সুরেলা ভাবে মিশে যায়।
+
+### স্বচ্ছতা
+
+AI সিস্টেমগুলোকে বোঝার মতো হতে হবে। স্বচ্ছতার একটি গুরুত্বপূর্ণ অংশ হলো AI সিস্টেম এবং এর উপাদানগুলোর আচরণ ব্যাখ্যা করা। AI সিস্টেমগুলো সম্পর্কে বোঝার উন্নতি করতে হলে স্টেকহোল্ডারদের বুঝতে হবে কীভাবে এবং কেন সেগুলো কাজ করে যাতে তারা সম্ভাব্য কর্মক্ষমতা সমস্যা, নিরাপত্তা এবং গোপনীয়তা উদ্বেগ, পক্ষপাত, বাদ দেওয়ার অনুশীলন বা অনিচ্ছাকৃত ফলাফল চিহ্নিত করতে পারে। আমরা বিশ্বাস করি যে যারা AI সিস্টেম ব্যবহার করেন তাদের উচিত সেগুলো কখন, কেন এবং কীভাবে ব্যবহার করা হয় তা সম্পর্কে সৎ এবং খোলামেলা হওয়া। সেইসাথে তারা যে সিস্টেমগুলো ব্যবহার করেন তার সীমাবদ্ধতা সম্পর্কে। উদাহরণস্বরূপ, যদি একটি ব্যাংক তার ভোক্তা ঋণ প্রদানের সিদ্ধান্তগুলো সমর্থন করতে একটি AI সিস্টেম ব্যবহার করে, তাহলে ফলাফলগুলো পরীক্ষা করা এবং কোন ডেটা সিস্টেমের সুপারিশগুলোকে প্রভাবিত করে তা বোঝা গুরুত্বপূর্ণ। সরকারগুলো বিভিন্ন শিল্পে AI নিয়ন্ত্রণ করতে শুরু করেছে, তাই ডেটা বিজ্ঞানী এবং সংস্থাগুলোকে ব্যাখ্যা করতে হবে যে একটি AI সিস্টেম নিয়ন্ত্রক প্রয়োজনীয়তা পূরণ করে কিনা, বিশেষত যখন একটি অনাকাঙ্ক্ষিত ফলাফল ঘটে।
+
+> [🎥 এখানে ক্লিক করুন একটি ভিডিওর জন্য: AI-তে স্বচ্ছতা](https://www.microsoft.com/videoplayer/embed/RE4voJF)
+
+- AI সিস্টেমগুলো এতটাই জটিল যে সেগুলো কীভাবে কাজ করে এবং ফলাফলগুলো ব্যাখ্যা করা কঠিন।
+- এই বোঝার অভাব সিস্টেমগুলো কীভাবে পরিচালিত, কার্যকরী এবং নথিভুক্ত হয় তা প্রভাবিত করে।
+- এই বোঝার অভাব আরও গুরুত্বপূর্ণভাবে সিস্টেমগুলো যে ফলাফল তৈরি করে তা ব্যবহার করে নেওয়া সিদ্ধান্তগুলোকে প্রভাবিত করে।
+
+### জবাবদিহিতা
+
+AI সিস্টেম ডিজাইন এবং স্থাপনকারী ব্যক্তিদের তাদের সিস্টেমগুলো কীভাবে কাজ করে তার জন্য জবাবদিহি করতে হবে। জবাবদিহিতার প্রয়োজনীয়তা বিশেষভাবে সংবেদনশীল প্রযুক্তি যেমন মুখের স্বীকৃতির ক্ষেত্রে গুরুত্বপূর্ণ। সম্প্রতি, মুখের স্বীকৃতি প্রযুক্তির চাহিদা বৃদ্ধি পেয়েছে, বিশেষত আইন প্রয়োগকারী সংস্থাগুলোর কাছ থেকে যারা নিখোঁজ শিশুদের খুঁজে বের করার মতো কাজে প্রযুক্তির সম্ভাবনা দেখছেন। তবে, এই প্রযুক্তিগুলো একটি সরকার দ্বারা তার নাগরিকদের মৌলিক স্বাধীনতাকে ঝুঁকিতে ফেলতে ব্যবহার করা যেতে পারে, যেমন নির্দিষ্ট ব্যক্তিদের ক্রমাগত নজরদারি সক্ষম করা। তাই ডেটা বিজ্ঞানী এবং সংস্থাগুলোকে তাদের AI সিস্টেমের ব্যক্তিদের বা সমাজের উপর প্রভাবের জন্য দায়িত্বশীল হতে হবে।
+
+[](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft-এর Responsible AI পদ্ধতি")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিওর জন্য: মুখের স্বীকৃতির মাধ্যমে ব্যাপক নজরদারির সতর্কতা
+
+অবশেষে, আমাদের প্রজন্মের জন্য সবচেয়ে বড় প্রশ্নগুলোর একটি হলো, প্রথম প্রজন্ম হিসেবে যারা AI সমাজে নিয়ে আসছে, কীভাবে নিশ্চিত করা যায় যে কম্পিউটারগুলো মানুষের কাছে জবাবদিহি থাকবে এবং কীভাবে নিশ্চিত করা যায় যে কম্পিউটার ডিজাইনকারী ব্যক্তিরা অন্য সবার কাছে জবাবদিহি থাকবে।
+
+## প্রভাব মূল্যায়ন
+
+মেশিন লার্নিং মডেল প্রশিক্ষণের আগে, AI সিস্টেমের উদ্দেশ্য, এর পরিকল্পিত ব্যবহার, এটি কোথায় স্থাপন করা হবে এবং কারা সিস্টেমের সাথে যোগাযোগ করবে তা বোঝার জন্য একটি প্রভাব মূল্যায়ন পরিচালনা করা গুরুত্বপূর্ণ। এগুলো পর্যালোচক বা পরীক্ষকদের জন্য সহায়ক যারা সিস্টেমটি মূল্যায়ন করছেন এবং সম্ভাব্য ঝুঁকি এবং প্রত্যাশিত পরিণতি চিহ্নিত করার সময় কোন বিষয়গুলো বিবেচনা করতে হবে তা জানেন।
+
+প্রভাব মূল্যায়ন পরিচালনার সময় নিম্নলিখিত বিষয়গুলোতে মনোযোগ দেওয়া হয়:
+
+* **ব্যক্তিদের উপর নেতিবাচক প্রভাব**। কোনো সীমাবদ্ধতা বা প্রয়োজনীয়তা, অসমর্থিত ব্যবহার বা সিস্টেমের কর্মক্ষমতাকে বাধাগ্রস্ত করে এমন কোনো পরিচিত সীমাবদ্ধতা সম্পর্কে সচেতন হওয়া গুরুত্বপূর্ণ যাতে সিস্টেমটি এমনভাবে ব্যবহার না করা হয় যা ব্যক্তিদের ক্ষতি করতে পারে।
+* **ডেটার প্রয়োজনীয়তা**। সিস্টেমটি কীভাবে এবং কোথায় ডেটা ব্যবহার করবে তা বোঝা পর্যালোচকদের ডেটার প্রয়োজনীয়তা সম্পর্কে সচেতন হতে সাহায্য করে (যেমন GDPR বা HIPPA ডেটা নিয়ম)। এছাড়াও, ডেটার উৎস বা পরিমাণ প্রশিক্ষণের জন্য যথেষ্ট কিনা তা পরীক্ষা করুন।
+* **প্রভাবের সারাংশ**। সিস্টেমটি ব্যবহার করার ফলে যে সম্ভাব্য ক্ষতি হতে পারে তার একটি তালিকা সংগ্রহ করুন। ML লাইফসাইকেল জুড়ে, চিহ্নিত সমস্যাগুলো প্রশমিত বা সমাধান করা হয়েছে কিনা তা পর্যালোচনা করুন।
+* **প্রযোজ্য লক্ষ্য** ছয়টি মূল নীতির জন্য। প্রতিটি নীতির লক্ষ্যগুলো পূরণ হয়েছে কিনা এবং কোনো ফাঁক রয়েছে কিনা তা মূল্যায়ন করুন।
+
+## দায়িত্বশীল AI দিয়ে ডিবাগিং
+
+একটি সফটওয়্যার অ্যাপ্লিকেশন ডিবাগ করার মতো, একটি AI সিস্টেম ডিবাগ করা সিস্টেমে সমস্যাগুলো চিহ্নিত এবং সমাধান করার একটি প্রয়োজনীয় প্রক্রিয়া। অনেক কারণ রয়েছে যা একটি মডেলের প্রত্যাশিত বা দায়িত্বশীলভাবে কাজ না করার উপর প্রভাব ফেলতে পারে। বেশিরভাগ প্রচলিত মডেল কর্মক্ষমতা মেট্রিক একটি মডেলের কর্মক্ষমতার পরিমাণগত সামগ্রিক মান, যা একটি মডেল কীভাবে দায়িত্বশীল AI নীতিগুলো লঙ্ঘন করে তা বিশ্লেষণ করার জন্য যথেষ্ট নয়। তদ্ব্যতীত, একটি মেশিন লার্নিং মডেল একটি ব্ল্যাক বক্স যা এর ফলাফল কী চালায় তা বোঝা বা যখন এটি একটি ভুল করে তখন ব্যাখ্যা প্রদান করা কঠিন করে তোলে। এই কোর্সে পরে, আমরা দায়িত্বশীল AI ড্যাশবোর্ড ব্যবহার করে AI সিস্টেম ডিবাগ করার পদ্ধতি শিখব। ড্যাশবোর্ডটি ডেটা বিজ্ঞানী এবং AI ডেভেলপারদের জন্য একটি সামগ্রিক টুল প্রদান করে যা নিম্নলিখিত কাজগুলো সম্পাদন করতে সাহায্য করে:
+
+* **ত্রুটি বিশ্লেষণ**। মডেলের ত্রুটির বিতরণ চিহ্নিত করতে যা সিস্টেমের ন্যায্যতা বা নির্ভরযোগ্যতাকে প্রভাবিত করতে পারে।
+* **মডেলের
+এই পাঠে, আপনি মেশিন লার্নিং-এ ন্যায্যতা এবং অন্যায্যতার ধারণাগুলোর কিছু মৌলিক বিষয় শিখেছেন।
+
+এই বিষয়গুলো আরও গভীরভাবে বোঝার জন্য এই কর্মশালাটি দেখুন:
+
+- দায়িত্বশীল AI-এর সন্ধানে: নীতিগুলোকে বাস্তবে রূপ দেওয়া, উপস্থাপনায় বেসমিরা নুশি, মেহরনুশ সামেকি এবং অমিত শর্মা।
+
+[](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI টুলবক্স: দায়িত্বশীল AI তৈরির জন্য একটি ওপেন-সোর্স ফ্রেমওয়ার্ক")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন ভিডিও দেখার জন্য: দায়িত্বশীল AI টুলবক্স: দায়িত্বশীল AI তৈরির জন্য একটি ওপেন-সোর্স ফ্রেমওয়ার্ক, উপস্থাপনায় বেসমিরা নুশি, মেহরনুশ সামেকি এবং অমিত শর্মা।
+
+এছাড়াও পড়ুন:
+
+- মাইক্রোসফটের RAI রিসোর্স সেন্টার: [দায়িত্বশীল AI রিসোর্স – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
+
+- মাইক্রোসফটের FATE গবেষণা দল: [FATE: AI-তে ন্যায্যতা, জবাবদিহিতা, স্বচ্ছতা এবং নৈতিকতা - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
+
+RAI টুলবক্স:
+
+- [দায়িত্বশীল AI টুলবক্স GitHub রিপোজিটরি](https://github.com/microsoft/responsible-ai-toolbox)
+
+Azure Machine Learning-এর ন্যায্যতা নিশ্চিত করার টুলগুলো সম্পর্কে জানুন:
+
+- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
+
+## অ্যাসাইনমেন্ট
+
+[RAI টুলবক্স অন্বেষণ করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/1-Introduction/3-fairness/assignment.md b/translations/bn/1-Introduction/3-fairness/assignment.md
new file mode 100644
index 000000000..f01ac20dd
--- /dev/null
+++ b/translations/bn/1-Introduction/3-fairness/assignment.md
@@ -0,0 +1,25 @@
+
+# দায়িত্বশীল এআই টুলবক্স অন্বেষণ করুন
+
+## নির্দেশাবলী
+
+এই পাঠে আপনি দায়িত্বশীল এআই টুলবক্স সম্পর্কে শিখেছেন, যা "একটি ওপেন-সোর্স, কমিউনিটি-চালিত প্রকল্প যা ডেটা বিজ্ঞানীদের এআই সিস্টেম বিশ্লেষণ এবং উন্নত করতে সাহায্য করে।" এই অ্যাসাইনমেন্টের জন্য, RAI টুলবক্সের একটি [নোটবুক](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) অন্বেষণ করুন এবং আপনার পর্যবেক্ষণ একটি পেপার বা প্রেজেন্টেশনে উপস্থাপন করুন।
+
+## মূল্যায়ন সূচক
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | --------- | -------- | ----------------- |
+| | একটি পেপার বা পাওয়ারপয়েন্ট প্রেজেন্টেশন উপস্থাপন করা হয়েছে যেখানে Fairlearn-এর সিস্টেম, চালানো নোটবুক এবং তা থেকে প্রাপ্ত সিদ্ধান্তগুলো আলোচনা করা হয়েছে | একটি পেপার উপস্থাপন করা হয়েছে কিন্তু কোনো সিদ্ধান্ত নেই | কোনো পেপার উপস্থাপন করা হয়নি |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/1-Introduction/4-techniques-of-ML/README.md b/translations/bn/1-Introduction/4-techniques-of-ML/README.md
new file mode 100644
index 000000000..97cb10f36
--- /dev/null
+++ b/translations/bn/1-Introduction/4-techniques-of-ML/README.md
@@ -0,0 +1,132 @@
+
+# মেশিন লার্নিং এর কৌশলসমূহ
+
+মেশিন লার্নিং মডেল তৈরি, ব্যবহার এবং রক্ষণাবেক্ষণের প্রক্রিয়া এবং এই মডেলগুলোর জন্য ব্যবহৃত ডেটা অন্যান্য ডেভেলপমেন্ট ওয়ার্কফ্লো থেকে অনেকটাই আলাদা। এই পাঠে, আমরা এই প্রক্রিয়াকে সহজবোধ্য করব এবং প্রধান কৌশলগুলো তুলে ধরব যা আপনাকে জানতে হবে। আপনি:
+
+- উচ্চ পর্যায়ে মেশিন লার্নিং এর প্রক্রিয়াগুলো বুঝতে পারবেন।
+- 'মডেল', 'প্রেডিকশন', এবং 'ট্রেনিং ডেটা' এর মতো মৌলিক ধারণাগুলো অন্বেষণ করবেন।
+
+## [পূর্ব-পাঠ কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/7/)
+
+[](https://youtu.be/4NGM0U2ZSHU "শুরু থেকে মেশিন লার্নিং - মেশিন লার্নিং এর কৌশল")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন এই পাঠের একটি সংক্ষিপ্ত ভিডিও দেখার জন্য।
+
+## ভূমিকা
+
+উচ্চ পর্যায়ে, মেশিন লার্নিং (ML) প্রক্রিয়া তৈরি করার কাজটি কয়েকটি ধাপে বিভক্ত:
+
+1. **প্রশ্ন নির্ধারণ করুন**। বেশিরভাগ ML প্রক্রিয়া এমন একটি প্রশ্ন দিয়ে শুরু হয় যা একটি সাধারণ শর্তযুক্ত প্রোগ্রাম বা নিয়ম-ভিত্তিক ইঞ্জিন দ্বারা উত্তর দেওয়া যায় না। এই প্রশ্নগুলো সাধারণত ডেটার উপর ভিত্তি করে প্রেডিকশন নিয়ে গঠিত।
+2. **ডেটা সংগ্রহ এবং প্রস্তুত করুন**। আপনার প্রশ্নের উত্তর দিতে, আপনাকে ডেটা প্রয়োজন। আপনার ডেটার গুণমান এবং কখনও কখনও পরিমাণ নির্ধারণ করবে আপনি আপনার প্রাথমিক প্রশ্ন কতটা ভালোভাবে উত্তর দিতে পারবেন। ডেটা ভিজ্যুয়ালাইজ করা এই ধাপের একটি গুরুত্বপূর্ণ অংশ। এই ধাপে ডেটাকে ট্রেনিং এবং টেস্টিং গ্রুপে ভাগ করাও অন্তর্ভুক্ত।
+3. **ট্রেনিং পদ্ধতি নির্বাচন করুন**। আপনার প্রশ্ন এবং ডেটার প্রকৃতির উপর নির্ভর করে, আপনাকে একটি মডেল ট্রেন করার পদ্ধতি নির্বাচন করতে হবে যা আপনার ডেটাকে সঠিকভাবে প্রতিফলিত করে এবং এর উপর ভিত্তি করে সঠিক প্রেডিকশন করতে পারে। এই অংশটি বিশেষজ্ঞ জ্ঞান এবং প্রায়ই উল্লেখযোগ্য পরিমাণে পরীক্ষার প্রয়োজন।
+4. **মডেল ট্রেন করুন**। আপনার ট্রেনিং ডেটা ব্যবহার করে, আপনি বিভিন্ন অ্যালগরিদম ব্যবহার করে একটি মডেল ট্রেন করবেন যা ডেটার প্যাটার্নগুলো চিনতে পারে। মডেলটি অভ্যন্তরীণ ওজন ব্যবহার করতে পারে যা ডেটার নির্দিষ্ট অংশগুলোকে অগ্রাধিকার দিতে সামঞ্জস্য করা যায়।
+5. **মডেল মূল্যায়ন করুন**। আপনার সংগ্রহ করা সেট থেকে আগে কখনও দেখা না হওয়া ডেটা (আপনার টেস্টিং ডেটা) ব্যবহার করে দেখুন মডেলটি কেমন পারফর্ম করছে।
+6. **প্যারামিটার টিউনিং**। আপনার মডেলের পারফরম্যান্সের উপর ভিত্তি করে, আপনি বিভিন্ন প্যারামিটার বা ভেরিয়েবল ব্যবহার করে প্রক্রিয়াটি পুনরায় করতে পারেন যা মডেল ট্রেন করার জন্য ব্যবহৃত অ্যালগরিদমের আচরণ নিয়ন্ত্রণ করে।
+7. **প্রেডিকশন করুন**। নতুন ইনপুট ব্যবহার করে আপনার মডেলের সঠিকতা পরীক্ষা করুন।
+
+## কোন প্রশ্ন করবেন
+
+কম্পিউটার ডেটার মধ্যে লুকানো প্যাটার্ন আবিষ্কার করতে বিশেষভাবে দক্ষ। এই দক্ষতা গবেষকদের জন্য খুবই সহায়ক যারা একটি নির্দিষ্ট বিষয়ে এমন প্রশ্ন করেন যা শর্তযুক্ত নিয়ম ইঞ্জিন তৈরি করে সহজে উত্তর দেওয়া যায় না। উদাহরণস্বরূপ, একটি অ্যাকচুয়ারিয়াল কাজের ক্ষেত্রে, একজন ডেটা বিজ্ঞানী ধূমপায়ী বনাম অ-ধূমপায়ীদের মৃত্যুহারের চারপাশে হাতে তৈরি নিয়ম তৈরি করতে পারেন।
+
+যখন অনেক অন্যান্য ভেরিয়েবল সমীকরণে যুক্ত হয়, তখন একটি ML মডেল অতীত স্বাস্থ্য ইতিহাসের উপর ভিত্তি করে ভবিষ্যতের মৃত্যুহার প্রেডিক্ট করতে আরও দক্ষ হতে পারে। একটি আরও আনন্দদায়ক উদাহরণ হতে পারে একটি নির্দিষ্ট স্থানের জন্য এপ্রিল মাসের আবহাওয়ার পূর্বাভাস তৈরি করা, যেখানে ডেটা অন্তর্ভুক্ত করে অক্ষাংশ, দ্রাঘিমাংশ, জলবায়ু পরিবর্তন, সমুদ্রের নিকটবর্তীতা, জেট স্ট্রিমের প্যাটার্ন এবং আরও অনেক কিছু।
+
+✅ এই [স্লাইড ডেক](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) আবহাওয়া মডেলগুলোর জন্য ML ব্যবহারের একটি ঐতিহাসিক দৃষ্টিভঙ্গি প্রদান করে।
+
+## মডেল তৈরির পূর্ববর্তী কাজ
+
+আপনার মডেল তৈরি শুরু করার আগে, কয়েকটি কাজ সম্পন্ন করতে হবে। আপনার প্রশ্ন পরীক্ষা করতে এবং একটি মডেলের প্রেডিকশনের উপর ভিত্তি করে একটি হাইপোথিসিস তৈরি করতে, আপনাকে কয়েকটি উপাদান চিহ্নিত এবং কনফিগার করতে হবে।
+
+### ডেটা
+
+আপনার প্রশ্নের উত্তর নিশ্চিতভাবে দিতে, আপনাকে সঠিক ধরনের পর্যাপ্ত ডেটা প্রয়োজন। এই পর্যায়ে আপনাকে দুটি কাজ করতে হবে:
+
+- **ডেটা সংগ্রহ করুন**। ডেটা বিশ্লেষণে ন্যায্যতার উপর পূর্ববর্তী পাঠটি মনে রেখে, আপনার ডেটা যত্ন সহকারে সংগ্রহ করুন। এই ডেটার উৎস, এর অন্তর্নিহিত পক্ষপাত এবং এর উৎপত্তি নথিভুক্ত করুন।
+- **ডেটা প্রস্তুত করুন**। ডেটা প্রস্তুতির প্রক্রিয়ায় কয়েকটি ধাপ রয়েছে। যদি এটি বিভিন্ন উৎস থেকে আসে, তাহলে আপনাকে ডেটা একত্রিত এবং স্বাভাবিকীকরণ করতে হতে পারে। বিভিন্ন পদ্ধতির মাধ্যমে ডেটার গুণমান এবং পরিমাণ উন্নত করা যায়, যেমন স্ট্রিংকে সংখ্যায় রূপান্তর করা (যেমন আমরা [ক্লাস্টারিং](../../5-Clustering/1-Visualize/README.md) এ করি)। আপনি মূল ডেটার উপর ভিত্তি করে নতুন ডেটা তৈরি করতে পারেন (যেমন আমরা [ক্লাসিফিকেশন](../../4-Classification/1-Introduction/README.md) এ করি)। আপনি ডেটা পরিষ্কার এবং সম্পাদনা করতে পারেন (যেমন আমরা [ওয়েব অ্যাপ](../../3-Web-App/README.md) পাঠের আগে করব)। অবশেষে, আপনার ট্রেনিং কৌশলের উপর নির্ভর করে, আপনাকে এটি র্যান্ডমাইজ এবং শাফল করতে হতে পারে।
+
+✅ ডেটা সংগ্রহ এবং প্রক্রিয়াকরণের পরে, একটি মুহূর্ত নিন এবং দেখুন এর আকৃতি আপনার উদ্দেশ্যপ্রাপ্ত প্রশ্নের উত্তর দিতে সক্ষম হবে কিনা। হতে পারে ডেটা আপনার নির্দিষ্ট কাজের জন্য ভালো পারফর্ম করবে না, যেমন আমরা আমাদের [ক্লাস্টারিং](../../5-Clustering/1-Visualize/README.md) পাঠে আবিষ্কার করি!
+
+### ফিচার এবং টার্গেট
+
+একটি [ফিচার](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) হলো আপনার ডেটার একটি পরিমাপযোগ্য বৈশিষ্ট্য। অনেক ডেটাসেটে এটি একটি কলাম শিরোনাম হিসেবে প্রকাশিত হয়, যেমন 'তারিখ', 'আকার' বা 'রঙ'। আপনার ফিচার ভেরিয়েবল, সাধারণত কোডে `X` দ্বারা প্রতিনিধিত্ব করা হয়, ইনপুট ভেরিয়েবলকে উপস্থাপন করে যা মডেল ট্রেন করতে ব্যবহৃত হবে।
+
+একটি টার্গেট হলো আপনি যা প্রেডিক্ট করার চেষ্টা করছেন। টার্গেট, সাধারণত কোডে `y` দ্বারা প্রতিনিধিত্ব করা হয়, আপনার ডেটার উপর ভিত্তি করে আপনি যে প্রশ্নটি করতে চান তার উত্তর উপস্থাপন করে: ডিসেম্বর মাসে কোন **রঙের** কুমড়া সবচেয়ে সস্তা হবে? সান ফ্রান্সিসকোতে কোন এলাকাগুলোতে রিয়েল এস্টেটের **মূল্য** সবচেয়ে ভালো হবে? কখনও কখনও টার্গেটকে লেবেল অ্যাট্রিবিউটও বলা হয়।
+
+### আপনার ফিচার ভেরিয়েবল নির্বাচন করুন
+
+🎓 **ফিচার সিলেকশন এবং ফিচার এক্সট্রাকশন** মডেল তৈরি করার সময় কোন ভেরিয়েবল নির্বাচন করবেন তা কীভাবে জানবেন? আপনি সম্ভবত ফিচার সিলেকশন বা ফিচার এক্সট্রাকশনের একটি প্রক্রিয়ার মধ্য দিয়ে যাবেন সেরা পারফর্মিং মডেলের জন্য সঠিক ভেরিয়েবলগুলো নির্বাচন করতে। তবে, এগুলো একই জিনিস নয়: "ফিচার এক্সট্রাকশন মূল ফিচারগুলোর ফাংশন থেকে নতুন ফিচার তৈরি করে, যেখানে ফিচার সিলেকশন ফিচারগুলোর একটি সাবসেট প্রদান করে।" ([উৎস](https://wikipedia.org/wiki/Feature_selection))
+
+### আপনার ডেটা ভিজ্যুয়ালাইজ করুন
+
+একজন ডেটা বিজ্ঞানীর টুলকিটের একটি গুরুত্বপূর্ণ দিক হলো ডেটাকে ভিজ্যুয়ালাইজ করার ক্ষমতা, যা Seaborn বা MatPlotLib এর মতো চমৎকার লাইব্রেরি ব্যবহার করে করা যায়। আপনার ডেটাকে ভিজ্যুয়ালি উপস্থাপন করা আপনাকে লুকানো সম্পর্কগুলো আবিষ্কার করতে সাহায্য করতে পারে যা আপনি কাজে লাগাতে পারেন। আপনার ভিজ্যুয়ালাইজেশনগুলো আপনাকে পক্ষপাত বা ভারসাম্যহীন ডেটা আবিষ্কার করতেও সাহায্য করতে পারে (যেমন আমরা [ক্লাসিফিকেশন](../../4-Classification/2-Classifiers-1/README.md) এ আবিষ্কার করি)।
+
+### আপনার ডেটাসেট ভাগ করুন
+
+ট্রেনিংয়ের আগে, আপনাকে আপনার ডেটাসেটকে অসম আকারের দুই বা ততোধিক অংশে ভাগ করতে হবে যা এখনও ডেটাকে ভালোভাবে উপস্থাপন করে।
+
+- **ট্রেনিং**। ডেটাসেটের এই অংশটি আপনার মডেলে ফিট করা হয় এটি ট্রেন করার জন্য। এটি মূল ডেটাসেটের বেশিরভাগ অংশ নিয়ে গঠিত।
+- **টেস্টিং**। একটি টেস্ট ডেটাসেট হলো একটি স্বাধীন ডেটার গ্রুপ, যা প্রায়ই মূল ডেটা থেকে সংগ্রহ করা হয়, যা আপনি তৈরি করা মডেলের পারফরম্যান্স নিশ্চিত করতে ব্যবহার করেন।
+- **ভ্যালিডেটিং**। একটি ভ্যালিডেশন সেট হলো একটি ছোট স্বাধীন উদাহরণের গ্রুপ যা আপনি মডেলের হাইপারপ্যারামিটার বা আর্কিটেকচার টিউন করতে ব্যবহার করেন, মডেলটি উন্নত করতে। আপনার ডেটার আকার এবং আপনি যে প্রশ্ন করছেন তার উপর নির্ভর করে, আপনাকে এই তৃতীয় সেট তৈরি করতে নাও হতে পারে (যেমন আমরা [টাইম সিরিজ ফোরকাস্টিং](../../7-TimeSeries/1-Introduction/README.md) এ উল্লেখ করি)।
+
+## মডেল তৈরি করা
+
+আপনার ট্রেনিং ডেটা ব্যবহার করে, আপনার লক্ষ্য হলো একটি মডেল তৈরি করা, বা আপনার ডেটার একটি পরিসংখ্যানগত উপস্থাপনা, যা বিভিন্ন অ্যালগরিদম ব্যবহার করে **ট্রেন** করা হয়। একটি মডেল ট্রেন করা এটি ডেটার সাথে পরিচিত করে এবং এটি আবিষ্কৃত প্যাটার্নগুলো সম্পর্কে অনুমান করতে, যাচাই করতে এবং গ্রহণ বা প্রত্যাখ্যান করতে সক্ষম করে।
+
+### ট্রেনিং পদ্ধতি নির্ধারণ করুন
+
+আপনার প্রশ্ন এবং ডেটার প্রকৃতির উপর নির্ভর করে, আপনি এটি ট্রেন করার একটি পদ্ধতি নির্বাচন করবেন। [Scikit-learn এর ডকুমেন্টেশন](https://scikit-learn.org/stable/user_guide.html) এর মধ্য দিয়ে হাঁটলে - যা আমরা এই কোর্সে ব্যবহার করি - আপনি মডেল ট্রেন করার অনেক উপায় অন্বেষণ করতে পারেন। আপনার অভিজ্ঞতার উপর নির্ভর করে, আপনি সেরা মডেল তৈরি করতে একাধিক পদ্ধতি চেষ্টা করতে হতে পারে। আপনি সম্ভবত একটি প্রক্রিয়ার মধ্য দিয়ে যাবেন যেখানে ডেটা বিজ্ঞানীরা একটি মডেলের পারফরম্যান্স মূল্যায়ন করেন, এটি অদেখা ডেটা দিয়ে খাওয়ান, সঠিকতা, পক্ষপাত এবং অন্যান্য গুণমান-হ্রাসকারী সমস্যাগুলো পরীক্ষা করেন এবং নির্দিষ্ট কাজের জন্য সবচেয়ে উপযুক্ত ট্রেনিং পদ্ধতি নির্বাচন করেন।
+
+### একটি মডেল ট্রেন করুন
+
+আপনার ট্রেনিং ডেটা নিয়ে, আপনি এটি 'ফিট' করতে প্রস্তুত একটি মডেল তৈরি করতে। আপনি লক্ষ্য করবেন যে অনেক ML লাইব্রেরিতে আপনি 'model.fit' কোডটি পাবেন - এটি সেই সময় যখন আপনি আপনার ফিচার ভেরিয়েবলকে একটি মানের অ্যারে হিসেবে পাঠান (সাধারণত 'X') এবং একটি টার্গেট ভেরিয়েবল (সাধারণত 'y')।
+
+### মডেল মূল্যায়ন করুন
+
+একবার ট্রেনিং প্রক্রিয়া সম্পন্ন হলে (একটি বড় মডেল ট্রেন করতে অনেক পুনরাবৃত্তি বা 'epochs' লাগতে পারে), আপনি মডেলের গুণমান মূল্যায়ন করতে সক্ষম হবেন টেস্ট ডেটা ব্যবহার করে এর পারফরম্যান্স পরিমাপ করতে। এই ডেটা মূল ডেটার একটি সাবসেট যা মডেল পূর্বে বিশ্লেষণ করেনি। আপনি মডেলের গুণমান সম্পর্কে একটি মেট্রিক টেবিল প্রিন্ট করতে পারেন।
+
+🎓 **মডেল ফিটিং**
+
+মেশিন লার্নিং এর প্রসঙ্গে, মডেল ফিটিং একটি মডেলের অন্তর্নিহিত ফাংশনের সঠিকতা নির্দেশ করে, যেটি এমন ডেটা বিশ্লেষণ করার চেষ্টা করে যার সাথে এটি পরিচিত নয়।
+
+🎓 **আন্ডারফিটিং** এবং **ওভারফিটিং** সাধারণ সমস্যা যা মডেলের গুণমানকে হ্রাস করে, কারণ মডেলটি যথেষ্ট ভালোভাবে ফিট হয় না বা খুব ভালোভাবে ফিট হয়। এটি মডেলকে প্রেডিকশন করতে বাধা দেয় যা তার ট্রেনিং ডেটার সাথে খুব বেশি বা খুব কম সংযুক্ত থাকে। একটি ওভারফিট মডেল ট্রেনিং ডেটাকে খুব ভালোভাবে প্রেডিক্ট করে কারণ এটি ডেটার বিস্তারিত এবং শব্দ খুব ভালোভাবে শিখেছে। একটি আন্ডারফিট মডেল সঠিক নয় কারণ এটি তার ট্রেনিং ডেটা বা এটি যে ডেটা 'দেখেনি' তা সঠিকভাবে বিশ্লেষণ করতে পারে না।
+
+
+> ইনফোগ্রাফিক [Jen Looper](https://twitter.com/jenlooper) দ্বারা
+
+## প্যারামিটার টিউনিং
+
+আপনার প্রাথমিক ট্রেনিং সম্পন্ন হওয়ার পরে, মডেলের গুণমান পর্যবেক্ষণ করুন এবং এর 'হাইপারপ্যারামিটার' টুইক করে এটি উন্নত করার কথা বিবেচনা করুন। এই প্রক্রিয়া সম্পর্কে আরও পড়ুন [ডকুমেন্টেশনে](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott)।
+
+## প্রেডিকশন
+
+এটি সেই মুহূর্ত যখন আপনি সম্পূর্ণ নতুন ডেটা ব্যবহার করে আপনার মডেলের সঠিকতা পরীক্ষা করতে পারেন। একটি 'প্রয়োগকৃত' ML সেটিংয়ে, যেখানে আপনি প্রোডাকশনে মডেল ব্যবহার করার জন্য ওয়েব অ্যাসেট তৈরি করছেন, এই প্রক্রিয়াটি ব্যবহারকারীর ইনপুট সংগ্রহ করার (যেমন একটি বোতাম চাপা) মাধ্যমে একটি ভেরিয়েবল সেট করা এবং মডেলে ইনফারেন্স বা মূল্যায়নের জন্য পাঠানোর অন্তর্ভুক্ত হতে পারে।
+
+এই পাঠগুলোতে, আপনি এই ধাপগুলো ব্যবহার করে প্রস্তুত করা, তৈরি করা, পরীক্ষা করা, মূল্যায়ন করা এবং প্রেডিকশন করা শিখবেন - একজন ডেটা বিজ্ঞানীর সমস্ত কার্যকলাপ এবং আরও অনেক কিছু, যেহেতু আপনি 'ফুল স্ট্যাক' ML ইঞ্জিনিয়ার হওয়ার যাত্রায় অগ্রসর হচ্ছেন।
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+একটি ফ্লো চার্ট আঁকুন যা একটি ML প্র্যাকটিশনারের ধাপগুলো প্রতিফলিত করে। আপনি এই প্রক্রিয়ার কোন পর্যায়ে আছেন বলে মনে করেন? আপনি কোথায় সমস্যার সম্মুখীন হতে পারেন বলে মনে করেন? আপনার কাছে কী সহজ মনে হয়?
+
+## [পাঠ-পরবর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/8/)
+
+## পর্যালোচনা এবং স্ব-অধ্যয়ন
+
+অনলাইনে ডেটা বিজ্ঞানীদের সাক্ষাৎকার খুঁজুন যারা তাদের দৈনন্দিন কাজ নিয়ে আলোচনা করেন। এখানে একটি [সাক্ষাৎকার](https://www.youtube.com/watch?v=Z3IjgbbCEfs) রয়েছে।
+
+## অ্যাসাইনমেন্ট
+
+[একজন ডেটা বিজ্ঞানীর সাক্ষাৎকার নিন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/1-Introduction/4-techniques-of-ML/assignment.md b/translations/bn/1-Introduction/4-techniques-of-ML/assignment.md
new file mode 100644
index 000000000..37592f827
--- /dev/null
+++ b/translations/bn/1-Introduction/4-techniques-of-ML/assignment.md
@@ -0,0 +1,25 @@
+
+# একজন ডেটা সায়েন্টিস্টের সাক্ষাৎকার
+
+## নির্দেশনা
+
+আপনার কোম্পানি, একটি ব্যবহারকারী গ্রুপ, বা আপনার বন্ধু বা সহপাঠীদের মধ্যে এমন কারো সাথে কথা বলুন যিনি একজন পেশাদার ডেটা সায়েন্টিস্ট হিসেবে কাজ করেন। তাদের দৈনন্দিন কাজকর্ম সম্পর্কে একটি সংক্ষিপ্ত প্রবন্ধ (৫০০ শব্দ) লিখুন। তারা কি বিশেষজ্ঞ, নাকি 'ফুল স্ট্যাক' হিসেবে কাজ করেন?
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | --------------------- |
+| | সঠিক দৈর্ঘ্যের একটি প্রবন্ধ, যেখানে সূত্র উল্লেখ করা হয়েছে, .doc ফাইল হিসেবে উপস্থাপিত | প্রবন্ধটি সঠিকভাবে সূত্র উল্লেখ করা হয়নি বা প্রয়োজনীয় দৈর্ঘ্যের চেয়ে ছোট | কোনো প্রবন্ধ উপস্থাপিত হয়নি |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/1-Introduction/README.md b/translations/bn/1-Introduction/README.md
new file mode 100644
index 000000000..f4d170cc0
--- /dev/null
+++ b/translations/bn/1-Introduction/README.md
@@ -0,0 +1,37 @@
+
+# মেশিন লার্নিং-এর পরিচিতি
+
+এই পাঠক্রমের এই অংশে, আপনি মেশিন লার্নিং ক্ষেত্রের মূল ধারণাগুলি, এটি কী, এর ইতিহাস এবং গবেষকরা এটি নিয়ে কাজ করার জন্য যে কৌশলগুলি ব্যবহার করেন তা সম্পর্কে জানতে পারবেন। চলুন একসাথে এই নতুন মেশিন লার্নিং-এর জগৎটি অন্বেষণ করি!
+
+
+> ছবি বিল অক্সফোর্ড এর তোলা আনস্প্ল্যাশ-এ
+
+### পাঠসমূহ
+
+1. [মেশিন লার্নিং-এর পরিচিতি](1-intro-to-ML/README.md)
+1. [মেশিন লার্নিং এবং AI-এর ইতিহাস](2-history-of-ML/README.md)
+1. [ন্যায্যতা এবং মেশিন লার্নিং](3-fairness/README.md)
+1. [মেশিন লার্নিং-এর কৌশল](4-techniques-of-ML/README.md)
+
+### কৃতজ্ঞতা
+
+"মেশিন লার্নিং-এর পরিচিতি" ♥️ দিয়ে লিখেছেন একটি দল যার মধ্যে রয়েছেন [মুহাম্মদ সাকিব খান ইনান](https://twitter.com/Sakibinan), [অর্নেলা আলতুনিয়ান](https://twitter.com/ornelladotcom) এবং [জেন লুপার](https://twitter.com/jenlooper)
+
+"মেশিন লার্নিং-এর ইতিহাস" ♥️ দিয়ে লিখেছেন [জেন লুপার](https://twitter.com/jenlooper) এবং [এমি বয়েড](https://twitter.com/AmyKateNicho)
+
+"ন্যায্যতা এবং মেশিন লার্নিং" ♥️ দিয়ে লিখেছেন [তোমোমি ইমুরা](https://twitter.com/girliemac)
+
+"মেশিন লার্নিং-এর কৌশল" ♥️ দিয়ে লিখেছেন [জেন লুপার](https://twitter.com/jenlooper) এবং [ক্রিস নোরিং](https://twitter.com/softchris)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/1-Tools/README.md b/translations/bn/2-Regression/1-Tools/README.md
new file mode 100644
index 000000000..110395bda
--- /dev/null
+++ b/translations/bn/2-Regression/1-Tools/README.md
@@ -0,0 +1,220 @@
+
+# পাইথন এবং স্কিকিট-লার্ন দিয়ে রিগ্রেশন মডেল শুরু করা
+
+
+
+> স্কেচনোট: [টোমোমি ইমুরা](https://www.twitter.com/girlie_mac)
+
+## [পাঠের পূর্ববর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/9/)
+
+> ### [এই পাঠটি R-এও পাওয়া যায়!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
+
+## ভূমিকা
+
+এই চারটি পাঠে, আপনি শিখবেন কীভাবে রিগ্রেশন মডেল তৈরি করতে হয়। আমরা শীঘ্রই আলোচনা করব এগুলো কী কাজে লাগে। তবে তার আগে, নিশ্চিত করুন যে আপনার কাছে সঠিক সরঞ্জাম রয়েছে প্রক্রিয়াটি শুরু করার জন্য!
+
+এই পাঠে, আপনি শিখবেন কীভাবে:
+
+- আপনার কম্পিউটারকে লোকাল মেশিন লার্নিং কাজের জন্য কনফিগার করবেন।
+- জুপিটার নোটবুক ব্যবহার করবেন।
+- স্কিকিট-লার্ন ব্যবহার করবেন, যার মধ্যে ইনস্টলেশন অন্তর্ভুক্ত।
+- একটি হাতে-কলমে অনুশীলনের মাধ্যমে লিনিয়ার রিগ্রেশন অন্বেষণ করবেন।
+
+## ইনস্টলেশন এবং কনফিগারেশন
+
+[](https://youtu.be/-DfeD2k2Kj0 "শিক্ষার্থীদের জন্য মেশিন লার্নিং - মডেল তৈরির জন্য সরঞ্জাম প্রস্তুত করুন")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি সংক্ষিপ্ত ভিডিও দেখার জন্য যেখানে আপনার কম্পিউটারকে মেশিন লার্নিংয়ের জন্য কনফিগার করা দেখানো হয়েছে।
+
+1. **পাইথন ইনস্টল করুন**। নিশ্চিত করুন যে [পাইথন](https://www.python.org/downloads/) আপনার কম্পিউটারে ইনস্টল করা আছে। আপনি ডেটা সায়েন্স এবং মেশিন লার্নিংয়ের অনেক কাজের জন্য পাইথন ব্যবহার করবেন। বেশিরভাগ কম্পিউটার সিস্টেমে ইতোমধ্যেই পাইথন ইনস্টল করা থাকে। কিছু [পাইথন কোডিং প্যাক](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott)ও পাওয়া যায়, যা কিছু ব্যবহারকারীর জন্য সেটআপ সহজ করে তোলে।
+
+ তবে, পাইথনের কিছু ব্যবহার একটি নির্দিষ্ট সংস্করণ প্রয়োজন করে, আবার অন্য কিছু ব্যবহার অন্য সংস্করণ প্রয়োজন করে। এই কারণে, একটি [ভার্চুয়াল এনভায়রনমেন্ট](https://docs.python.org/3/library/venv.html) ব্যবহার করা সুবিধাজনক।
+
+2. **ভিজ্যুয়াল স্টুডিও কোড ইনস্টল করুন**। নিশ্চিত করুন যে আপনার কম্পিউটারে ভিজ্যুয়াল স্টুডিও কোড ইনস্টল করা আছে। [ভিজ্যুয়াল স্টুডিও কোড ইনস্টল করার](https://code.visualstudio.com/) জন্য এই নির্দেশাবলী অনুসরণ করুন। এই কোর্সে আপনি ভিজ্যুয়াল স্টুডিও কোডে পাইথন ব্যবহার করবেন, তাই [পাইথন ডেভেলপমেন্টের জন্য ভিজ্যুয়াল স্টুডিও কোড কনফিগার করার](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) পদ্ধতি সম্পর্কে জেনে নিন।
+
+ > পাইথন নিয়ে স্বাচ্ছন্দ্যবোধ করতে এই [লার্ন মডিউল](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) সংগ্রহটি অনুসরণ করুন।
+ >
+ > [](https://youtu.be/yyQM70vi7V8 "ভিজ্যুয়াল স্টুডিও কোডে পাইথন সেটআপ করুন")
+ >
+ > 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিও দেখার জন্য: ভিজ্যুয়াল স্টুডিও কোডে পাইথন ব্যবহার করা।
+
+3. **স্কিকিট-লার্ন ইনস্টল করুন**, এই [নির্দেশাবলী](https://scikit-learn.org/stable/install.html) অনুসরণ করে। যেহেতু আপনাকে নিশ্চিত করতে হবে যে আপনি পাইথন ৩ ব্যবহার করছেন, তাই ভার্চুয়াল এনভায়রনমেন্ট ব্যবহার করার পরামর্শ দেওয়া হয়। মনে রাখবেন, যদি আপনি এটি একটি M1 ম্যাক-এ ইনস্টল করেন, তাহলে উপরের লিঙ্কে বিশেষ নির্দেশাবলী রয়েছে।
+
+4. **জুপিটার নোটবুক ইনস্টল করুন**। আপনাকে [জুপিটার প্যাকেজ](https://pypi.org/project/jupyter/) ইনস্টল করতে হবে।
+
+## আপনার মেশিন লার্নিং লেখার পরিবেশ
+
+আপনি **নোটবুক** ব্যবহার করবেন আপনার পাইথন কোড ডেভেলপ করতে এবং মেশিন লার্নিং মডেল তৈরি করতে। এই ধরনের ফাইল ডেটা সায়েন্টিস্টদের জন্য একটি সাধারণ টুল এবং এগুলো `.ipynb` এক্সটেনশনের মাধ্যমে চিহ্নিত করা যায়।
+
+নোটবুক একটি ইন্টারঅ্যাকটিভ পরিবেশ যা ডেভেলপারকে কোড লেখার পাশাপাশি নোট যোগ করতে এবং কোডের চারপাশে ডকুমেন্টেশন লিখতে দেয়, যা পরীক্ষামূলক বা গবেষণাভিত্তিক প্রকল্পের জন্য বেশ সহায়ক।
+
+[](https://youtu.be/7E-jC8FLA2E "শিক্ষার্থীদের জন্য মেশিন লার্নিং - রিগ্রেশন মডেল তৈরি শুরু করতে জুপিটার নোটবুক সেটআপ করুন")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি সংক্ষিপ্ত ভিডিও দেখার জন্য যেখানে এই অনুশীলনটি দেখানো হয়েছে।
+
+### অনুশীলন - একটি নোটবুক নিয়ে কাজ করুন
+
+এই ফোল্ডারে, আপনি _notebook.ipynb_ ফাইলটি পাবেন।
+
+1. ভিজ্যুয়াল স্টুডিও কোডে _notebook.ipynb_ খুলুন।
+
+ একটি জুপিটার সার্ভার চালু হবে এবং পাইথন ৩+ শুরু হবে। আপনি নোটবুকের এমন কিছু অংশ খুঁজে পাবেন যা `run` করা যায়, অর্থাৎ কোডের টুকরো। একটি কোড ব্লক চালানোর জন্য, প্লে বাটনের মতো দেখতে আইকনটি নির্বাচন করুন।
+
+2. `md` আইকনটি নির্বাচন করুন এবং কিছু মার্কডাউন যোগ করুন, যেমন **# Welcome to your notebook**।
+
+ এরপর, কিছু পাইথন কোড যোগ করুন।
+
+3. কোড ব্লকে **print('hello notebook')** টাইপ করুন।
+4. কোড চালানোর জন্য তীর চিহ্নটি নির্বাচন করুন।
+
+ আপনি নিচের আউটপুটটি দেখতে পাবেন:
+
+ ```output
+ hello notebook
+ ```
+
+
+
+আপনার কোডের সাথে মন্তব্য যোগ করে নোটবুকটি স্ব-ডকুমেন্ট করতে পারেন।
+
+✅ এক মিনিটের জন্য ভাবুন, একজন ওয়েব ডেভেলপারের কাজের পরিবেশ এবং একজন ডেটা সায়েন্টিস্টের কাজের পরিবেশ কতটা ভিন্ন।
+
+## স্কিকিট-লার্ন দিয়ে কাজ শুরু
+
+এখন যেহেতু আপনার লোকাল পরিবেশে পাইথন সেটআপ করা হয়েছে এবং আপনি জুপিটার নোটবুক নিয়ে স্বাচ্ছন্দ্যবোধ করছেন, চলুন স্কিকিট-লার্ন নিয়ে সমানভাবে স্বাচ্ছন্দ্যবোধ করি। (উচ্চারণ করুন `sci` যেমন `science`)। স্কিকিট-লার্ন মেশিন লার্নিং কাজ সম্পাদনের জন্য একটি [ব্যাপক এপিআই](https://scikit-learn.org/stable/modules/classes.html#api-ref) প্রদান করে।
+
+তাদের [ওয়েবসাইট](https://scikit-learn.org/stable/getting_started.html) অনুযায়ী, "স্কিকিট-লার্ন একটি ওপেন সোর্স মেশিন লার্নিং লাইব্রেরি যা সুপারভাইজড এবং আনসুপারভাইজড লার্নিং সমর্থন করে। এটি মডেল ফিটিং, ডেটা প্রিপ্রসেসিং, মডেল নির্বাচন এবং মূল্যায়ন, এবং অন্যান্য অনেক ইউটিলিটির জন্য বিভিন্ন টুল সরবরাহ করে।"
+
+এই কোর্সে, আপনি স্কিকিট-লার্ন এবং অন্যান্য টুল ব্যবহার করে মেশিন লার্নিং মডেল তৈরি করবেন যা আমরা 'প্রথাগত মেশিন লার্নিং' কাজ বলে থাকি। আমরা ইচ্ছাকৃতভাবে নিউরাল নেটওয়ার্ক এবং ডিপ লার্নিং এড়িয়ে গেছি, কারণ সেগুলো আমাদের আসন্ন 'AI for Beginners' কারিকুলামে ভালোভাবে কভার করা হবে।
+
+স্কিকিট-লার্ন মডেল তৈরি এবং সেগুলো মূল্যায়ন করা সহজ করে তোলে। এটি প্রধানত সংখ্যাসূচক ডেটা ব্যবহার করে এবং শিক্ষার সরঞ্জাম হিসেবে ব্যবহারের জন্য বেশ কিছু প্রস্তুত ডেটাসেট অন্তর্ভুক্ত করে। এটি শিক্ষার্থীদের চেষ্টা করার জন্য প্রি-বিল্ট মডেলও অন্তর্ভুক্ত করে। চলুন প্রিপ্যাকেজড ডেটা লোড করা এবং একটি বিল্ট-ইন এস্টিমেটর ব্যবহার করে প্রথম মেশিন লার্নিং মডেল তৈরি করার প্রক্রিয়া অন্বেষণ করি।
+
+## অনুশীলন - আপনার প্রথম স্কিকিট-লার্ন নোটবুক
+
+> এই টিউটোরিয়ালটি স্কিকিট-লার্নের ওয়েবসাইটে [লিনিয়ার রিগ্রেশন উদাহরণ](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) দ্বারা অনুপ্রাণিত।
+
+[](https://youtu.be/2xkXL5EUpS0 "শিক্ষার্থীদের জন্য মেশিন লার্নিং - পাইথনে আপনার প্রথম লিনিয়ার রিগ্রেশন প্রকল্প")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি সংক্ষিপ্ত ভিডিও দেখার জন্য যেখানে এই অনুশীলনটি দেখানো হয়েছে।
+
+এই পাঠের সাথে সম্পর্কিত _notebook.ipynb_ ফাইলটি খুলুন এবং সমস্ত সেল মুছে ফেলুন 'ট্র্যাশ ক্যান' আইকনে ক্লিক করে।
+
+এই অংশে, আপনি স্কিকিট-লার্নে অন্তর্ভুক্ত একটি ছোট ডায়াবেটিস ডেটাসেট নিয়ে কাজ করবেন যা শেখার উদ্দেশ্যে তৈরি। ধরুন আপনি ডায়াবেটিস রোগীদের জন্য একটি চিকিৎসা পরীক্ষা করতে চান। মেশিন লার্নিং মডেলগুলো আপনাকে সাহায্য করতে পারে কোন রোগী চিকিৎসায় ভালো সাড়া দেবে তা নির্ধারণ করতে, ভেরিয়েবলগুলোর সংমিশ্রণের ভিত্তিতে। এমনকি একটি খুব সাধারণ রিগ্রেশন মডেল, যখন ভিজ্যুয়ালাইজ করা হয়, তখন ভেরিয়েবলগুলোর সম্পর্ক সম্পর্কে তথ্য দেখাতে পারে যা আপনাকে আপনার তাত্ত্বিক ক্লিনিকাল ট্রায়াল সংগঠিত করতে সাহায্য করবে।
+
+✅ রিগ্রেশনের অনেক ধরনের পদ্ধতি রয়েছে, এবং আপনি কোনটি বেছে নেবেন তা নির্ভর করে আপনি কী উত্তর খুঁজছেন তার ওপর। যদি আপনি একটি নির্দিষ্ট বয়সের ব্যক্তির সম্ভাব্য উচ্চতা পূর্বানুমান করতে চান, তাহলে আপনি লিনিয়ার রিগ্রেশন ব্যবহার করবেন, কারণ আপনি একটি **সংখ্যাসূচক মান** খুঁজছেন। যদি আপনি জানতে চান একটি নির্দিষ্ট ধরনের খাবার ভেগান হিসেবে বিবেচিত হওয়া উচিত কিনা, তাহলে আপনি একটি **ক্যাটেগরি অ্যাসাইনমেন্ট** খুঁজছেন, তাই আপনি লজিস্টিক রিগ্রেশন ব্যবহার করবেন। আপনি পরে লজিস্টিক রিগ্রেশন সম্পর্কে আরও শিখবেন। ডেটা থেকে কিছু প্রশ্ন ভাবুন এবং কোন পদ্ধতি বেশি উপযুক্ত হবে তা নিয়ে চিন্তা করুন।
+
+চলুন এই কাজটি শুরু করি।
+
+### লাইব্রেরি ইমপোর্ট করুন
+
+এই কাজের জন্য আমরা কিছু লাইব্রেরি ইমপোর্ট করব:
+
+- **matplotlib**। এটি একটি কার্যকর [গ্রাফিং টুল](https://matplotlib.org/) এবং আমরা এটি একটি লাইন প্লট তৈরি করতে ব্যবহার করব।
+- **numpy**। [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) পাইথনে সংখ্যাসূচক ডেটা পরিচালনার জন্য একটি কার্যকর লাইব্রেরি।
+- **sklearn**। এটি [স্কিকিট-লার্ন](https://scikit-learn.org/stable/user_guide.html) লাইব্রেরি।
+
+আপনার কাজের জন্য কিছু লাইব্রেরি ইমপোর্ট করুন।
+
+1. নিচের কোডটি টাইপ করে ইমপোর্ট করুন:
+
+ ```python
+ import matplotlib.pyplot as plt
+ import numpy as np
+ from sklearn import datasets, linear_model, model_selection
+ ```
+
+ উপরের কোডে আপনি `matplotlib`, `numpy` এবং `sklearn` থেকে `datasets`, `linear_model` এবং `model_selection` ইমপোর্ট করছেন। `model_selection` ডেটাকে ট্রেনিং এবং টেস্ট সেটে ভাগ করার জন্য ব্যবহৃত হয়।
+
+### ডায়াবেটিস ডেটাসেট
+
+বিল্ট-ইন [ডায়াবেটিস ডেটাসেট](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset)-এ ডায়াবেটিস সম্পর্কিত ৪৪২টি নমুনা ডেটা রয়েছে, যার মধ্যে ১০টি ফিচার ভেরিয়েবল অন্তর্ভুক্ত, যেমন:
+
+- age: বয়স (বছরে)
+- bmi: বডি মাস ইনডেক্স
+- bp: গড় রক্তচাপ
+- s1 tc: টি-সেল (এক ধরনের শ্বেত রক্তকণিকা)
+
+✅ এই ডেটাসেটে 'sex' ধারণাটি একটি ফিচার ভেরিয়েবল হিসেবে অন্তর্ভুক্ত, যা ডায়াবেটিস গবেষণার জন্য গুরুত্বপূর্ণ। অনেক মেডিকেল ডেটাসেটে এই ধরনের বাইনারি শ্রেণিবিন্যাস অন্তর্ভুক্ত থাকে। ভাবুন, কীভাবে এই ধরনের শ্রেণিবিন্যাস জনসংখ্যার কিছু অংশকে চিকিৎসা থেকে বাদ দিতে পারে।
+
+এখন, X এবং y ডেটা লোড করুন।
+
+> 🎓 মনে রাখবেন, এটি সুপারভাইজড লার্নিং, এবং আমাদের একটি নামকৃত 'y' টার্গেট প্রয়োজন।
+
+একটি নতুন কোড সেলে, `load_diabetes()` কল করে ডায়াবেটিস ডেটাসেট লোড করুন। ইনপুট `return_X_y=True` নির্দেশ করে যে `X` একটি ডেটা ম্যাট্রিক্স হবে, এবং `y` হবে রিগ্রেশন টার্গেট।
+
+1. ডেটা ম্যাট্রিক্সের আকার এবং এর প্রথম উপাদান দেখানোর জন্য কিছু প্রিন্ট কমান্ড যোগ করুন:
+
+ ```python
+ X, y = datasets.load_diabetes(return_X_y=True)
+ print(X.shape)
+ print(X[0])
+ ```
+
+ আপনি যা রেসপন্স হিসেবে পাচ্ছেন তা একটি টাপল। আপনি যা করছেন তা হলো টাপলের প্রথম দুটি মান যথাক্রমে `X` এবং `y`-তে অ্যাসাইন করা। [টাপল সম্পর্কে আরও জানুন](https://wikipedia.org/wiki/Tuple)।
+
+ আপনি দেখতে পাবেন যে এই ডেটায় ৪৪২টি আইটেম রয়েছে যা ১০টি উপাদানের অ্যারে আকারে সাজানো:
+
+ ```text
+ (442, 10)
+ [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
+ -0.04340085 -0.00259226 0.01990842 -0.01764613]
+ ```
+
+ ✅ ডেটা এবং রিগ্রেশন টার্গেটের মধ্যে সম্পর্ক নিয়ে একটু ভাবুন। লিনিয়ার রিগ্রেশন ফিচার X এবং টার্গেট ভেরিয়েবল y-এর মধ্যে সম্পর্ক পূর্বানুমান করে। ডায়াবেটিস ডেটাসেটের জন্য [টার্গেট](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) ডকুমেন্টেশনে খুঁজে বের করতে পারেন? এই ডেটাসেট কী প্রদর্শন করছে?
+
+2. এরপর, ডেটাসেটের একটি অংশ প্লট করার জন্য নির্বাচন করুন, ডেটাসেটের ৩য় কলামটি নির্বাচন করে। এটি করতে, `:` অপারেটর ব্যবহার করে সব রো নির্বাচন করুন, এবং তারপর ৩য় কলামটি (ইন্ডেক্স ২) নির্বাচন করুন। এছাড়াও, ডেটাকে ২ডি অ্যারে হিসেবে রিশেপ করুন - প্লট করার জন্য প্রয়োজনীয় - `reshape(n_rows, n_columns)` ব্যবহার করে। যদি প্যারামিটারগুলোর একটি -১ হয়, সংশ্লিষ্ট ডাইমেনশন স্বয়ংক্রিয়ভাবে গণনা করা হয়।
+
+ ```python
+ X = X[:, 2]
+ X = X.reshape((-1,1))
+ ```
+
+ ✅ যেকোনো সময়, ডেটার আকার প্রিন্ট করে চেক করুন।
+
+3. এখন যেহেতু আপনার ডেটা প্লট করার জন্য প্রস্তুত, আপনি দেখতে পারেন একটি মেশিন এই ডেটাসেটে সংখ্যাগুলোর মধ্যে একটি যৌক্তিক বিভাজন নির্ধারণ করতে পারে কিনা। এটি করতে, আপনাকে ডেটা (X) এবং টার্গেট (y) উভয়কেই টেস্ট এবং ট্রেনিং সেটে ভাগ করতে হবে। স্কিকিট-লার্ন এটি করার একটি সহজ উপায় সরবরাহ করে; আপনি একটি নির্দিষ্ট পয়েন্টে আপনার টেস্ট ডেটা ভাগ করতে পারেন।
+
+ ```python
+ X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
+ ```
+
+4. এখন আপনি আপনার মডেল ট্রেন করার জন্য প্রস্তুত! লিনিয়ার রিগ্রেশন মডেল লোড করুন এবং `model.fit()` ব্যবহার করে আপনার X এবং y ট্রেনিং সেট দিয়ে এটি ট্রেন করুন:
+
+ ```python
+ model = linear_model.LinearRegression()
+ model.fit(X_train, y_train)
+ ```
+
+ ✅ `model.fit()` একটি ফাংশন যা আপনি টেনসরফ্লোসহ অনেক এমএল লাইব্রের
+✅ এখানে কী ঘটছে তা নিয়ে একটু ভাবুন। একটি সরল রেখা অনেক ছোট ছোট ডেটা বিন্দুর মধ্য দিয়ে যাচ্ছে, কিন্তু এটি আসলে কী করছে? আপনি কি দেখতে পাচ্ছেন যে এই রেখাটি কীভাবে আপনাকে অনুমান করতে সাহায্য করতে পারে যে একটি নতুন, অদেখা ডেটা পয়েন্ট প্লটের y অক্ষের সাথে সম্পর্কিত কোথায় ফিট হবে? এই মডেলের ব্যবহারিক দিকটি শব্দে প্রকাশ করার চেষ্টা করুন।
+
+অভিনন্দন, আপনি আপনার প্রথম লিনিয়ার রিগ্রেশন মডেল তৈরি করেছেন, এটি দিয়ে একটি পূর্বাভাস তৈরি করেছেন এবং এটি একটি প্লটে প্রদর্শন করেছেন!
+
+---
+## 🚀চ্যালেঞ্জ
+
+এই ডেটাসেট থেকে একটি ভিন্ন ভেরিয়েবল প্লট করুন। ইঙ্গিত: এই লাইনটি সম্পাদনা করুন: `X = X[:,2]`। এই ডেটাসেটের লক্ষ্য বিবেচনা করে, আপনি ডায়াবেটিস রোগের অগ্রগতি সম্পর্কে কী আবিষ্কার করতে সক্ষম?
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/10/)
+
+## পুনরালোচনা ও স্ব-অধ্যয়ন
+
+এই টিউটোরিয়ালে, আপনি সাধারণ লিনিয়ার রিগ্রেশন নিয়ে কাজ করেছেন, ইউনিভেরিয়েট বা মাল্টিপল লিনিয়ার রিগ্রেশনের পরিবর্তে। এই পদ্ধতিগুলির মধ্যে পার্থক্য সম্পর্কে একটু পড়ুন, অথবা [এই ভিডিওটি](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef) দেখুন।
+
+রিগ্রেশনের ধারণা সম্পর্কে আরও পড়ুন এবং ভাবুন এই কৌশলটি দিয়ে কী ধরনের প্রশ্নের উত্তর দেওয়া যায়। আপনার বোঝাপড়া গভীর করতে এই [টিউটোরিয়ালটি](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) নিন।
+
+## অ্যাসাইনমেন্ট
+
+[একটি ভিন্ন ডেটাসেট](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/1-Tools/assignment.md b/translations/bn/2-Regression/1-Tools/assignment.md
new file mode 100644
index 000000000..a7cb8535b
--- /dev/null
+++ b/translations/bn/2-Regression/1-Tools/assignment.md
@@ -0,0 +1,27 @@
+
+# স্কিকিট-লার্ন দিয়ে রিগ্রেশন
+
+## নির্দেশনা
+
+স্কিকিট-লার্নের [লিনারুড ডেটাসেট](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) দেখুন। এই ডেটাসেটে একাধিক [টার্গেট](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset) রয়েছে: 'এটি তিনটি ব্যায়াম (ডেটা) এবং তিনটি শারীরবৃত্তীয় (টার্গেট) ভেরিয়েবল নিয়ে গঠিত, যা একটি ফিটনেস ক্লাবে বিশজন মধ্যবয়সী পুরুষের কাছ থেকে সংগ্রহ করা হয়েছে।'
+
+আপনার নিজের ভাষায় ব্যাখ্যা করুন কীভাবে একটি রিগ্রেশন মডেল তৈরি করা যায় যা কোমরের মাপ এবং কতগুলো সিটআপ সম্পন্ন করা হয়েছে তার মধ্যে সম্পর্ক প্রদর্শন করবে। এই ডেটাসেটের অন্যান্য ডেটাপয়েন্টগুলোর জন্যও একই কাজ করুন।
+
+## মূল্যায়ন
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| ------------------------------ | --------------------------------- | ----------------------------- | -------------------------- |
+| একটি বর্ণনামূলক অনুচ্ছেদ জমা দিন | ভালোভাবে লেখা অনুচ্ছেদ জমা দেওয়া হয়েছে | কয়েকটি বাক্য জমা দেওয়া হয়েছে | কোনো বর্ণনা জমা দেওয়া হয়নি |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/1-Tools/notebook.ipynb b/translations/bn/2-Regression/1-Tools/notebook.ipynb
new file mode 100644
index 000000000..e69de29bb
diff --git a/translations/bn/2-Regression/1-Tools/solution/Julia/README.md b/translations/bn/2-Regression/1-Tools/solution/Julia/README.md
new file mode 100644
index 000000000..b7a674465
--- /dev/null
+++ b/translations/bn/2-Regression/1-Tools/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb b/translations/bn/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb
new file mode 100644
index 000000000..ea9b57590
--- /dev/null
+++ b/translations/bn/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb
@@ -0,0 +1,448 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "metadata": {
+ "colab": {
+ "name": "lesson_1-R.ipynb",
+ "provenance": [],
+ "collapsed_sections": [],
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "name": "ir",
+ "display_name": "R"
+ },
+ "language_info": {
+ "name": "R"
+ },
+ "coopTranslator": {
+ "original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
+ "translation_date": "2025-08-29T23:07:26+00:00",
+ "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "YJUHCXqK57yz"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## রিগ্রেশন পরিচিতি - পাঠ ১\n",
+ "\n",
+ "#### বিষয়টি বুঝে নেওয়া\n",
+ "\n",
+ "✅ রিগ্রেশনের অনেক ধরণ রয়েছে, এবং আপনি কোনটি বেছে নেবেন তা নির্ভর করে আপনার প্রশ্নের উত্তর কী হতে পারে তার উপর। যদি আপনি কোনো নির্দিষ্ট বয়সের ব্যক্তির সম্ভাব্য উচ্চতা পূর্বানুমান করতে চান, তাহলে আপনি `লিনিয়ার রিগ্রেশন` ব্যবহার করবেন, কারণ আপনি একটি **সংখ্যামূলক মান** খুঁজছেন। যদি আপনি জানতে চান কোনো খাবারকে ভেগান হিসেবে বিবেচনা করা উচিত কিনা, তাহলে আপনি একটি **শ্রেণী নির্ধারণ** খুঁজছেন, সেক্ষেত্রে আপনি `লজিস্টিক রিগ্রেশন` ব্যবহার করবেন। আপনি পরে লজিস্টিক রিগ্রেশন সম্পর্কে আরও শিখবেন। ডেটা থেকে কিছু প্রশ্ন করার কথা ভাবুন এবং কোন পদ্ধতিটি বেশি উপযুক্ত হবে তা নির্ধারণ করুন।\n",
+ "\n",
+ "এই অংশে, আপনি [ডায়াবেটিস সম্পর্কিত একটি ছোট ডেটাসেট](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html) নিয়ে কাজ করবেন। কল্পনা করুন যে আপনি ডায়াবেটিস রোগীদের জন্য একটি চিকিৎসা পরীক্ষা করতে চান। মেশিন লার্নিং মডেলগুলো আপনাকে সাহায্য করতে পারে কোন রোগী চিকিৎসায় ভালো সাড়া দেবে তা নির্ধারণ করতে, বিভিন্ন ভেরিয়েবলের সংমিশ্রণের উপর ভিত্তি করে। এমনকি একটি খুব সাধারণ রিগ্রেশন মডেল, যখন ভিজুয়ালাইজ করা হয়, তখন এমন তথ্য দেখাতে পারে যা আপনাকে তাত্ত্বিক ক্লিনিকাল ট্রায়ালগুলো সংগঠিত করতে সাহায্য করবে।\n",
+ "\n",
+ "তাহলে, চলুন এই কাজটি শুরু করা যাক!\n",
+ "\n",
+ "
\n",
+ " \n",
+ " চিত্রকর্ম: @allison_horst\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "LWNNzfqd6feZ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 1. আমাদের টুল সেট লোড করা\n",
+ "\n",
+ "এই কাজের জন্য, আমাদের নিম্নলিখিত প্যাকেজগুলো প্রয়োজন হবে:\n",
+ "\n",
+ "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) হলো একটি [R প্যাকেজের সংগ্রহ](https://www.tidyverse.org/packages) যা ডেটা সায়েন্সকে দ্রুত, সহজ এবং আরও মজাদার করে তোলে!\n",
+ "\n",
+ "- `tidymodels`: [tidymodels](https://www.tidymodels.org/) ফ্রেমওয়ার্ক হলো মডেলিং এবং মেশিন লার্নিংয়ের জন্য একটি [প্যাকেজের সংগ্রহ](https://www.tidymodels.org/packages/)।\n",
+ "\n",
+ "আপনি এগুলো নিম্নলিখিতভাবে ইনস্টল করতে পারেন:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
+ "\n",
+ "নিচের স্ক্রিপ্টটি পরীক্ষা করে দেখবে যে আপনার এই মডিউল সম্পন্ন করার জন্য প্রয়োজনীয় প্যাকেজগুলো আছে কিনা এবং যদি কিছু প্যাকেজ অনুপস্থিত থাকে তবে সেগুলো আপনার জন্য ইনস্টল করবে।\n"
+ ],
+ "metadata": {
+ "id": "FIo2YhO26wI9"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "source": [
+ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
+ "pacman::p_load(tidyverse, tidymodels)"
+ ],
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "Loading required package: pacman\n",
+ "\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "id": "cIA9fz9v7Dss",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এখন, চলুন এই চমৎকার প্যাকেজগুলো লোড করি এবং সেগুলোকে আমাদের বর্তমান R সেশনে উপলব্ধ করি। (এটি শুধুমাত্র উদাহরণের জন্য, `pacman::p_load()` ইতিমধ্যেই আপনার জন্য এটি করেছে)\n"
+ ],
+ "metadata": {
+ "id": "gpO_P_6f9WUG"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# load the core Tidyverse packages\r\n",
+ "library(tidyverse)\r\n",
+ "\r\n",
+ "# load the core Tidymodels packages\r\n",
+ "library(tidymodels)\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "NLMycgG-9ezO"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## ২. ডায়াবেটিস ডেটাসেট\n",
+ "\n",
+ "এই অনুশীলনে, আমরা ডায়াবেটিস ডেটাসেটের উপর পূর্বাভাস তৈরি করে আমাদের রিগ্রেশন দক্ষতা প্রদর্শন করব। [ডায়াবেটিস ডেটাসেট](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt)-এ ডায়াবেটিস সম্পর্কিত `৪৪২টি নমুনা` রয়েছে, যেখানে ১০টি পূর্বাভাসকারী ফিচার ভেরিয়েবল রয়েছে: `বয়স`, `লিঙ্গ`, `বডি মাস ইনডেক্স`, `গড় রক্তচাপ`, এবং `ছয়টি রক্তের সিরাম পরিমাপ`। এছাড়াও একটি আউটকাম ভেরিয়েবল `y` রয়েছে: যা বেসলাইন থেকে এক বছর পর রোগের অগ্রগতির একটি পরিমাণগত পরিমাপ।\n",
+ "\n",
+ "|পর্যবেক্ষণের সংখ্যা|৪৪২|\n",
+ "|-------------------|:---|\n",
+ "|পূর্বাভাসকারীর সংখ্যা|প্রথম ১০টি কলাম সংখ্যাসূচক পূর্বাভাসকারী|\n",
+ "|আউটকাম/টার্গেট|১১তম কলাম বেসলাইন থেকে এক বছর পর রোগের অগ্রগতির একটি পরিমাণগত পরিমাপ|\n",
+ "|পূর্বাভাসকারীর তথ্য|- বয়স (বছরে)\n",
+ "||- লিঙ্গ\n",
+ "||- bmi বডি মাস ইনডেক্স\n",
+ "||- bp গড় রক্তচাপ\n",
+ "||- s1 tc, মোট সিরাম কোলেস্টেরল\n",
+ "||- s2 ldl, লো-ডেনসিটি লিপোপ্রোটিন\n",
+ "||- s3 hdl, হাই-ডেনসিটি লিপোপ্রোটিন\n",
+ "||- s4 tch, মোট কোলেস্টেরল / HDL\n",
+ "||- s5 ltg, সম্ভবত সিরাম ট্রাইগ্লিসারাইডের লগ স্তর\n",
+ "||- s6 glu, রক্তে শর্করার স্তর|\n",
+ "\n",
+ "> 🎓 মনে রাখবেন, এটি সুপারভাইজড লার্নিং, এবং আমাদের একটি নামকৃত 'y' টার্গেট প্রয়োজন।\n",
+ "\n",
+ "আপনি R দিয়ে ডেটা ম্যানিপুলেট করার আগে, আপনাকে ডেটা R-এর মেমরিতে ইমপোর্ট করতে হবে, অথবা ডেটার সাথে সংযোগ তৈরি করতে হবে যাতে R দূরবর্তীভাবে ডেটা অ্যাক্সেস করতে পারে।\n",
+ "\n",
+ "> [readr](https://readr.tidyverse.org/) প্যাকেজ, যা Tidyverse-এর অংশ, দ্রুত এবং সহজ উপায়ে আয়তাকার ডেটা R-এ পড়ার জন্য একটি বন্ধুত্বপূর্ণ পদ্ধতি প্রদান করে।\n",
+ "\n",
+ "এখন, এই সোর্স URL থেকে ডায়াবেটিস ডেটাসেট লোড করি: \n",
+ "\n",
+ "এছাড়াও, আমরা আমাদের ডেটার উপর একটি স্যানিটি চেক করব `glimpse()` ব্যবহার করে এবং প্রথম ৫টি সারি প্রদর্শন করব `slice()` দিয়ে।\n",
+ "\n",
+ "আরো এগোনোর আগে, চলুন এমন একটি বিষয় পরিচয় করিয়ে দিই যা আপনি R কোডে প্রায়ই দেখবেন 🥁🥁: পাইপ অপারেটর `%>%`\n",
+ "\n",
+ "পাইপ অপারেটর (`%>%`) একটি বস্তুকে একটি ফাংশন বা কল এক্সপ্রেশনে ফরোয়ার্ড পাস করে যৌক্তিক ক্রমে অপারেশন সম্পাদন করে। আপনি পাইপ অপারেটরকে আপনার কোডে \"এবং তারপর\" বলার মতো ভাবতে পারেন।\n"
+ ],
+ "metadata": {
+ "id": "KM6iXLH996Cl"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Import the data set\r\n",
+ "diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Get a glimpse and dimensions of the data\r\n",
+ "glimpse(diabetes)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Select the first 5 rows of the data\r\n",
+ "diabetes %>% \r\n",
+ " slice(1:5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "Z1geAMhM-bSP"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "`glimpse()` আমাদের দেখায় যে এই ডেটাসেটে ৪৪২টি সারি এবং ১১টি কলাম রয়েছে, যেখানে সব কলামের ডেটা টাইপ `double`।\n",
+ "\n",
+ " \n",
+ "\n",
+ "> glimpse() এবং slice() হলো [`dplyr`](https://dplyr.tidyverse.org/) প্যাকেজের ফাংশন। Dplyr, যা Tidyverse-এর অংশ, একটি ডেটা ম্যানিপুলেশনের ব্যাকরণ যা একটি সুনির্দিষ্ট সেটের ক্রিয়াপদ সরবরাহ করে, যা আপনাকে সবচেয়ে সাধারণ ডেটা ম্যানিপুলেশনের চ্যালেঞ্জগুলি সমাধান করতে সাহায্য করে।\n",
+ "\n",
+ " \n",
+ "\n",
+ "এখন যেহেতু আমাদের কাছে ডেটা রয়েছে, আসুন এই অনুশীলনের জন্য একটি নির্দিষ্ট ফিচার (`bmi`) বেছে নিই। এর জন্য আমাদের প্রয়োজনীয় কলামগুলো নির্বাচন করতে হবে। তাহলে, আমরা কীভাবে এটি করব?\n",
+ "\n",
+ "[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) আমাদের একটি ডেটা ফ্রেম থেকে কলাম *নির্বাচন* (এবং প্রয়োজনে পুনঃনামকরণ) করার সুযোগ দেয়।\n"
+ ],
+ "metadata": {
+ "id": "UwjVT1Hz-c3Z"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Select predictor feature `bmi` and outcome `y`\r\n",
+ "diabetes_select <- diabetes %>% \r\n",
+ " select(c(bmi, y))\r\n",
+ "\r\n",
+ "# Print the first 5 rows\r\n",
+ "diabetes_select %>% \r\n",
+ " slice(1:10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "RDY1oAKI-m80"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## ৩. প্রশিক্ষণ এবং পরীক্ষার ডেটা\n",
+ "\n",
+ "সুপারভাইজড লার্নিং-এ সাধারণত ডেটাকে দুইটি উপসেটে ভাগ করা হয়; একটি (সাধারণত বড়) সেট দিয়ে মডেল প্রশিক্ষণ দেওয়া হয়, এবং একটি ছোট \"হোল্ড-ব্যাক\" সেট দিয়ে দেখা হয় মডেলটি কেমন কাজ করেছে।\n",
+ "\n",
+ "এখন যেহেতু আমাদের ডেটা প্রস্তুত, আমরা দেখতে পারি একটি মেশিন এই ডেটাসেটে সংখ্যাগুলোর মধ্যে একটি যৌক্তিক বিভাজন নির্ধারণ করতে সাহায্য করতে পারে কিনা। আমরা [rsample](https://tidymodels.github.io/rsample/) প্যাকেজটি ব্যবহার করতে পারি, যা Tidymodels ফ্রেমওয়ার্কের অংশ, একটি অবজেক্ট তৈরি করতে যা ডেটা কীভাবে ভাগ করা হবে তার তথ্য ধারণ করে। এরপর, তৈরি করা প্রশিক্ষণ এবং পরীক্ষার সেটগুলো বের করতে আরও দুটি rsample ফাংশন ব্যবহার করা যায়:\n"
+ ],
+ "metadata": {
+ "id": "SDk668xK-tc3"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "set.seed(2056)\r\n",
+ "# Split 67% of the data for training and the rest for tesing\r\n",
+ "diabetes_split <- diabetes_select %>% \r\n",
+ " initial_split(prop = 0.67)\r\n",
+ "\r\n",
+ "# Extract the resulting train and test sets\r\n",
+ "diabetes_train <- training(diabetes_split)\r\n",
+ "diabetes_test <- testing(diabetes_split)\r\n",
+ "\r\n",
+ "# Print the first 3 rows of the training set\r\n",
+ "diabetes_train %>% \r\n",
+ " slice(1:10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "EqtHx129-1h-"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 4. Tidymodels ব্যবহার করে একটি লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দিন\n",
+ "\n",
+ "এখন আমরা আমাদের মডেল প্রশিক্ষণের জন্য প্রস্তুত!\n",
+ "\n",
+ "Tidymodels-এ, আপনি `parsnip()` ব্যবহার করে তিনটি ধারণা নির্ধারণ করে মডেল তৈরি করেন:\n",
+ "\n",
+ "- মডেলের **ধরন** বিভিন্ন মডেল যেমন লিনিয়ার রিগ্রেশন, লজিস্টিক রিগ্রেশন, ডিসিশন ট্রি মডেল ইত্যাদি আলাদা করে।\n",
+ "\n",
+ "- মডেলের **মোড** সাধারণ বিকল্প যেমন রিগ্রেশন এবং ক্লাসিফিকেশন অন্তর্ভুক্ত করে; কিছু মডেল ধরন উভয় মোড সমর্থন করে, আবার কিছু শুধুমাত্র একটি মোড সমর্থন করে।\n",
+ "\n",
+ "- মডেলের **ইঞ্জিন** হলো সেই গণনামূলক টুল যা মডেল ফিট করার জন্য ব্যবহৃত হবে। প্রায়ই এগুলো R প্যাকেজ হয়, যেমন **`\"lm\"`** বা **`\"ranger\"`**\n",
+ "\n",
+ "এই মডেলিং তথ্য একটি মডেল স্পেসিফিকেশনে ধারণ করা হয়, তাই চলুন একটি তৈরি করি!\n"
+ ],
+ "metadata": {
+ "id": "sBOS-XhB-6v7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Build a linear model specification\r\n",
+ "lm_spec <- \r\n",
+ " # Type\r\n",
+ " linear_reg() %>% \r\n",
+ " # Engine\r\n",
+ " set_engine(\"lm\") %>% \r\n",
+ " # Mode\r\n",
+ " set_mode(\"regression\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Print the model specification\r\n",
+ "lm_spec"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "20OwEw20--t3"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "একটি মডেল *নির্ধারণ* করার পর, মডেলটি [`fit()`](https://parsnip.tidymodels.org/reference/fit.html) ফাংশন ব্যবহার করে `অনুমান` বা `প্রশিক্ষণ` করা যেতে পারে, সাধারণত একটি ফর্মুলা এবং কিছু ডেটা ব্যবহার করে।\n",
+ "\n",
+ "`y ~ .` এর অর্থ হলো আমরা `y`-কে পূর্বাভাসিত পরিমাণ/লক্ষ্য হিসেবে ফিট করব, যা সমস্ত পূর্বাভাসকারী/বৈশিষ্ট্য দ্বারা ব্যাখ্যাত হবে অর্থাৎ, `.` (এই ক্ষেত্রে, আমাদের কাছে শুধুমাত্র একটি পূর্বাভাসকারী আছে: `bmi`)\n"
+ ],
+ "metadata": {
+ "id": "_oDHs89k_CJj"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Build a linear model specification\r\n",
+ "lm_spec <- linear_reg() %>% \r\n",
+ " set_engine(\"lm\") %>%\r\n",
+ " set_mode(\"regression\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Train a linear regression model\r\n",
+ "lm_mod <- lm_spec %>% \r\n",
+ " fit(y ~ ., data = diabetes_train)\r\n",
+ "\r\n",
+ "# Print the model\r\n",
+ "lm_mod"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "YlsHqd-q_GJQ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "মডেলের আউটপুট থেকে আমরা প্রশিক্ষণের সময় শেখা কোয়েফিসিয়েন্টগুলো দেখতে পারি। এগুলো হলো সেরা ফিট লাইনের কোয়েফিসিয়েন্ট, যা আমাদের প্রকৃত এবং পূর্বাভাসিত ভেরিয়েবলের মধ্যে সামগ্রিক ত্রুটি সর্বনিম্ন করে।\n",
+ "\n",
+ " \n",
+ "\n",
+ "## ৫. টেস্ট সেটে পূর্বাভাস তৈরি করুন\n",
+ "\n",
+ "এখন যেহেতু আমরা একটি মডেল প্রশিক্ষণ করেছি, আমরা এটি ব্যবহার করে টেস্ট ডেটাসেটের জন্য রোগের অগ্রগতি y পূর্বাভাস করতে পারি [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) ব্যবহার করে। এটি ডেটা গ্রুপগুলোর মধ্যে লাইন আঁকার জন্য ব্যবহৃত হবে।\n"
+ ],
+ "metadata": {
+ "id": "kGZ22RQj_Olu"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make predictions for the test set\r\n",
+ "predictions <- lm_mod %>% \r\n",
+ " predict(new_data = diabetes_test)\r\n",
+ "\r\n",
+ "# Print out some of the predictions\r\n",
+ "predictions %>% \r\n",
+ " slice(1:5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "nXHbY7M2_aao"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ইয়াহু! 💃🕺 আমরা একটি মডেল প্রশিক্ষণ করেছি এবং এটি ব্যবহার করে পূর্বাভাস তৈরি করেছি!\n",
+ "\n",
+ "পূর্বাভাস তৈরি করার সময়, tidymodels এর নিয়ম হলো সবসময় একটি টিবল/ডেটা ফ্রেম তৈরি করা যেখানে ফলাফলের জন্য মানসম্মত কলামের নাম থাকে। এটি মূল ডেটা এবং পূর্বাভাসগুলোকে একত্রিত করে একটি ব্যবহারযোগ্য ফরম্যাটে পরবর্তী কাজের জন্য যেমন প্লটিং-এর জন্য সহজ করে তোলে।\n",
+ "\n",
+ "`dplyr::bind_cols()` দক্ষতার সাথে একাধিক ডেটা ফ্রেমের কলাম একত্রিত করে।\n"
+ ],
+ "metadata": {
+ "id": "R_JstwUY_bIs"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Combine the predictions and the original test set\r\n",
+ "results <- diabetes_test %>% \r\n",
+ " bind_cols(predictions)\r\n",
+ "\r\n",
+ "\r\n",
+ "results %>% \r\n",
+ " slice(1:5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "RybsMJR7_iI8"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## ৬. মডেলিং ফলাফল চিত্রায়িত করা\n",
+ "\n",
+ "এখন, এটি ভিজ্যুয়ালি দেখার সময় 📈। আমরা টেস্ট সেটের সমস্ত `y` এবং `bmi` মানের একটি স্ক্যাটার প্লট তৈরি করব, তারপর পূর্বাভাস ব্যবহার করে মডেলের ডেটা গ্রুপিংয়ের মধ্যে সবচেয়ে উপযুক্ত স্থানে একটি রেখা আঁকব।\n",
+ "\n",
+ "R-এ গ্রাফ তৈরির জন্য বেশ কয়েকটি সিস্টেম রয়েছে, তবে `ggplot2` সবচেয়ে সুন্দর এবং সবচেয়ে বহুমুখী। এটি আপনাকে **স্বতন্ত্র উপাদানগুলো একত্রিত করে** গ্রাফ তৈরি করতে দেয়।\n"
+ ],
+ "metadata": {
+ "id": "XJbYbMZW_n_s"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Set a theme for the plot\r\n",
+ "theme_set(theme_light())\r\n",
+ "# Create a scatter plot\r\n",
+ "results %>% \r\n",
+ " ggplot(aes(x = bmi)) +\r\n",
+ " # Add a scatter plot\r\n",
+ " geom_point(aes(y = y), size = 1.6) +\r\n",
+ " # Add a line plot\r\n",
+ " geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "R9tYp3VW_sTn"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "✅ এখানে কী ঘটছে তা একটু ভাবুন। একটি সরল রেখা অনেক ছোট ছোট ডেটা বিন্দুর মধ্য দিয়ে যাচ্ছে, কিন্তু এটি ঠিক কী করছে? আপনি কি দেখতে পাচ্ছেন যে এই রেখাটি ব্যবহার করে কীভাবে একটি নতুন, অদেখা ডেটা পয়েন্টের অবস্থান প্লটের y অক্ষের সাথে সম্পর্কিতভাবে পূর্বাভাস করা উচিত? এই মডেলের ব্যবহারিক দিকটি শব্দে প্রকাশ করার চেষ্টা করুন।\n",
+ "\n",
+ "অভিনন্দন, আপনি আপনার প্রথম লিনিয়ার রিগ্রেশন মডেল তৈরি করেছেন, এর মাধ্যমে একটি পূর্বাভাস তৈরি করেছেন এবং এটি একটি প্লটে প্রদর্শন করেছেন!\n"
+ ],
+ "metadata": {
+ "id": "zrPtHIxx_tNI"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/1-Tools/solution/notebook.ipynb b/translations/bn/2-Regression/1-Tools/solution/notebook.ipynb
new file mode 100644
index 000000000..f3336fa55
--- /dev/null
+++ b/translations/bn/2-Regression/1-Tools/solution/notebook.ipynb
@@ -0,0 +1,677 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## ডায়াবেটিস ডেটাসেটের জন্য লিনিয়ার রিগ্রেশন - পাঠ ১\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "প্রয়োজনীয় লাইব্রেরি আমদানি করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from sklearn import datasets, linear_model, model_selection\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "ডায়াবেটিস ডেটাসেট লোড করুন, `X` ডেটা এবং `y` বৈশিষ্ট্যে বিভক্ত।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(442, 10)\n",
+ "[ 0.03807591 0.05068012 0.06169621 0.02187239 -0.0442235 -0.03482076\n",
+ " -0.04340085 -0.00259226 0.01990749 -0.01764613]\n"
+ ]
+ }
+ ],
+ "source": [
+ "X, y = datasets.load_diabetes(return_X_y=True)\n",
+ "print(X.shape)\n",
+ "print(X[0])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "এই অনুশীলনের জন্য শুধুমাত্র একটি বৈশিষ্ট্য লক্ষ্য করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(442,)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Selecting the 3rd feature\n",
+ "X = X[:, 2]\n",
+ "print(X.shape)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(442, 1)\n",
+ "[[ 0.06169621]\n",
+ " [-0.05147406]\n",
+ " [ 0.04445121]\n",
+ " [-0.01159501]\n",
+ " [-0.03638469]\n",
+ " [-0.04069594]\n",
+ " [-0.04716281]\n",
+ " [-0.00189471]\n",
+ " [ 0.06169621]\n",
+ " [ 0.03906215]\n",
+ " [-0.08380842]\n",
+ " [ 0.01750591]\n",
+ " [-0.02884001]\n",
+ " [-0.00189471]\n",
+ " [-0.02560657]\n",
+ " [-0.01806189]\n",
+ " [ 0.04229559]\n",
+ " [ 0.01211685]\n",
+ " [-0.0105172 ]\n",
+ " [-0.01806189]\n",
+ " [-0.05686312]\n",
+ " [-0.02237314]\n",
+ " [-0.00405033]\n",
+ " [ 0.06061839]\n",
+ " [ 0.03582872]\n",
+ " [-0.01267283]\n",
+ " [-0.07734155]\n",
+ " [ 0.05954058]\n",
+ " [-0.02129532]\n",
+ " [-0.00620595]\n",
+ " [ 0.04445121]\n",
+ " [-0.06548562]\n",
+ " [ 0.12528712]\n",
+ " [-0.05039625]\n",
+ " [-0.06332999]\n",
+ " [-0.03099563]\n",
+ " [ 0.02289497]\n",
+ " [ 0.01103904]\n",
+ " [ 0.07139652]\n",
+ " [ 0.01427248]\n",
+ " [-0.00836158]\n",
+ " [-0.06764124]\n",
+ " [-0.0105172 ]\n",
+ " [-0.02345095]\n",
+ " [ 0.06816308]\n",
+ " [-0.03530688]\n",
+ " [-0.01159501]\n",
+ " [-0.0730303 ]\n",
+ " [-0.04177375]\n",
+ " [ 0.01427248]\n",
+ " [-0.00728377]\n",
+ " [ 0.0164281 ]\n",
+ " [-0.00943939]\n",
+ " [-0.01590626]\n",
+ " [ 0.0250506 ]\n",
+ " [-0.04931844]\n",
+ " [ 0.04121778]\n",
+ " [-0.06332999]\n",
+ " [-0.06440781]\n",
+ " [-0.02560657]\n",
+ " [-0.00405033]\n",
+ " [ 0.00457217]\n",
+ " [-0.00728377]\n",
+ " [-0.0374625 ]\n",
+ " [-0.02560657]\n",
+ " [-0.02452876]\n",
+ " [-0.01806189]\n",
+ " [-0.01482845]\n",
+ " [-0.02991782]\n",
+ " [-0.046085 ]\n",
+ " [-0.06979687]\n",
+ " [ 0.03367309]\n",
+ " [-0.00405033]\n",
+ " [-0.02021751]\n",
+ " [ 0.00241654]\n",
+ " [-0.03099563]\n",
+ " [ 0.02828403]\n",
+ " [-0.03638469]\n",
+ " [-0.05794093]\n",
+ " [-0.0374625 ]\n",
+ " [ 0.01211685]\n",
+ " [-0.02237314]\n",
+ " [-0.03530688]\n",
+ " [ 0.00996123]\n",
+ " [-0.03961813]\n",
+ " [ 0.07139652]\n",
+ " [-0.07518593]\n",
+ " [-0.00620595]\n",
+ " [-0.04069594]\n",
+ " [-0.04824063]\n",
+ " [-0.02560657]\n",
+ " [ 0.0519959 ]\n",
+ " [ 0.00457217]\n",
+ " [-0.06440781]\n",
+ " [-0.01698407]\n",
+ " [-0.05794093]\n",
+ " [ 0.00996123]\n",
+ " [ 0.08864151]\n",
+ " [-0.00512814]\n",
+ " [-0.06440781]\n",
+ " [ 0.01750591]\n",
+ " [-0.04500719]\n",
+ " [ 0.02828403]\n",
+ " [ 0.04121778]\n",
+ " [ 0.06492964]\n",
+ " [-0.03207344]\n",
+ " [-0.07626374]\n",
+ " [ 0.04984027]\n",
+ " [ 0.04552903]\n",
+ " [-0.00943939]\n",
+ " [-0.03207344]\n",
+ " [ 0.00457217]\n",
+ " [ 0.02073935]\n",
+ " [ 0.01427248]\n",
+ " [ 0.11019775]\n",
+ " [ 0.00133873]\n",
+ " [ 0.05846277]\n",
+ " [-0.02129532]\n",
+ " [-0.0105172 ]\n",
+ " [-0.04716281]\n",
+ " [ 0.00457217]\n",
+ " [ 0.01750591]\n",
+ " [ 0.08109682]\n",
+ " [ 0.0347509 ]\n",
+ " [ 0.02397278]\n",
+ " [-0.00836158]\n",
+ " [-0.06117437]\n",
+ " [-0.00189471]\n",
+ " [-0.06225218]\n",
+ " [ 0.0164281 ]\n",
+ " [ 0.09618619]\n",
+ " [-0.06979687]\n",
+ " [-0.02129532]\n",
+ " [-0.05362969]\n",
+ " [ 0.0433734 ]\n",
+ " [ 0.05630715]\n",
+ " [-0.0816528 ]\n",
+ " [ 0.04984027]\n",
+ " [ 0.11127556]\n",
+ " [ 0.06169621]\n",
+ " [ 0.01427248]\n",
+ " [ 0.04768465]\n",
+ " [ 0.01211685]\n",
+ " [ 0.00564998]\n",
+ " [ 0.04660684]\n",
+ " [ 0.12852056]\n",
+ " [ 0.05954058]\n",
+ " [ 0.09295276]\n",
+ " [ 0.01535029]\n",
+ " [-0.00512814]\n",
+ " [ 0.0703187 ]\n",
+ " [-0.00405033]\n",
+ " [-0.00081689]\n",
+ " [-0.04392938]\n",
+ " [ 0.02073935]\n",
+ " [ 0.06061839]\n",
+ " [-0.0105172 ]\n",
+ " [-0.03315126]\n",
+ " [-0.06548562]\n",
+ " [ 0.0433734 ]\n",
+ " [-0.06225218]\n",
+ " [ 0.06385183]\n",
+ " [ 0.03043966]\n",
+ " [ 0.07247433]\n",
+ " [-0.0191397 ]\n",
+ " [-0.06656343]\n",
+ " [-0.06009656]\n",
+ " [ 0.06924089]\n",
+ " [ 0.05954058]\n",
+ " [-0.02668438]\n",
+ " [-0.02021751]\n",
+ " [-0.046085 ]\n",
+ " [ 0.07139652]\n",
+ " [-0.07949718]\n",
+ " [ 0.00996123]\n",
+ " [-0.03854032]\n",
+ " [ 0.01966154]\n",
+ " [ 0.02720622]\n",
+ " [-0.00836158]\n",
+ " [-0.01590626]\n",
+ " [ 0.00457217]\n",
+ " [-0.04285156]\n",
+ " [ 0.00564998]\n",
+ " [-0.03530688]\n",
+ " [ 0.02397278]\n",
+ " [-0.01806189]\n",
+ " [ 0.04229559]\n",
+ " [-0.0547075 ]\n",
+ " [-0.00297252]\n",
+ " [-0.06656343]\n",
+ " [-0.01267283]\n",
+ " [-0.04177375]\n",
+ " [-0.03099563]\n",
+ " [-0.00512814]\n",
+ " [-0.05901875]\n",
+ " [ 0.0250506 ]\n",
+ " [-0.046085 ]\n",
+ " [ 0.00349435]\n",
+ " [ 0.05415152]\n",
+ " [-0.04500719]\n",
+ " [-0.05794093]\n",
+ " [-0.05578531]\n",
+ " [ 0.00133873]\n",
+ " [ 0.03043966]\n",
+ " [ 0.00672779]\n",
+ " [ 0.04660684]\n",
+ " [ 0.02612841]\n",
+ " [ 0.04552903]\n",
+ " [ 0.04013997]\n",
+ " [-0.01806189]\n",
+ " [ 0.01427248]\n",
+ " [ 0.03690653]\n",
+ " [ 0.00349435]\n",
+ " [-0.07087468]\n",
+ " [-0.03315126]\n",
+ " [ 0.09403057]\n",
+ " [ 0.03582872]\n",
+ " [ 0.03151747]\n",
+ " [-0.06548562]\n",
+ " [-0.04177375]\n",
+ " [-0.03961813]\n",
+ " [-0.03854032]\n",
+ " [-0.02560657]\n",
+ " [-0.02345095]\n",
+ " [-0.06656343]\n",
+ " [ 0.03259528]\n",
+ " [-0.046085 ]\n",
+ " [-0.02991782]\n",
+ " [-0.01267283]\n",
+ " [-0.01590626]\n",
+ " [ 0.07139652]\n",
+ " [-0.03099563]\n",
+ " [ 0.00026092]\n",
+ " [ 0.03690653]\n",
+ " [ 0.03906215]\n",
+ " [-0.01482845]\n",
+ " [ 0.00672779]\n",
+ " [-0.06871905]\n",
+ " [-0.00943939]\n",
+ " [ 0.01966154]\n",
+ " [ 0.07462995]\n",
+ " [-0.00836158]\n",
+ " [-0.02345095]\n",
+ " [-0.046085 ]\n",
+ " [ 0.05415152]\n",
+ " [-0.03530688]\n",
+ " [-0.03207344]\n",
+ " [-0.0816528 ]\n",
+ " [ 0.04768465]\n",
+ " [ 0.06061839]\n",
+ " [ 0.05630715]\n",
+ " [ 0.09834182]\n",
+ " [ 0.05954058]\n",
+ " [ 0.03367309]\n",
+ " [ 0.05630715]\n",
+ " [-0.06548562]\n",
+ " [ 0.16085492]\n",
+ " [-0.05578531]\n",
+ " [-0.02452876]\n",
+ " [-0.03638469]\n",
+ " [-0.00836158]\n",
+ " [-0.04177375]\n",
+ " [ 0.12744274]\n",
+ " [-0.07734155]\n",
+ " [ 0.02828403]\n",
+ " [-0.02560657]\n",
+ " [-0.06225218]\n",
+ " [-0.00081689]\n",
+ " [ 0.08864151]\n",
+ " [-0.03207344]\n",
+ " [ 0.03043966]\n",
+ " [ 0.00888341]\n",
+ " [ 0.00672779]\n",
+ " [-0.02021751]\n",
+ " [-0.02452876]\n",
+ " [-0.01159501]\n",
+ " [ 0.02612841]\n",
+ " [-0.05901875]\n",
+ " [-0.03638469]\n",
+ " [-0.02452876]\n",
+ " [ 0.01858372]\n",
+ " [-0.0902753 ]\n",
+ " [-0.00512814]\n",
+ " [-0.05255187]\n",
+ " [-0.02237314]\n",
+ " [-0.02021751]\n",
+ " [-0.0547075 ]\n",
+ " [-0.00620595]\n",
+ " [-0.01698407]\n",
+ " [ 0.05522933]\n",
+ " [ 0.07678558]\n",
+ " [ 0.01858372]\n",
+ " [-0.02237314]\n",
+ " [ 0.09295276]\n",
+ " [-0.03099563]\n",
+ " [ 0.03906215]\n",
+ " [-0.06117437]\n",
+ " [-0.00836158]\n",
+ " [-0.0374625 ]\n",
+ " [-0.01375064]\n",
+ " [ 0.07355214]\n",
+ " [-0.02452876]\n",
+ " [ 0.03367309]\n",
+ " [ 0.0347509 ]\n",
+ " [-0.03854032]\n",
+ " [-0.03961813]\n",
+ " [-0.00189471]\n",
+ " [-0.03099563]\n",
+ " [-0.046085 ]\n",
+ " [ 0.00133873]\n",
+ " [ 0.06492964]\n",
+ " [ 0.04013997]\n",
+ " [-0.02345095]\n",
+ " [ 0.05307371]\n",
+ " [ 0.04013997]\n",
+ " [-0.02021751]\n",
+ " [ 0.01427248]\n",
+ " [-0.03422907]\n",
+ " [ 0.00672779]\n",
+ " [ 0.00457217]\n",
+ " [ 0.03043966]\n",
+ " [ 0.0519959 ]\n",
+ " [ 0.06169621]\n",
+ " [-0.00728377]\n",
+ " [ 0.00564998]\n",
+ " [ 0.05415152]\n",
+ " [-0.00836158]\n",
+ " [ 0.114509 ]\n",
+ " [ 0.06708527]\n",
+ " [-0.05578531]\n",
+ " [ 0.03043966]\n",
+ " [-0.02560657]\n",
+ " [ 0.10480869]\n",
+ " [-0.00620595]\n",
+ " [-0.04716281]\n",
+ " [-0.04824063]\n",
+ " [ 0.08540807]\n",
+ " [-0.01267283]\n",
+ " [-0.03315126]\n",
+ " [-0.00728377]\n",
+ " [-0.01375064]\n",
+ " [ 0.05954058]\n",
+ " [ 0.02181716]\n",
+ " [ 0.01858372]\n",
+ " [-0.01159501]\n",
+ " [-0.00297252]\n",
+ " [ 0.01750591]\n",
+ " [-0.02991782]\n",
+ " [-0.02021751]\n",
+ " [-0.05794093]\n",
+ " [ 0.06061839]\n",
+ " [-0.04069594]\n",
+ " [-0.07195249]\n",
+ " [-0.05578531]\n",
+ " [ 0.04552903]\n",
+ " [-0.00943939]\n",
+ " [-0.03315126]\n",
+ " [ 0.04984027]\n",
+ " [-0.08488624]\n",
+ " [ 0.00564998]\n",
+ " [ 0.02073935]\n",
+ " [-0.00728377]\n",
+ " [ 0.10480869]\n",
+ " [-0.02452876]\n",
+ " [-0.00620595]\n",
+ " [-0.03854032]\n",
+ " [ 0.13714305]\n",
+ " [ 0.17055523]\n",
+ " [ 0.00241654]\n",
+ " [ 0.03798434]\n",
+ " [-0.05794093]\n",
+ " [-0.00943939]\n",
+ " [-0.02345095]\n",
+ " [-0.0105172 ]\n",
+ " [-0.03422907]\n",
+ " [-0.00297252]\n",
+ " [ 0.06816308]\n",
+ " [ 0.00996123]\n",
+ " [ 0.00241654]\n",
+ " [-0.03854032]\n",
+ " [ 0.02612841]\n",
+ " [-0.08919748]\n",
+ " [ 0.06061839]\n",
+ " [-0.02884001]\n",
+ " [-0.02991782]\n",
+ " [-0.0191397 ]\n",
+ " [-0.04069594]\n",
+ " [ 0.01535029]\n",
+ " [-0.02452876]\n",
+ " [ 0.00133873]\n",
+ " [ 0.06924089]\n",
+ " [-0.06979687]\n",
+ " [-0.02991782]\n",
+ " [-0.046085 ]\n",
+ " [ 0.01858372]\n",
+ " [ 0.00133873]\n",
+ " [-0.03099563]\n",
+ " [-0.00405033]\n",
+ " [ 0.01535029]\n",
+ " [ 0.02289497]\n",
+ " [ 0.04552903]\n",
+ " [-0.04500719]\n",
+ " [-0.03315126]\n",
+ " [ 0.097264 ]\n",
+ " [ 0.05415152]\n",
+ " [ 0.12313149]\n",
+ " [-0.08057499]\n",
+ " [ 0.09295276]\n",
+ " [-0.05039625]\n",
+ " [-0.01159501]\n",
+ " [-0.0277622 ]\n",
+ " [ 0.05846277]\n",
+ " [ 0.08540807]\n",
+ " [-0.00081689]\n",
+ " [ 0.00672779]\n",
+ " [ 0.00888341]\n",
+ " [ 0.08001901]\n",
+ " [ 0.07139652]\n",
+ " [-0.02452876]\n",
+ " [-0.0547075 ]\n",
+ " [-0.03638469]\n",
+ " [ 0.0164281 ]\n",
+ " [ 0.07786339]\n",
+ " [-0.03961813]\n",
+ " [ 0.01103904]\n",
+ " [-0.04069594]\n",
+ " [-0.03422907]\n",
+ " [ 0.00564998]\n",
+ " [ 0.08864151]\n",
+ " [-0.03315126]\n",
+ " [-0.05686312]\n",
+ " [-0.03099563]\n",
+ " [ 0.05522933]\n",
+ " [-0.06009656]\n",
+ " [ 0.00133873]\n",
+ " [-0.02345095]\n",
+ " [-0.07410811]\n",
+ " [ 0.01966154]\n",
+ " [-0.01590626]\n",
+ " [-0.01590626]\n",
+ " [ 0.03906215]\n",
+ " [-0.0730303 ]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Reshaping to get a 2D array\n",
+ "X = X.reshape(-1, 1)\n",
+ "print(X.shape)\n",
+ "print(X)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "X এবং y এর জন্য প্রশিক্ষণ এবং পরীক্ষার ডেটা ভাগ করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "প্রতিটি মডেল নির্বাচন করুন এবং এটি প্রশিক্ষণ ডেটার সাথে ফিট করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.scatter(X_test, y_test, color='black')\n",
+ "plt.plot(X_test, y_pred, color='blue', linewidth=3)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.1"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "16ff1a974f6e4348e869e4a7d366b86a",
+ "translation_date": "2025-08-29T23:05:43+00:00",
+ "source_file": "2-Regression/1-Tools/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/2-Data/README.md b/translations/bn/2-Regression/2-Data/README.md
new file mode 100644
index 000000000..78e9521c7
--- /dev/null
+++ b/translations/bn/2-Regression/2-Data/README.md
@@ -0,0 +1,226 @@
+
+# স্কিকিট-লার্ন ব্যবহার করে একটি রিগ্রেশন মডেল তৈরি করা: ডেটা প্রস্তুত এবং ভিজুয়ালাইজেশন
+
+
+
+ইনফোগ্রাফিক: [দাসানি মাদিপল্লি](https://twitter.com/dasani_decoded)
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/11/)
+
+> ### [এই পাঠটি R-এও উপলব্ধ!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
+
+## ভূমিকা
+
+আপনি যখন স্কিকিট-লার্ন ব্যবহার করে মেশিন লার্নিং মডেল তৈরি করতে প্রস্তুত, তখন আপনার ডেটা থেকে সঠিক প্রশ্ন জিজ্ঞাসা করাটা অত্যন্ত গুরুত্বপূর্ণ। ডেটার সাথে কাজ করার সময় এবং মেশিন লার্নিং সমাধান প্রয়োগ করার সময়, সঠিক প্রশ্ন জিজ্ঞাসা করা অত্যন্ত গুরুত্বপূর্ণ যাতে ডেটার সম্ভাবনাগুলি সঠিকভাবে উন্মোচিত হয়।
+
+এই পাঠে আপনি শিখবেন:
+
+- কীভাবে মডেল তৈরির জন্য আপনার ডেটা প্রস্তুত করবেন।
+- কীভাবে ম্যাটপ্লটলিব ব্যবহার করে ডেটা ভিজুয়ালাইজ করবেন।
+
+## আপনার ডেটা থেকে সঠিক প্রশ্ন জিজ্ঞাসা করা
+
+আপনার যে প্রশ্নের উত্তর প্রয়োজন তা নির্ধারণ করবে আপনি কোন ধরনের মেশিন লার্নিং অ্যালগরিদম ব্যবহার করবেন। এবং আপনি যে উত্তরটি পাবেন তার গুণমান অনেকাংশে আপনার ডেটার প্রকৃতির উপর নির্ভর করবে।
+
+এই পাঠের জন্য সরবরাহিত [ডেটা](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) দেখুন। আপনি এই .csv ফাইলটি VS Code-এ খুলতে পারেন। দ্রুত স্ক্যান করলে দেখা যায় যে এতে ফাঁকা জায়গা এবং স্ট্রিং ও সংখ্যার মিশ্রণ রয়েছে। এছাড়াও একটি অদ্ভুত কলাম রয়েছে যার নাম 'Package', যেখানে ডেটা 'sacks', 'bins' এবং অন্যান্য মানের মিশ্রণ। ডেটাটি আসলে কিছুটা বিশৃঙ্খল।
+
+[](https://youtu.be/5qGjczWTrDQ "শিক্ষার্থীদের জন্য মেশিন লার্নিং - কীভাবে একটি ডেটাসেট বিশ্লেষণ এবং পরিষ্কার করবেন")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন এই পাঠের জন্য ডেটা প্রস্তুত করার একটি সংক্ষিপ্ত ভিডিও দেখার জন্য।
+
+আসলে, এমন একটি ডেটাসেট পাওয়া খুবই বিরল যা সম্পূর্ণ প্রস্তুত এবং সরাসরি একটি মেশিন লার্নিং মডেল তৈরির জন্য ব্যবহার করা যায়। এই পাঠে, আপনি শিখবেন কীভাবে স্ট্যান্ডার্ড পাইথন লাইব্রেরি ব্যবহার করে একটি কাঁচা ডেটাসেট প্রস্তুত করবেন। এছাড়াও, আপনি ডেটা ভিজুয়ালাইজ করার বিভিন্ন কৌশল শিখবেন।
+
+## কেস স্টাডি: 'কুমড়ার বাজার'
+
+এই ফোল্ডারে, মূল `data` ফোল্ডারে [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) নামে একটি .csv ফাইল রয়েছে, যেখানে ১৭৫৭টি লাইন ডেটা রয়েছে যা শহর অনুযায়ী গোষ্ঠীবদ্ধ কুমড়ার বাজার সম্পর্কিত। এটি কাঁচা ডেটা যা [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) থেকে সংগ্রহ করা হয়েছে, যা মার্কিন যুক্তরাষ্ট্রের কৃষি বিভাগের দ্বারা বিতরণ করা হয়।
+
+### ডেটা প্রস্তুত করা
+
+এই ডেটা পাবলিক ডোমেইনে রয়েছে। এটি USDA ওয়েবসাইট থেকে বিভিন্ন শহরের জন্য আলাদা আলাদা ফাইল হিসেবে ডাউনলোড করা যায়। অনেক আলাদা ফাইল এড়াতে, আমরা সমস্ত শহরের ডেটা একত্রিত করে একটি স্প্রেডশিটে রেখেছি। সুতরাং, আমরা ইতিমধ্যে ডেটা কিছুটা _প্রস্তুত_ করেছি। এখন, আসুন ডেটাটি আরও কাছ থেকে দেখি।
+
+### কুমড়ার ডেটা - প্রাথমিক পর্যবেক্ষণ
+
+এই ডেটা সম্পর্কে আপনি কী লক্ষ্য করেন? আপনি ইতিমধ্যে দেখেছেন যে এখানে স্ট্রিং, সংখ্যা, ফাঁকা জায়গা এবং অদ্ভুত মানের মিশ্রণ রয়েছে যা আপনাকে বুঝতে হবে।
+
+রিগ্রেশন পদ্ধতি ব্যবহার করে আপনি এই ডেটা থেকে কী প্রশ্ন করতে পারেন? যেমন, "একটি নির্দিষ্ট মাসে বিক্রয়ের জন্য একটি কুমড়ার দাম পূর্বানুমান করুন।" ডেটার দিকে আবার তাকালে, আপনি লক্ষ্য করবেন যে এই কাজের জন্য প্রয়োজনীয় ডেটা কাঠামো তৈরি করতে কিছু পরিবর্তন করতে হবে।
+
+## অনুশীলন - কুমড়ার ডেটা বিশ্লেষণ করুন
+
+[পান্ডাস](https://pandas.pydata.org/) ব্যবহার করুন, যা ডেটা আকারে রূপান্তর করার জন্য একটি খুব কার্যকর টুল, কুমড়ার এই ডেটা বিশ্লেষণ এবং প্রস্তুত করতে।
+
+### প্রথমে, অনুপস্থিত তারিখগুলি পরীক্ষা করুন
+
+আপনাকে প্রথমে অনুপস্থিত তারিখগুলি পরীক্ষা করার জন্য কিছু পদক্ষেপ নিতে হবে:
+
+1. তারিখগুলিকে মাসের ফরম্যাটে রূপান্তর করুন (এগুলি মার্কিন তারিখ, তাই ফরম্যাটটি `MM/DD/YYYY`)।
+2. একটি নতুন কলামে মাসটি বের করুন।
+
+_নোটবুক.ipynb_ ফাইলটি Visual Studio Code-এ খুলুন এবং স্প্রেডশিটটি একটি নতুন Pandas ডেটাফ্রেমে আমদানি করুন।
+
+1. প্রথম পাঁচটি সারি দেখতে `head()` ফাংশনটি ব্যবহার করুন।
+
+ ```python
+ import pandas as pd
+ pumpkins = pd.read_csv('../data/US-pumpkins.csv')
+ pumpkins.head()
+ ```
+
+ ✅ শেষ পাঁচটি সারি দেখতে আপনি কোন ফাংশনটি ব্যবহার করবেন?
+
+1. বর্তমান ডেটাফ্রেমে অনুপস্থিত ডেটা আছে কিনা তা পরীক্ষা করুন:
+
+ ```python
+ pumpkins.isnull().sum()
+ ```
+
+ অনুপস্থিত ডেটা রয়েছে, তবে এটি হয়তো এই কাজের জন্য গুরুত্বপূর্ণ নাও হতে পারে।
+
+1. আপনার ডেটাফ্রেমটি আরও সহজে কাজ করার জন্য, কেবল প্রয়োজনীয় কলামগুলি নির্বাচন করুন, `loc` ফাংশন ব্যবহার করে যা মূল ডেটাফ্রেম থেকে একটি নির্দিষ্ট সারি এবং কলাম গোষ্ঠী বের করে। নিচের ক্ষেত্রে `:` এর অর্থ "সব সারি।"
+
+ ```python
+ columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
+ pumpkins = pumpkins.loc[:, columns_to_select]
+ ```
+
+### দ্বিতীয়ত, কুমড়ার গড় দাম নির্ধারণ করুন
+
+একটি নির্দিষ্ট মাসে কুমড়ার গড় দাম নির্ধারণ করার জন্য কীভাবে এগোবেন? এই কাজের জন্য আপনি কোন কলামগুলি বাছাই করবেন? ইঙ্গিত: আপনাকে ৩টি কলাম প্রয়োজন হবে।
+
+সমাধান: `Low Price` এবং `High Price` কলামের গড় বের করে নতুন Price কলামটি পূরণ করুন এবং Date কলামটি কেবল মাস দেখানোর জন্য রূপান্তর করুন। সৌভাগ্যক্রমে, উপরের পরীক্ষার মতে, তারিখ বা দামের জন্য কোনো অনুপস্থিত ডেটা নেই।
+
+1. গড় বের করতে, নিচের কোডটি যোগ করুন:
+
+ ```python
+ price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
+
+ month = pd.DatetimeIndex(pumpkins['Date']).month
+
+ ```
+
+ ✅ আপনি `print(month)` ব্যবহার করে যেকোনো ডেটা পরীক্ষা করতে পারেন।
+
+2. এখন, আপনার রূপান্তরিত ডেটা একটি নতুন Pandas ডেটাফ্রেমে কপি করুন:
+
+ ```python
+ new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
+ ```
+
+ আপনার ডেটাফ্রেমটি প্রিন্ট করলে একটি পরিষ্কার, সুশৃঙ্খল ডেটাসেট দেখতে পাবেন, যার উপর ভিত্তি করে আপনি একটি নতুন রিগ্রেশন মডেল তৈরি করতে পারবেন।
+
+### কিন্তু অপেক্ষা করুন! এখানে কিছু অদ্ভুত আছে
+
+যদি আপনি `Package` কলামটি দেখেন, কুমড়াগুলি বিভিন্ন কনফিগারেশনে বিক্রি হয়। কিছু '1 1/9 bushel' পরিমাপে বিক্রি হয়, কিছু '1/2 bushel' পরিমাপে, কিছু প্রতি কুমড়া, কিছু প্রতি পাউন্ড, এবং কিছু বড় বাক্সে বিভিন্ন প্রস্থে।
+
+> কুমড়াগুলি সঠিকভাবে ওজন করা খুবই কঠিন বলে মনে হয়
+
+মূল ডেটা বিশ্লেষণ করে দেখা যায় যে `Unit of Sale` যদি 'EACH' বা 'PER BIN' হয়, তবে `Package` টাইপটি প্রতি ইঞ্চি, প্রতি বিন, বা 'each'। কুমড়াগুলি সঠিকভাবে ওজন করা খুবই কঠিন বলে মনে হয়, তাই আসুন কেবল `Package` কলামে 'bushel' শব্দটি থাকা কুমড়াগুলিকে বাছাই করি।
+
+1. ফাইলের শুরুতে, প্রাথমিক .csv আমদানির নিচে একটি ফিল্টার যোগ করুন:
+
+ ```python
+ pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
+ ```
+
+ এখন ডেটা প্রিন্ট করলে, আপনি দেখতে পাবেন যে কেবল প্রায় ৪১৫টি সারি রয়েছে যেখানে কুমড়াগুলি bushel-এ বিক্রি হয়।
+
+### কিন্তু অপেক্ষা করুন! আরও একটি কাজ বাকি আছে
+
+আপনি কি লক্ষ্য করেছেন যে bushel-এর পরিমাণ প্রতি সারিতে ভিন্ন? আপনাকে দামটি bushel প্রতি দেখানোর জন্য স্বাভাবিক করতে হবে, তাই এটি মানক করার জন্য কিছু গণনা করুন।
+
+1. নতুন_pumpkins ডেটাফ্রেম তৈরি করার ব্লকের পরে এই লাইনগুলি যোগ করুন:
+
+ ```python
+ new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
+
+ new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
+ ```
+
+✅ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) অনুসারে, bushel-এর ওজন উৎপাদনের ধরন অনুযায়ী পরিবর্তিত হয়, কারণ এটি একটি ভলিউম পরিমাপ। "উদাহরণস্বরূপ, টমেটোর একটি bushel-এর ওজন ৫৬ পাউন্ড হওয়া উচিত... পাতাগুলি এবং শাকসবজি বেশি জায়গা নেয় কিন্তু কম ওজন হয়, তাই পালং শাকের একটি bushel কেবল ২০ পাউন্ড।" এটি বেশ জটিল! আসুন bushel-থেকে-পাউন্ড রূপান্তর নিয়ে মাথা ঘামাই না এবং bushel অনুযায়ী দাম নির্ধারণ করি। তবে এই bushel-এ কুমড়ার গবেষণা দেখায় যে আপনার ডেটার প্রকৃতি বোঝা কতটা গুরুত্বপূর্ণ!
+
+এখন, আপনি bushel পরিমাপের ভিত্তিতে ইউনিট প্রতি দাম বিশ্লেষণ করতে পারেন। ডেটা একবার প্রিন্ট করলে, আপনি দেখতে পাবেন এটি কীভাবে মানক করা হয়েছে।
+
+✅ আপনি কি লক্ষ্য করেছেন যে অর্ধ-bushel-এ বিক্রি হওয়া কুমড়াগুলি খুবই ব্যয়বহুল? আপনি কি এর কারণ বের করতে পারেন? ইঙ্গিত: ছোট কুমড়াগুলি বড়গুলোর তুলনায় অনেক বেশি দামী, সম্ভবত কারণ bushel-এ অনেক বেশি ছোট কুমড়া থাকে, বড় ফাঁপা পাই কুমড়ার কারণে ব্যবহৃত জায়গা কম থাকে।
+
+## ভিজুয়ালাইজেশন কৌশল
+
+ডেটা বিজ্ঞানীর কাজের একটি অংশ হল তারা যে ডেটা নিয়ে কাজ করছেন তার গুণমান এবং প্রকৃতি প্রদর্শন করা। এটি করতে, তারা প্রায়ই আকর্ষণীয় ভিজুয়ালাইজেশন তৈরি করেন, যেমন প্লট, গ্রাফ এবং চার্ট, যা ডেটার বিভিন্ন দিক দেখায়। এইভাবে, তারা এমন সম্পর্ক এবং ফাঁকগুলি চাক্ষুষভাবে প্রদর্শন করতে সক্ষম হন যা অন্যথায় খুঁজে পাওয়া কঠিন।
+
+[](https://youtu.be/SbUkxH6IJo0 "শিক্ষার্থীদের জন্য মেশিন লার্নিং - কীভাবে ম্যাটপ্লটলিব দিয়ে ডেটা ভিজুয়ালাইজ করবেন")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন এই পাঠের জন্য ডেটা ভিজুয়ালাইজ করার একটি সংক্ষিপ্ত ভিডিও দেখার জন্য।
+
+ভিজুয়ালাইজেশনগুলি মেশিন লার্নিং কৌশল নির্ধারণ করতেও সহায়তা করতে পারে। উদাহরণস্বরূপ, একটি স্ক্যাটারপ্লট যা একটি রেখার মতো মনে হয়, তা নির্দেশ করে যে ডেটা একটি লিনিয়ার রিগ্রেশন অনুশীলনের জন্য উপযুক্ত।
+
+একটি ডেটা ভিজুয়ালাইজেশন লাইব্রেরি যা জুপিটার নোটবুকে ভাল কাজ করে তা হল [ম্যাটপ্লটলিব](https://matplotlib.org/) (যা আপনি আগের পাঠেও দেখেছেন)।
+
+> ডেটা ভিজুয়ালাইজেশনের আরও অভিজ্ঞতা পেতে [এই টিউটোরিয়ালগুলি](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott) দেখুন।
+
+## অনুশীলন - ম্যাটপ্লটলিব নিয়ে পরীক্ষা করুন
+
+আপনি যে নতুন ডেটাফ্রেমটি তৈরি করেছেন তা প্রদর্শনের জন্য কিছু মৌলিক প্লট তৈরি করার চেষ্টা করুন। একটি মৌলিক লাইন প্লট কী দেখাবে?
+
+1. ফাইলের শুরুতে, Pandas আমদানির নিচে ম্যাটপ্লটলিব আমদানি করুন:
+
+ ```python
+ import matplotlib.pyplot as plt
+ ```
+
+1. পুরো নোটবুকটি পুনরায় চালান।
+1. নোটবুকের নিচে একটি সেল যোগ করুন এবং ডেটা একটি বক্স প্লট হিসাবে প্রদর্শন করুন:
+
+ ```python
+ price = new_pumpkins.Price
+ month = new_pumpkins.Month
+ plt.scatter(price, month)
+ plt.show()
+ ```
+
+ 
+
+ এটি কি একটি কার্যকর প্লট? এটি কি আপনাকে অবাক করে?
+
+ এটি বিশেষভাবে কার্যকর নয় কারণ এটি কেবল একটি নির্দিষ্ট মাসে আপনার ডেটাকে পয়েন্টের একটি বিস্তৃতি হিসাবে প্রদর্শন করে।
+
+### এটি কার্যকর করুন
+
+ডেটা প্রদর্শনের জন্য চার্টগুলি কার্যকর করতে, সাধারণত আপনাকে ডেটা কোনোভাবে গোষ্ঠীবদ্ধ করতে হয়। আসুন একটি প্লট তৈরি করার চেষ্টা করি যেখানে y অক্ষ মাসগুলি দেখায় এবং ডেটা ডেটার বিতরণ প্রদর্শন করে।
+
+1. একটি সেল যোগ করুন এবং একটি গোষ্ঠীবদ্ধ বার চার্ট তৈরি করুন:
+
+ ```python
+ new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
+ plt.ylabel("Pumpkin Price")
+ ```
+
+ 
+
+ এটি একটি আরও কার্যকর ডেটা ভিজুয়ালাইজেশন! এটি মনে হয় যে কুমড়ার সর্বোচ্চ দাম সেপ্টেম্বর এবং অক্টোবর মাসে হয়। এটি কি আপনার প্রত্যাশার সাথে মেলে? কেন বা কেন নয়?
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+ম্যাটপ্লটলিব যে বিভিন্ন ধরনের ভিজুয়ালাইজেশন অফার করে তা অন্বেষণ করুন। রিগ্রেশন সমস্যার জন্য কোন ধরনের ভিজুয়ালাইজেশন সবচেয়ে উপযুক্ত?
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/12/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+ডেটা ভিজুয়ালাইজ করার বিভিন্ন উপায় দেখুন। উপলব্ধ বিভিন্ন লাইব্রেরির একটি তালিকা তৈরি করুন এবং নোট করুন কোনটি কোন ধরনের কাজের জন্য সবচেয়ে উপযুক্ত, যেমন ২ডি ভিজুয়ালাইজেশন বনাম ৩ডি ভিজুয়ালাইজেশন। আপনি কী আবিষ্কার করেন?
+
+## অ্যাসাইনমেন্ট
+
+[ভিজুয়ালাইজেশন অন্বেষণ](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/2-Data/assignment.md b/translations/bn/2-Regression/2-Data/assignment.md
new file mode 100644
index 000000000..e18d02471
--- /dev/null
+++ b/translations/bn/2-Regression/2-Data/assignment.md
@@ -0,0 +1,23 @@
+
+# ভিজুয়ালাইজেশন অন্বেষণ
+
+ডেটা ভিজুয়ালাইজেশনের জন্য বিভিন্ন লাইব্রেরি উপলব্ধ রয়েছে। এই পাঠে কুমড়ার ডেটা ব্যবহার করে matplotlib এবং seaborn দিয়ে একটি নমুনা নোটবুকে কিছু ভিজুয়ালাইজেশন তৈরি করুন। কোন লাইব্রেরিগুলি কাজ করার জন্য সহজ?
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | --------- | -------- | ----------------- |
+| | দুটি অনুসন্ধান/ভিজুয়ালাইজেশন সহ একটি নোটবুক জমা দেওয়া হয়েছে | একটি অনুসন্ধান/ভিজুয়ালাইজেশন সহ একটি নোটবুক জমা দেওয়া হয়েছে | একটি নোটবুক জমা দেওয়া হয়নি |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/2-Data/notebook.ipynb b/translations/bn/2-Regression/2-Data/notebook.ipynb
new file mode 100644
index 000000000..b20198e4f
--- /dev/null
+++ b/translations/bn/2-Regression/2-Data/notebook.ipynb
@@ -0,0 +1,46 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.3-final"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3",
+ "language": "python"
+ },
+ "coopTranslator": {
+ "original_hash": "1b2ab303ac6c604a34c6ca7a49077fc7",
+ "translation_date": "2025-08-29T23:10:33+00:00",
+ "source_file": "2-Regression/2-Data/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/2-Data/solution/Julia/README.md b/translations/bn/2-Regression/2-Data/solution/Julia/README.md
new file mode 100644
index 000000000..c68430046
--- /dev/null
+++ b/translations/bn/2-Regression/2-Data/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/2-Data/solution/R/lesson_2-R.ipynb b/translations/bn/2-Regression/2-Data/solution/R/lesson_2-R.ipynb
new file mode 100644
index 000000000..7ab7536c8
--- /dev/null
+++ b/translations/bn/2-Regression/2-Data/solution/R/lesson_2-R.ipynb
@@ -0,0 +1,670 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "metadata": {
+ "colab": {
+ "name": "lesson_2-R.ipynb",
+ "provenance": [],
+ "collapsed_sections": [],
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "name": "ir",
+ "display_name": "R"
+ },
+ "language_info": {
+ "name": "R"
+ },
+ "coopTranslator": {
+ "original_hash": "f3c335f9940cfd76528b3ef918b9b342",
+ "translation_date": "2025-08-29T23:12:22+00:00",
+ "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# একটি রিগ্রেশন মডেল তৈরি করুন: ডেটা প্রস্তুত এবং ভিজ্যুয়ালাইজ করুন\n",
+ "\n",
+ "## **কুমড়ার জন্য লিনিয়ার রিগ্রেশন - পাঠ ২**\n",
+ "#### ভূমিকা\n",
+ "\n",
+ "এখন যেহেতু আপনি Tidymodels এবং Tidyverse ব্যবহার করে মেশিন লার্নিং মডেল তৈরির জন্য প্রয়োজনীয় সরঞ্জামগুলি সেটআপ করেছেন, আপনি আপনার ডেটা থেকে প্রশ্ন করতে প্রস্তুত। ডেটার সাথে কাজ করার সময় এবং মেশিন লার্নিং সমাধান প্রয়োগ করার সময়, সঠিক প্রশ্ন করা অত্যন্ত গুরুত্বপূর্ণ যাতে আপনার ডেটাসেটের সম্ভাবনাগুলি সঠিকভাবে উন্মোচিত হয়।\n",
+ "\n",
+ "এই পাঠে আপনি শিখবেন:\n",
+ "\n",
+ "- কীভাবে আপনার ডেটা মডেল তৈরির জন্য প্রস্তুত করবেন।\n",
+ "\n",
+ "- কীভাবে `ggplot2` ব্যবহার করে ডেটা ভিজ্যুয়ালাইজ করবেন।\n",
+ "\n",
+ "আপনার উত্তর খুঁজে পাওয়ার জন্য যে প্রশ্নটি করা হবে তা নির্ধারণ করবে আপনি কোন ধরনের মেশিন লার্নিং অ্যালগরিদম ব্যবহার করবেন। এবং আপনি যে উত্তরটি ফিরে পাবেন তার গুণমান অনেকাংশে আপনার ডেটার প্রকৃতির উপর নির্ভর করবে।\n",
+ "\n",
+ "চলুন একটি বাস্তব অনুশীলনের মাধ্যমে এটি দেখি।\n",
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " চিত্রকর্ম: @allison_horst\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "Pg5aexcOPqAZ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## ১. কুমড়ার ডেটা আমদানি এবং Tidyverse ব্যবহার\n",
+ "\n",
+ "এই পাঠটি বিশ্লেষণ এবং সাজানোর জন্য আমাদের নিম্নলিখিত প্যাকেজগুলো প্রয়োজন হবে:\n",
+ "\n",
+ "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) হলো একটি [R প্যাকেজের সংগ্রহ](https://www.tidyverse.org/packages), যা ডেটা সায়েন্সকে দ্রুত, সহজ এবং আরও মজাদার করে তোলে!\n",
+ "\n",
+ "আপনি এটি নিম্নলিখিতভাবে ইনস্টল করতে পারেন:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\"))`\n",
+ "\n",
+ "নিচের স্ক্রিপ্টটি পরীক্ষা করে দেখবে যে আপনার এই মডিউল সম্পন্ন করার জন্য প্রয়োজনীয় প্যাকেজগুলো আছে কিনা এবং যদি কিছু অনুপস্থিত থাকে তবে সেগুলো ইনস্টল করে দেবে।\n"
+ ],
+ "metadata": {
+ "id": "dc5WhyVdXAjR"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
+ "pacman::p_load(tidyverse)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "GqPYUZgfXOBt"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এখন, চলুন কিছু প্যাকেজ চালু করি এবং এই পাঠের জন্য প্রদত্ত [ডেটা](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) লোড করি!\n"
+ ],
+ "metadata": {
+ "id": "kvjDTPDSXRr2"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load the core Tidyverse packages\n",
+ "library(tidyverse)\n",
+ "\n",
+ "# Import the pumpkins data\n",
+ "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
+ "\n",
+ "\n",
+ "# Get a glimpse and dimensions of the data\n",
+ "glimpse(pumpkins)\n",
+ "\n",
+ "\n",
+ "# Print the first 50 rows of the data set\n",
+ "pumpkins %>% \n",
+ " slice_head(n =50)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "VMri-t2zXqgD"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "একটি দ্রুত `glimpse()` দেখায় যে ডেটাসেটে ফাঁকা জায়গা রয়েছে এবং স্ট্রিং (`chr`) এবং সংখ্যাসূচক ডেটা (`dbl`) এর মিশ্রণ রয়েছে। `Date` চরিত্র টাইপের এবং একটি অদ্ভুত কলাম রয়েছে যার নাম `Package`, যেখানে ডেটা `sacks`, `bins` এবং অন্যান্য মানগুলির মিশ্রণ। আসলে, ডেটাটি একটু বিশৃঙ্খল 😤।\n",
+ "\n",
+ "প্রকৃতপক্ষে, এমন একটি ডেটাসেট পাওয়া খুবই বিরল যা সম্পূর্ণ প্রস্তুত অবস্থায় থাকে এবং সরাসরি একটি ML মডেল তৈরির জন্য ব্যবহার করা যায়। তবে চিন্তা করবেন না, এই পাঠে আপনি শিখবেন কীভাবে একটি কাঁচা ডেটাসেট প্রস্তুত করতে হয় স্ট্যান্ডার্ড R লাইব্রেরি ব্যবহার করে 🧑🔧। এছাড়াও, আপনি ডেটা ভিজ্যুয়ালাইজ করার বিভিন্ন কৌশল শিখবেন।📈📊\n",
+ " \n",
+ "\n",
+ "> একটি পুনঃস্মরণ: পাইপ অপারেটর (`%>%`) লজিক্যাল ক্রমে অপারেশন সম্পাদন করে একটি অবজেক্টকে একটি ফাংশন বা কল এক্সপ্রেশনে এগিয়ে পাঠিয়ে। আপনি পাইপ অপারেটরকে আপনার কোডে \"এবং তারপর\" বলার মতো ভাবতে পারেন।\n"
+ ],
+ "metadata": {
+ "id": "REWcIv9yX29v"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## ২. অনুপস্থিত ডেটা পরীক্ষা করুন\n",
+ "\n",
+ "ডেটা বিজ্ঞানীদের জন্য সবচেয়ে সাধারণ সমস্যাগুলোর একটি হলো অসম্পূর্ণ বা অনুপস্থিত ডেটা নিয়ে কাজ করা। R-এ অনুপস্থিত বা অজানা মানগুলোকে একটি বিশেষ সংকেত মান দিয়ে প্রকাশ করা হয়: `NA` (Not Available)।\n",
+ "\n",
+ "তাহলে আমরা কীভাবে জানব যে ডেটা ফ্রেমে অনুপস্থিত মান রয়েছে? \n",
+ " \n",
+ "- একটি সরল উপায় হলো বেস R ফাংশন `anyNA` ব্যবহার করা, যা যৌক্তিক মান `TRUE` বা `FALSE` প্রদান করে।\n"
+ ],
+ "metadata": {
+ "id": "Zxfb3AM5YbUe"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "pumpkins %>% \n",
+ " anyNA()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "G--DQutAYltj"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "দারুণ, মনে হচ্ছে কিছু ডেটা অনুপস্থিত! এটি শুরু করার জন্য একটি ভালো জায়গা।\n",
+ "\n",
+ "- আরেকটি উপায় হতে পারে `is.na()` ফাংশন ব্যবহার করা, যা একটি লজিক্যাল `TRUE` দিয়ে দেখায় কোন কোন কলামের উপাদান অনুপস্থিত।\n"
+ ],
+ "metadata": {
+ "id": "mU-7-SB6YokF"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "pumpkins %>% \n",
+ " is.na() %>% \n",
+ " head(n = 7)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "W-DxDOR4YxSW"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ঠিক আছে, কাজটি সম্পন্ন হয়েছে, তবে এমন একটি বড় ডেটা ফ্রেমের ক্ষেত্রে প্রতিটি সারি এবং কলাম আলাদাভাবে পর্যালোচনা করা অকার্যকর এবং বাস্তবিকভাবে অসম্ভব হবে😴।\n",
+ "\n",
+ "- একটি আরও সহজবোধ্য পদ্ধতি হতে পারে প্রতিটি কলামের জন্য অনুপস্থিত মানগুলোর যোগফল গণনা করা:\n"
+ ],
+ "metadata": {
+ "id": "xUWxipKYY0o7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "pumpkins %>% \n",
+ " is.na() %>% \n",
+ " colSums()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "ZRBWV6P9ZArL"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "অনেক ভালো! কিছু ডেটা অনুপস্থিত, তবে সম্ভবত এটি বর্তমান কাজের জন্য তেমন গুরুত্বপূর্ণ নয়। চলুন দেখি আরও বিশ্লেষণ কী নিয়ে আসে।\n",
+ "\n",
+ "> অসাধারণ প্যাকেজ এবং ফাংশনের সেটগুলোর পাশাপাশি, R-এ খুব ভালো ডকুমেন্টেশন রয়েছে। উদাহরণস্বরূপ, `help(colSums)` বা `?colSums` ব্যবহার করে ফাংশন সম্পর্কে আরও জানতে পারেন।\n"
+ ],
+ "metadata": {
+ "id": "9gv-crB6ZD1Y"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 3. Dplyr: ডেটা ম্যানিপুলেশনের একটি ব্যাকরণ\n",
+ "\n",
+ "
\n",
+ " \n",
+ " চিত্রকর্ম: @allison_horst\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "o4jLY5-VZO2C"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "[`dplyr`](https://dplyr.tidyverse.org/), যা Tidyverse-এর একটি প্যাকেজ, এটি ডেটা ম্যানিপুলেশনের একটি ব্যাকরণ যা একটি সঙ্গতিপূর্ণ ক্রিয়াপদের সেট সরবরাহ করে যা আপনাকে সবচেয়ে সাধারণ ডেটা ম্যানিপুলেশনের চ্যালেঞ্জগুলি সমাধান করতে সহায়তা করে। এই অংশে, আমরা dplyr-এর কিছু ক্রিয়াপদ অন্বেষণ করব! \n",
+ " \n"
+ ],
+ "metadata": {
+ "id": "i5o33MQBZWWw"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### dplyr::select()\n",
+ "\n",
+ "`select()` হলো `dplyr` প্যাকেজের একটি ফাংশন যা আপনাকে নির্দিষ্ট কলামগুলো বাছাই করতে বা বাদ দিতে সাহায্য করে।\n",
+ "\n",
+ "আপনার ডেটা ফ্রেমকে আরও সহজে ব্যবহারের উপযোগী করতে, `select()` ব্যবহার করে প্রয়োজনীয় কলামগুলো রেখে বাকিগুলো বাদ দিন।\n",
+ "\n",
+ "উদাহরণস্বরূপ, এই অনুশীলনে আমাদের বিশ্লেষণে `Package`, `Low Price`, `High Price` এবং `Date` কলামগুলো অন্তর্ভুক্ত থাকবে। চলুন এই কলামগুলো বাছাই করি।\n"
+ ],
+ "metadata": {
+ "id": "x3VGMAGBZiUr"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Select desired columns\n",
+ "pumpkins <- pumpkins %>% \n",
+ " select(Package, `Low Price`, `High Price`, Date)\n",
+ "\n",
+ "\n",
+ "# Print data set\n",
+ "pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "F_FgxQnVZnM0"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### dplyr::mutate()\n",
+ "\n",
+ "`mutate()` হল `dplyr` প্যাকেজের একটি ফাংশন, যা আপনাকে নতুন কলাম তৈরি করতে বা বিদ্যমান কলাম পরিবর্তন করতে সাহায্য করে, এবং একই সাথে আগের কলামগুলো অক্ষত রাখে।\n",
+ "\n",
+ "`mutate`-এর সাধারণ কাঠামো হলো:\n",
+ "\n",
+ "`data %>% mutate(new_column_name = what_it_contains)`\n",
+ "\n",
+ "চলুন, `Date` কলাম ব্যবহার করে `mutate`-এর কার্যকারিতা পরীক্ষা করি এবং নিচের কাজগুলো সম্পন্ন করি:\n",
+ "\n",
+ "1. তারিখগুলো (যা বর্তমানে character টাইপে আছে) মাসের ফরম্যাটে রূপান্তর করি (এগুলো US তারিখ, তাই ফরম্যাট হলো `MM/DD/YYYY`)।\n",
+ "\n",
+ "2. তারিখ থেকে মাস বের করে একটি নতুন কলামে সংরক্ষণ করি।\n",
+ "\n",
+ "R-এ, [lubridate](https://lubridate.tidyverse.org/) প্যাকেজটি Date-time ডেটা নিয়ে কাজ করা সহজ করে তোলে। সুতরাং, চলুন `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` ব্যবহার করে উপরের লক্ষ্যগুলো অর্জন করি। যেহেতু পরবর্তী কাজগুলোতে Date কলাম আর প্রয়োজন হবে না, তাই আমরা এটি বাদ দিতে পারি।\n"
+ ],
+ "metadata": {
+ "id": "2KKo0Ed9Z1VB"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load lubridate\n",
+ "library(lubridate)\n",
+ "\n",
+ "pumpkins <- pumpkins %>% \n",
+ " # Convert the Date column to a date object\n",
+ " mutate(Date = mdy(Date)) %>% \n",
+ " # Extract month from Date\n",
+ " mutate(Month = month(Date)) %>% \n",
+ " # Drop Date column\n",
+ " select(-Date)\n",
+ "\n",
+ "# View the first few rows\n",
+ "pumpkins %>% \n",
+ " slice_head(n = 7)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "5joszIVSZ6xe"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "উফফ! 🤩\n",
+ "\n",
+ "এবার, চলুন একটি নতুন কলাম `Price` তৈরি করি, যা একটি কুমড়ার গড় মূল্যকে উপস্থাপন করে। এখন, `Low Price` এবং `High Price` কলামের গড় নিয়ে নতুন Price কলামটি পূরণ করি। \n"
+ ],
+ "metadata": {
+ "id": "nIgLjNMCZ-6Y"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Create a new column Price\n",
+ "pumpkins <- pumpkins %>% \n",
+ " mutate(Price = (`Low Price` + `High Price`)/2)\n",
+ "\n",
+ "# View the first few rows of the data\n",
+ "pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "Zo0BsqqtaJw2"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "হ্যাঁ!💪\n",
+ "\n",
+ "\"কিন্তু থামো!\", তুমি বলবে পুরো ডেটা সেটটি `View(pumpkins)` দিয়ে স্কিম করার পর, \"এখানে কিছু অদ্ভুত ব্যাপার আছে!\"🤔\n",
+ "\n",
+ "যদি তুমি `Package` কলামটি দেখো, তাহলে দেখবে কুমড়ো বিভিন্ন কনফিগারেশনে বিক্রি হচ্ছে। কিছু বিক্রি হচ্ছে `1 1/9 bushel` পরিমাপে, কিছু `1/2 bushel` পরিমাপে, কিছু প্রতি কুমড়ো হিসেবে, কিছু প্রতি পাউন্ড হিসেবে, এবং কিছু বড় বাক্সে যার প্রস্থ বিভিন্ন রকম। \n",
+ "\n",
+ "চল এটা যাচাই করি:\n"
+ ],
+ "metadata": {
+ "id": "p77WZr-9aQAR"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Verify the distinct observations in Package column\n",
+ "pumpkins %>% \n",
+ " distinct(Package)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "XISGfh0IaUy6"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "অসাধারণ!👏\n",
+ "\n",
+ "কুমড়াগুলোকে ধারাবাহিকভাবে ওজন করা বেশ কঠিন বলে মনে হচ্ছে, তাই চলুন আমরা সেগুলো ফিল্টার করি যেগুলোর `Package` কলামে *bushel* স্ট্রিং রয়েছে এবং এগুলোকে একটি নতুন ডেটা ফ্রেম `new_pumpkins`-এ রাখি।\n"
+ ],
+ "metadata": {
+ "id": "7sMjiVujaZxY"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### dplyr::filter() এবং stringr::str_detect()\n",
+ "\n",
+ "[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): ডেটার একটি উপসেট তৈরি করে যা শুধুমাত্র সেই **সারি** গুলো রাখে যা আপনার শর্ত পূরণ করে, এই ক্ষেত্রে, `Package` কলামে *bushel* স্ট্রিং থাকা কুমড়াগুলো।\n",
+ "\n",
+ "[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): একটি স্ট্রিং-এ কোনো প্যাটার্নের উপস্থিতি বা অনুপস্থিতি সনাক্ত করে।\n",
+ "\n",
+ "[`stringr`](https://github.com/tidyverse/stringr) প্যাকেজটি সাধারণ স্ট্রিং অপারেশনের জন্য সহজ ফাংশন সরবরাহ করে।\n"
+ ],
+ "metadata": {
+ "id": "L8Qfcs92ageF"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Retain only pumpkins with \"bushel\"\n",
+ "new_pumpkins <- pumpkins %>% \n",
+ " filter(str_detect(Package, \"bushel\"))\n",
+ "\n",
+ "# Get the dimensions of the new data\n",
+ "dim(new_pumpkins)\n",
+ "\n",
+ "# View a few rows of the new data\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "hy_SGYREampd"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আপনি দেখতে পাচ্ছেন যে আমরা প্রায় ৪১৫টি সারি ডেটা সীমিত করেছি, যেখানে কুমড়া বাসেল হিসেবে রয়েছে।🤩 \n",
+ " \n"
+ ],
+ "metadata": {
+ "id": "VrDwF031avlR"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### dplyr::case_when()\n",
+ "\n",
+ "**কিন্তু অপেক্ষা করুন! আরও একটি কাজ বাকি আছে**\n",
+ "\n",
+ "আপনি কি লক্ষ্য করেছেন যে প্রতি সারিতে বাসেলের পরিমাণ ভিন্ন? আপনাকে মূল্য নির্ধারণকে স্বাভাবিক করতে হবে যাতে আপনি প্রতি বাসেলের মূল্য দেখান, ১ ১/৯ বা ১/২ বাসেলের নয়। এটি মানক করার জন্য কিছু গণিত করার সময়।\n",
+ "\n",
+ "আমরা [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) ফাংশন ব্যবহার করব *Price* কলামটি পরিবর্তন করতে কিছু শর্তের উপর ভিত্তি করে। `case_when` আপনাকে একাধিক `if_else()` বিবৃতি ভেক্টরাইজ করতে দেয়।\n"
+ ],
+ "metadata": {
+ "id": "mLpw2jH4a0tx"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Convert the price if the Package contains fractional bushel values\n",
+ "new_pumpkins <- new_pumpkins %>% \n",
+ " mutate(Price = case_when(\n",
+ " str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
+ " str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
+ " TRUE ~ Price))\n",
+ "\n",
+ "# View the first few rows of the data\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 30)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "P68kLVQmbM6I"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এখন আমরা তাদের বাসেল পরিমাপের উপর ভিত্তি করে প্রতি ইউনিটের মূল্য বিশ্লেষণ করতে পারি। তবে, কুমড়ার বাসেল নিয়ে এই সমস্ত অধ্যয়ন দেখায় যে `আপনার ডেটার প্রকৃতি বুঝতে` কতটা `গুরুত্বপূর্ণ`!\n",
+ "\n",
+ "> ✅ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) অনুযায়ী, বাসেলের ওজন উৎপাদনের ধরণের উপর নির্ভর করে, কারণ এটি একটি আয়তনের পরিমাপ। \"উদাহরণস্বরূপ, টমেটোর একটি বাসেল ৫৬ পাউন্ড ওজনের হওয়া উচিত... পাতা এবং শাকসবজি বেশি জায়গা নেয় কিন্তু কম ওজনের হয়, তাই পালং শাকের একটি বাসেল মাত্র ২০ পাউন্ড।\" এটি বেশ জটিল! চলুন বাসেল থেকে পাউন্ডে রূপান্তর করার ঝামেলা না করি এবং বাসেল অনুযায়ী মূল্য নির্ধারণ করি। তবে, কুমড়ার বাসেল নিয়ে এই সমস্ত অধ্যয়ন দেখায় যে আপনার ডেটার প্রকৃতি বুঝতে কতটা গুরুত্বপূর্ণ!\n",
+ ">\n",
+ "> ✅ আপনি কি লক্ষ্য করেছেন যে অর্ধ-বাসেল কুমড়া বিক্রি খুবই ব্যয়বহুল? আপনি কি এর কারণ বের করতে পারেন? ইঙ্গিত: ছোট কুমড়াগুলো বড়গুলোর তুলনায় অনেক বেশি দামী, সম্ভবত কারণ একটি বড় ফাঁপা পাই কুমড়া যে জায়গা নেয়, তার তুলনায় ছোট কুমড়াগুলো বাসেলে অনেক বেশি থাকে।\n"
+ ],
+ "metadata": {
+ "id": "pS2GNPagbSdb"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এখন শেষ পর্যন্ত, শুধুমাত্র মজার জন্য 💁♀️, চলুন `Month` কলামটি প্রথম অবস্থানে সরিয়ে নিই অর্থাৎ `Package` কলামের আগে।\n",
+ "\n",
+ "`dplyr::relocate()` ব্যবহার করা হয় কলামের অবস্থান পরিবর্তন করতে।\n"
+ ],
+ "metadata": {
+ "id": "qql1SowfbdnP"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Create a new data frame new_pumpkins\n",
+ "new_pumpkins <- new_pumpkins %>% \n",
+ " relocate(Month, .before = Package)\n",
+ "\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 7)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "JJ1x6kw8bixF"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ভালো কাজ!👌 এখন আপনার কাছে একটি পরিষ্কার, সুশৃঙ্খল ডেটাসেট রয়েছে যার উপর আপনি আপনার নতুন রিগ্রেশন মডেল তৈরি করতে পারেন!\n"
+ ],
+ "metadata": {
+ "id": "y8TJ0Za_bn5Y"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 4. ggplot2 দিয়ে ডেটা ভিজ্যুয়ালাইজেশন\n",
+ "\n",
+ "
\n",
+ " \n",
+ " ইনফোগ্রাফিক: দাসানি মাদিপল্লি\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "একটি *জ্ঞানী* কথা আছে যা এভাবে বলা হয়:\n",
+ "\n",
+ "> \"একটি সাধারণ গ্রাফ ডেটা বিশ্লেষকের মনে অন্য যেকোনো পদ্ধতির চেয়ে বেশি তথ্য এনেছে।\" --- জন টুকি\n",
+ "\n",
+ "ডেটা সায়েন্টিস্টের কাজের একটি অংশ হলো তারা যে ডেটা নিয়ে কাজ করছেন তার গুণমান এবং প্রকৃতি প্রদর্শন করা। এটি করতে তারা প্রায়ই আকর্ষণীয় ভিজ্যুয়ালাইজেশন, বা প্লট, গ্রাফ এবং চার্ট তৈরি করেন, যা ডেটার বিভিন্ন দিক দেখায়। এইভাবে, তারা চাক্ষুষভাবে সম্পর্ক এবং ফাঁকগুলো দেখাতে সক্ষম হন যা অন্যথায় খুঁজে বের করা কঠিন।\n",
+ "\n",
+ "ভিজ্যুয়ালাইজেশন মেশিন লার্নিংয়ের জন্য উপযুক্ত পদ্ধতি নির্ধারণ করতেও সাহায্য করতে পারে। উদাহরণস্বরূপ, একটি স্ক্যাটারপ্লট যা একটি সরল রেখা অনুসরণ করে বলে মনে হয়, তা নির্দেশ করে যে ডেটা একটি লিনিয়ার রিগ্রেশন অনুশীলনের জন্য ভালো প্রার্থী।\n",
+ "\n",
+ "R-এ গ্রাফ তৈরির জন্য বেশ কয়েকটি সিস্টেম রয়েছে, তবে [`ggplot2`](https://ggplot2.tidyverse.org/index.html) সবচেয়ে মার্জিত এবং বহুমুখী। `ggplot2` আপনাকে **স্বতন্ত্র উপাদানগুলো একত্রিত করে** গ্রাফ তৈরি করতে দেয়।\n",
+ "\n",
+ "চলুন Price এবং Month কলামের জন্য একটি সাধারণ স্ক্যাটারপ্লট দিয়ে শুরু করি।\n",
+ "\n",
+ "এই ক্ষেত্রে, আমরা [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html) দিয়ে শুরু করব, একটি ডেটাসেট এবং অ্যাসথেটিক ম্যাপিং সরবরাহ করব (যা [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html) ব্যবহার করে) এবং তারপর স্ক্যাটারপ্লটের জন্য লেয়ার যোগ করব (যেমন [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html))।\n"
+ ],
+ "metadata": {
+ "id": "mYSH6-EtbvNa"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Set a theme for the plots\n",
+ "theme_set(theme_light())\n",
+ "\n",
+ "# Create a scatter plot\n",
+ "p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
+ "p + geom_point()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "g2YjnGeOcLo4"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এই প্লটটি কি উপকারী 🤷? এটি কি আপনাকে কোনোভাবে অবাক করে?\n",
+ "\n",
+ "এটি বিশেষভাবে উপকারী নয় কারণ এটি শুধুমাত্র আপনার ডেটাকে একটি নির্দিষ্ট মাসে পয়েন্টগুলোর ছড়িয়ে থাকা হিসেবে প্রদর্শন করে। \n"
+ ],
+ "metadata": {
+ "id": "Ml7SDCLQcPvE"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### **আমরা কীভাবে এটি উপযোগী করে তুলব?**\n",
+ "\n",
+ "ডেটা থেকে কার্যকর তথ্য প্রদর্শনের জন্য, সাধারণত ডেটাকে কোনোভাবে গোষ্ঠীবদ্ধ করতে হয়। উদাহরণস্বরূপ, আমাদের ক্ষেত্রে, প্রতিটি মাসের জন্য কুমড়ার গড় দাম খুঁজে বের করা আমাদের ডেটার অন্তর্নিহিত ধরণগুলো সম্পর্কে আরও অন্তর্দৃষ্টি প্রদান করবে। এটি আমাদেরকে আরেকটি **dplyr** ফ্লাইবাইয়ের দিকে নিয়ে যায়:\n",
+ "\n",
+ "#### `dplyr::group_by() %>% summarize()`\n",
+ "\n",
+ "R-এ গোষ্ঠীবদ্ধ সমষ্টি সহজেই গণনা করা যায়\n",
+ "\n",
+ "`dplyr::group_by() %>% summarize()` ব্যবহার করে।\n",
+ "\n",
+ "- `dplyr::group_by()` সম্পূর্ণ ডেটাসেটের পরিবর্তে পৃথক গোষ্ঠীগুলোর (যেমন প্রতি মাসের) উপর বিশ্লেষণের একক পরিবর্তন করে।\n",
+ "\n",
+ "- `dplyr::summarize()` একটি নতুন ডেটাফ্রেম তৈরি করে, যেখানে প্রতিটি গোষ্ঠীবদ্ধ ভেরিয়েবলের জন্য একটি কলাম এবং আপনার নির্দিষ্ট করা প্রতিটি সারাংশ পরিসংখ্যানের জন্য একটি কলাম থাকে।\n",
+ "\n",
+ "উদাহরণস্বরূপ, আমরা `dplyr::group_by() %>% summarize()` ব্যবহার করে **Month** কলামের উপর ভিত্তি করে কুমড়াগুলোকে গোষ্ঠীবদ্ধ করতে পারি এবং তারপর প্রতিটি মাসের জন্য **গড় দাম** বের করতে পারি।\n"
+ ],
+ "metadata": {
+ "id": "jMakvJZIcVkh"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Find the average price of pumpkins per month\r\n",
+ "new_pumpkins %>%\r\n",
+ " group_by(Month) %>% \r\n",
+ " summarise(mean_price = mean(Price))"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "6kVSUa2Bcilf"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "সংক্ষিপ্ত!✨\n",
+ "\n",
+ "মাসের মতো শ্রেণীবদ্ধ বৈশিষ্ট্যগুলো বার প্লট 📊 ব্যবহার করে ভালোভাবে উপস্থাপন করা যায়। বার চার্টের জন্য ব্যবহৃত স্তরগুলো হলো `geom_bar()` এবং `geom_col()`। `?geom_bar` দেখুন আরও জানতে।\n",
+ "\n",
+ "চলুন একটি তৈরি করি!\n"
+ ],
+ "metadata": {
+ "id": "Kds48GUBcj3W"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Find the average price of pumpkins per month then plot a bar chart\r\n",
+ "new_pumpkins %>%\r\n",
+ " group_by(Month) %>% \r\n",
+ " summarise(mean_price = mean(Price)) %>% \r\n",
+ " ggplot(aes(x = Month, y = mean_price)) +\r\n",
+ " geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
+ " ylab(\"Pumpkin Price\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "VNbU1S3BcrxO"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "🤩🤩এটি একটি আরও কার্যকর ডেটা ভিজ্যুয়ালাইজেশন! এটি মনে হচ্ছে যে কুমড়ার সর্বোচ্চ মূল্য সেপ্টেম্বর এবং অক্টোবর মাসে ঘটে। এটি কি আপনার প্রত্যাশার সাথে মিলে যায়? কেন বা কেন নয়?\n",
+ "\n",
+ "দ্বিতীয় পাঠ শেষ করার জন্য অভিনন্দন 👏! আপনি মডেল তৈরির জন্য আপনার ডেটা প্রস্তুত করেছেন, তারপর ভিজ্যুয়ালাইজেশন ব্যবহার করে আরও অন্তর্দৃষ্টি আবিষ্কার করেছেন!\n"
+ ],
+ "metadata": {
+ "id": "zDm0VOzzcuzR"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/2-Data/solution/notebook.ipynb b/translations/bn/2-Regression/2-Data/solution/notebook.ipynb
new file mode 100644
index 000000000..00ca6a736
--- /dev/null
+++ b/translations/bn/2-Regression/2-Data/solution/notebook.ipynb
@@ -0,0 +1,439 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## কুমড়ার জন্য লিনিয়ার রিগ্রেশন - পাঠ ২\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Type
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Sub Variety
\n",
+ "
Grade
\n",
+ "
Date
\n",
+ "
Low Price
\n",
+ "
High Price
\n",
+ "
Mostly Low
\n",
+ "
...
\n",
+ "
Unit of Sale
\n",
+ "
Quality
\n",
+ "
Condition
\n",
+ "
Appearance
\n",
+ "
Storage
\n",
+ "
Crop
\n",
+ "
Repack
\n",
+ "
Trans Mode
\n",
+ "
Unnamed: 24
\n",
+ "
Unnamed: 25
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
70
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
71
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
72
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
10/1/16
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
73
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
10/1/16
\n",
+ "
17.0
\n",
+ "
17.0
\n",
+ "
17.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
74
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
10/8/16
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Type Package Variety Sub Variety Grade \\\n",
+ "70 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "71 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "72 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "73 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "74 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "\n",
+ " Date Low Price High Price Mostly Low ... Unit of Sale Quality \\\n",
+ "70 9/24/16 15.0 15.0 15.0 ... NaN NaN \n",
+ "71 9/24/16 18.0 18.0 18.0 ... NaN NaN \n",
+ "72 10/1/16 18.0 18.0 18.0 ... NaN NaN \n",
+ "73 10/1/16 17.0 17.0 17.0 ... NaN NaN \n",
+ "74 10/8/16 15.0 15.0 15.0 ... NaN NaN \n",
+ "\n",
+ " Condition Appearance Storage Crop Repack Trans Mode Unnamed: 24 \\\n",
+ "70 NaN NaN NaN NaN N NaN NaN \n",
+ "71 NaN NaN NaN NaN N NaN NaN \n",
+ "72 NaN NaN NaN NaN N NaN NaN \n",
+ "73 NaN NaN NaN NaN N NaN NaN \n",
+ "74 NaN NaN NaN NaN N NaN NaN \n",
+ "\n",
+ " Unnamed: 25 \n",
+ "70 NaN \n",
+ "71 NaN \n",
+ "72 NaN \n",
+ "73 NaN \n",
+ "74 NaN \n",
+ "\n",
+ "[5 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n",
+ "\n",
+ "pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
+ "\n",
+ "pumpkins.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "City Name 0\n",
+ "Type 406\n",
+ "Package 0\n",
+ "Variety 0\n",
+ "Sub Variety 167\n",
+ "Grade 415\n",
+ "Date 0\n",
+ "Low Price 0\n",
+ "High Price 0\n",
+ "Mostly Low 24\n",
+ "Mostly High 24\n",
+ "Origin 0\n",
+ "Origin District 396\n",
+ "Item Size 114\n",
+ "Color 145\n",
+ "Environment 415\n",
+ "Unit of Sale 404\n",
+ "Quality 415\n",
+ "Condition 415\n",
+ "Appearance 415\n",
+ "Storage 415\n",
+ "Crop 415\n",
+ "Repack 0\n",
+ "Trans Mode 415\n",
+ "Unnamed: 24 415\n",
+ "Unnamed: 25 391\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pumpkins.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Month Package Low Price High Price Price\n",
+ "70 9 1 1/9 bushel cartons 15.00 15.0 13.50\n",
+ "71 9 1 1/9 bushel cartons 18.00 18.0 16.20\n",
+ "72 10 1 1/9 bushel cartons 18.00 18.0 16.20\n",
+ "73 10 1 1/9 bushel cartons 17.00 17.0 15.30\n",
+ "74 10 1 1/9 bushel cartons 15.00 15.0 13.50\n",
+ "... ... ... ... ... ...\n",
+ "1738 9 1/2 bushel cartons 15.00 15.0 30.00\n",
+ "1739 9 1/2 bushel cartons 13.75 15.0 28.75\n",
+ "1740 9 1/2 bushel cartons 10.75 15.0 25.75\n",
+ "1741 9 1/2 bushel cartons 12.00 12.0 24.00\n",
+ "1742 9 1/2 bushel cartons 12.00 12.0 24.00\n",
+ "\n",
+ "[415 rows x 5 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "# A set of new columns for a new dataframe. Filter out nonmatching columns\n",
+ "columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']\n",
+ "pumpkins = pumpkins.loc[:, columns_to_select]\n",
+ "\n",
+ "# Get an average between low and high price for the base pumpkin price\n",
+ "price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2\n",
+ "\n",
+ "# Convert the date to its month only\n",
+ "month = pd.DatetimeIndex(pumpkins['Date']).month\n",
+ "\n",
+ "# Create a new dataframe with this basic data\n",
+ "new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})\n",
+ "\n",
+ "# Convert the price if the Package contains fractional bushel values\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)\n",
+ "\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)\n",
+ "\n",
+ "print(new_pumpkins)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "\n",
+ "new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')\n",
+ "plt.ylabel(\"Pumpkin Price\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
+ },
+ "kernelspec": {
+ "display_name": "Python 3.7.0 64-bit ('3.7')",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.1"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "95726f0b8283628d5356a4f8eb8b4b76",
+ "translation_date": "2025-08-29T23:10:48+00:00",
+ "source_file": "2-Regression/2-Data/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/3-Linear/README.md b/translations/bn/2-Regression/3-Linear/README.md
new file mode 100644
index 000000000..721f258a3
--- /dev/null
+++ b/translations/bn/2-Regression/3-Linear/README.md
@@ -0,0 +1,380 @@
+
+# স্কিকিট-লার্ন ব্যবহার করে রিগ্রেশন মডেল তৈরি করুন: চারটি পদ্ধতিতে রিগ্রেশন
+
+
+> ইনফোগ্রাফিক: [দাসানি মাদিপল্লি](https://twitter.com/dasani_decoded)
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/13/)
+
+> ### [এই পাঠটি R-এও উপলব্ধ!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
+### ভূমিকা
+
+এখন পর্যন্ত আপনি রিগ্রেশন কী তা কুমড়ার দাম সম্পর্কিত একটি নমুনা ডেটাসেট ব্যবহার করে অন্বেষণ করেছেন, যা আমরা এই পাঠে ব্যবহার করব। আপনি এটি ম্যাটপ্লটলিব ব্যবহার করে ভিজুয়ালাইজও করেছেন।
+
+এখন আপনি মেশিন লার্নিংয়ের জন্য রিগ্রেশন সম্পর্কে আরও গভীরভাবে জানার জন্য প্রস্তুত। ভিজুয়ালাইজেশন ডেটা বোঝার জন্য সহায়ক হলেও, মেশিন লার্নিংয়ের আসল শক্তি আসে _মডেল প্রশিক্ষণ_ থেকে। মডেলগুলি ঐতিহাসিক ডেটার উপর প্রশিক্ষিত হয় যাতে ডেটার নির্ভরশীলতা স্বয়ংক্রিয়ভাবে ধরা যায় এবং নতুন ডেটার জন্য ফলাফল পূর্বাভাস দেওয়া যায়, যা মডেল আগে দেখেনি।
+
+এই পাঠে, আপনি দুটি ধরণের রিগ্রেশন সম্পর্কে আরও জানবেন: _বেসিক লিনিয়ার রিগ্রেশন_ এবং _পলিনোমিয়াল রিগ্রেশন_, এবং এই কৌশলগুলির সাথে সম্পর্কিত কিছু গণিত। এই মডেলগুলি আমাদের বিভিন্ন ইনপুট ডেটার উপর ভিত্তি করে কুমড়ার দাম পূর্বাভাস দিতে সাহায্য করবে।
+
+[](https://youtu.be/CRxFT8oTDMg "শিক্ষার্থীদের জন্য মেশিন লার্নিং - লিনিয়ার রিগ্রেশন বোঝা")
+
+> 🎥 উপরের ছবিতে ক্লিক করে লিনিয়ার রিগ্রেশন সম্পর্কে একটি সংক্ষিপ্ত ভিডিও দেখুন।
+
+> এই পাঠ্যক্রম জুড়ে, আমরা গণিতের ন্যূনতম জ্ঞান ধরে নিই এবং এটি অন্যান্য ক্ষেত্র থেকে আসা শিক্ষার্থীদের জন্য সহজলভ্য করার চেষ্টা করি। তাই নোট, 🧮 কলআউট, ডায়াগ্রাম এবং অন্যান্য শেখার সরঞ্জামগুলির দিকে নজর রাখুন যা বোঝার জন্য সহায়ক।
+
+### পূর্বশর্ত
+
+এখন পর্যন্ত আপনি যে কুমড়ার ডেটা বিশ্লেষণ করছেন তার গঠন সম্পর্কে পরিচিত হওয়া উচিত। এই পাঠের _notebook.ipynb_ ফাইলে এটি প্রিলোড এবং প্রি-ক্লিন করা অবস্থায় পাবেন। ফাইলে, কুমড়ার দাম একটি নতুন ডেটা ফ্রেমে প্রতি বাসেল হিসেবে প্রদর্শিত হয়েছে। নিশ্চিত করুন যে আপনি এই নোটবুকগুলি ভিজ্যুয়াল স্টুডিও কোডের কার্নেলে চালাতে পারেন।
+
+### প্রস্তুতি
+
+মনে করিয়ে দেওয়ার জন্য, আপনি এই ডেটা লোড করছেন যাতে এটি থেকে প্রশ্ন করতে পারেন।
+
+- কুমড়া কেনার সেরা সময় কখন?
+- একটি মিনিয়েচার কুমড়ার কেসের দাম কত হতে পারে?
+- আমি কি এগুলি অর্ধ-বাসেল ঝুড়িতে কিনব নাকি ১ ১/৯ বাসেল বাক্সে কিনব?
+চলুন এই ডেটা আরও গভীরভাবে বিশ্লেষণ করি।
+
+পূর্ববর্তী পাঠে, আপনি একটি প্যান্ডাস ডেটা ফ্রেম তৈরি করেছেন এবং এটি মূল ডেটাসেটের একটি অংশ দিয়ে পূরণ করেছেন, দামকে বাসেল অনুযায়ী মানক করে। তবে, এটি করার মাধ্যমে আপনি প্রায় ৪০০ ডেটাপয়েন্ট এবং শুধুমাত্র শরৎকালের মাসগুলির জন্য ডেটা সংগ্রহ করতে পেরেছিলেন।
+
+এই পাঠের সাথে থাকা নোটবুকে প্রিলোড করা ডেটা দেখুন। ডেটা প্রিলোড করা হয়েছে এবং একটি প্রাথমিক স্ক্যাটারপ্লট মাসের ডেটা দেখানোর জন্য চার্ট করা হয়েছে। হয়তো আমরা ডেটার প্রকৃতি সম্পর্কে আরও বিশদ পেতে পারি যদি এটি আরও পরিষ্কার করি।
+
+## একটি লিনিয়ার রিগ্রেশন লাইন
+
+পাঠ ১-এ আপনি শিখেছেন যে একটি লিনিয়ার রিগ্রেশন অনুশীলনের লক্ষ্য হল একটি লাইন প্লট করা যা:
+
+- **ভেরিয়েবল সম্পর্ক দেখায়**। ভেরিয়েবলের মধ্যে সম্পর্ক দেখায়।
+- **পূর্বাভাস দেয়**। একটি নতুন ডেটাপয়েন্ট এই লাইনের সাথে সম্পর্কিত কোথায় পড়বে তা সঠিকভাবে পূর্বাভাস দেয়।
+
+**লিস্ট-স্কোয়ার রিগ্রেশন** সাধারণত এই ধরণের লাইন আঁকতে ব্যবহৃত হয়। 'লিস্ট-স্কোয়ার' শব্দটি বোঝায় যে রিগ্রেশন লাইনের চারপাশের সমস্ত ডেটাপয়েন্ট স্কোয়ার করা হয় এবং তারপর যোগ করা হয়। আদর্শভাবে, এই চূড়ান্ত যোগফল যতটা সম্ভব ছোট হওয়া উচিত, কারণ আমরা কম সংখ্যক ত্রুটি বা `লিস্ট-স্কোয়ার` চাই।
+
+আমরা এটি করি কারণ আমরা এমন একটি লাইন মডেল করতে চাই যার সমস্ত ডেটাপয়েন্ট থেকে সর্বনিম্ন সামগ্রিক দূরত্ব থাকে। আমরা টার্মগুলিকে যোগ করার আগে স্কোয়ার করি কারণ আমরা এর দিকের চেয়ে এর মাত্রা নিয়ে বেশি উদ্বিগ্ন।
+
+> **🧮 আমাকে গণিত দেখান**
+>
+> এই লাইন, যা _সেরা ফিটের লাইন_ নামে পরিচিত, [একটি সমীকরণ](https://en.wikipedia.org/wiki/Simple_linear_regression) দ্বারা প্রকাশ করা যেতে পারে:
+>
+> ```
+> Y = a + bX
+> ```
+>
+> `X` হল 'ব্যাখ্যামূলক ভেরিয়েবল'। `Y` হল 'নির্ভরশীল ভেরিয়েবল'। লাইনের ঢাল হল `b` এবং `a` হল y-ইন্টারসেপ্ট, যা বোঝায় `X = 0` হলে `Y` এর মান।
+>
+>
+>
+> প্রথমে, ঢাল `b` গণনা করুন। ইনফোগ্রাফিক: [জেন লুপার](https://twitter.com/jenlooper)
+>
+> অন্য কথায়, এবং আমাদের কুমড়ার ডেটার মূল প্রশ্নের দিকে ইঙ্গিত করে: "মাস অনুযায়ী প্রতি বাসেলে কুমড়ার দাম পূর্বাভাস দিন", `X` দাম বোঝাবে এবং `Y` বিক্রয়ের মাস বোঝাবে।
+>
+>
+>
+> `Y` এর মান গণনা করুন। যদি আপনি প্রায় $৪ দিচ্ছেন, তবে এটি অবশ্যই এপ্রিল! ইনফোগ্রাফিক: [জেন লুপার](https://twitter.com/jenlooper)
+>
+> লাইনের ঢাল গণনা করার জন্য যে গণিত প্রয়োজন তা ইন্টারসেপ্টের উপরও নির্ভরশীল, বা যেখানে `X = 0` হলে `Y` অবস্থিত।
+>
+> এই মানগুলির গণনার পদ্ধতি [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) ওয়েবসাইটে পর্যবেক্ষণ করতে পারেন। এছাড়াও [এই লিস্ট-স্কোয়ার ক্যালকুলেটর](https://www.mathsisfun.com/data/least-squares-calculator.html) দেখুন যাতে সংখ্যার মানগুলি লাইনে কীভাবে প্রভাব ফেলে তা দেখতে পারেন।
+
+## সহসম্পর্ক
+
+আরেকটি গুরুত্বপূর্ণ শব্দ হল **সহসম্পর্ক সহগ** যা প্রদত্ত X এবং Y ভেরিয়েবলের মধ্যে সম্পর্ক বোঝায়। একটি স্ক্যাটারপ্লট ব্যবহার করে আপনি দ্রুত এই সহগটি ভিজুয়ালাইজ করতে পারেন। একটি প্লটে যদি ডেটাপয়েন্টগুলি একটি সুশৃঙ্খল লাইনে থাকে তবে উচ্চ সহসম্পর্ক থাকে, কিন্তু যদি ডেটাপয়েন্টগুলি X এবং Y এর মধ্যে এলোমেলোভাবে ছড়িয়ে থাকে তবে নিম্ন সহসম্পর্ক থাকে।
+
+একটি ভাল লিনিয়ার রিগ্রেশন মডেল হবে এমন একটি যা লিস্ট-স্কোয়ার রিগ্রেশন পদ্ধতি ব্যবহার করে একটি রিগ্রেশন লাইনের সাথে উচ্চ (১ এর কাছাকাছি) সহসম্পর্ক সহগ রাখে।
+
+✅ এই পাঠের সাথে থাকা নোটবুক চালান এবং মাস থেকে দামের স্ক্যাটারপ্লট দেখুন। কুমড়া বিক্রির জন্য মাস থেকে দামের ডেটা কি আপনার ভিজুয়াল ব্যাখ্যা অনুযায়ী উচ্চ বা নিম্ন সহসম্পর্ক দেখায়? যদি আপনি `Month` এর পরিবর্তে আরও সূক্ষ্ম পরিমাপ ব্যবহার করেন, যেমন *বছরের দিন* (অর্থাৎ বছরের শুরু থেকে দিন সংখ্যা), তবে কি এটি পরিবর্তিত হয়?
+
+নিচের কোডে, আমরা ধরে নেব যে আমরা ডেটা পরিষ্কার করেছি এবং একটি ডেটা ফ্রেম পেয়েছি যার নাম `new_pumpkins`, যা নিম্নলিখিতের মতো:
+
+ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price
+---|-------|-----------|---------|------|---------|-----------|------------|-------
+70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
+71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
+72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
+73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
+74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
+
+> ডেটা পরিষ্কার করার কোড [`notebook.ipynb`](notebook.ipynb)-এ উপলব্ধ। আমরা পূর্ববর্তী পাঠের মতো একই পরিষ্কার করার ধাপগুলি সম্পন্ন করেছি এবং নিম্নলিখিত এক্সপ্রেশন ব্যবহার করে `DayOfYear` কলাম গণনা করেছি:
+
+```python
+day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
+```
+
+এখন যেহেতু আপনি লিনিয়ার রিগ্রেশনের পেছনের গণিত সম্পর্কে একটি ধারণা পেয়েছেন, আসুন একটি রিগ্রেশন মডেল তৈরি করি এবং দেখি কোন কুমড়ার প্যাকেজের দাম সবচেয়ে ভালো হবে তা পূর্বাভাস দেওয়া যায় কিনা। ছুটির দিনগুলির জন্য একটি কুমড়ার প্যাচ কিনতে আগ্রহী কেউ এই তথ্যটি ব্যবহার করতে পারে তাদের কুমড়ার প্যাকেজ কেনার জন্য অপ্টিমাইজ করতে।
+
+## সহসম্পর্ক খোঁজা
+
+[](https://youtu.be/uoRq-lW2eQo "শিক্ষার্থীদের জন্য মেশিন লার্নিং - সহসম্পর্ক খোঁজা: লিনিয়ার রিগ্রেশনের চাবিকাঠি")
+
+> 🎥 উপরের ছবিতে ক্লিক করে সহসম্পর্ক সম্পর্কে একটি সংক্ষিপ্ত ভিডিও দেখুন।
+
+পূর্ববর্তী পাঠ থেকে আপনি সম্ভবত দেখেছেন যে বিভিন্ন মাসের জন্য গড় দাম এই রকম দেখায়:
+
+
+
+এটি নির্দেশ করে যে কিছু সহসম্পর্ক থাকতে পারে, এবং আমরা `Month` এবং `Price` এর মধ্যে সম্পর্ক বা `DayOfYear` এবং `Price` এর মধ্যে সম্পর্ক পূর্বাভাস দেওয়ার জন্য একটি লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দেওয়ার চেষ্টা করতে পারি। এখানে একটি স্ক্যাটারপ্লট রয়েছে যা দ্বিতীয় সম্পর্কটি দেখায়:
+
+
+
+আসুন `corr` ফাংশন ব্যবহার করে দেখি সহসম্পর্ক আছে কিনা:
+
+```python
+print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
+print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
+```
+
+এটি মনে হচ্ছে সহসম্পর্ক খুবই ছোট, `Month` অনুযায়ী -0.15 এবং `DayOfYear` অনুযায়ী -0.17, তবে অন্য একটি গুরুত্বপূর্ণ সম্পর্ক থাকতে পারে। মনে হচ্ছে বিভিন্ন কুমড়ার প্রকারভেদের সাথে সম্পর্কিত বিভিন্ন দামের ক্লাস্টার রয়েছে। এই অনুমানটি নিশ্চিত করতে, আসুন প্রতিটি কুমড়ার ক্যাটাগরি একটি ভিন্ন রঙ ব্যবহার করে প্লট করি। `scatter` প্লটিং ফাংশনে একটি `ax` প্যারামিটার পাস করে আমরা সমস্ত পয়েন্ট একই গ্রাফে প্লট করতে পারি:
+
+```python
+ax=None
+colors = ['red','blue','green','yellow']
+for i,var in enumerate(new_pumpkins['Variety'].unique()):
+ df = new_pumpkins[new_pumpkins['Variety']==var]
+ ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
+```
+
+
+
+আমাদের তদন্ত নির্দেশ করে যে বিক্রির তারিখের চেয়ে প্রকারভেদ সামগ্রিক দামের উপর বেশি প্রভাব ফেলে। আমরা এটি একটি বার গ্রাফ দিয়ে দেখতে পারি:
+
+```python
+new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
+```
+
+
+
+চলুন আপাতত শুধুমাত্র একটি কুমড়ার প্রকারভেদ, 'পাই টাইপ', এর উপর মনোযোগ দিই এবং দেখি তারিখের দামের উপর কী প্রভাব পড়ে:
+
+```python
+pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
+pie_pumpkins.plot.scatter('DayOfYear','Price')
+```
+
+
+যদি আমরা এখন `corr` ফাংশন ব্যবহার করে `Price` এবং `DayOfYear` এর মধ্যে সহসম্পর্ক গণনা করি, আমরা প্রায় `-0.27` পাব - যা নির্দেশ করে যে একটি পূর্বাভাসমূলক মডেল প্রশিক্ষণ দেওয়া যৌক্তিক।
+
+> একটি লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দেওয়ার আগে, আমাদের ডেটা পরিষ্কার করা নিশ্চিত করা গুরুত্বপূর্ণ। লিনিয়ার রিগ্রেশন অনুপস্থিত মানগুলির সাথে ভাল কাজ করে না, তাই সমস্ত খালি সেল বাদ দেওয়া যৌক্তিক:
+
+```python
+pie_pumpkins.dropna(inplace=True)
+pie_pumpkins.info()
+```
+
+অন্য একটি পদ্ধতি হতে পারে খালি মানগুলি সংশ্লিষ্ট কলামের গড় মান দিয়ে পূরণ করা।
+
+## সহজ লিনিয়ার রিগ্রেশন
+
+[](https://youtu.be/e4c_UP2fSjg "শিক্ষার্থীদের জন্য মেশিন লার্নিং - স্কিকিট-লার্ন ব্যবহার করে লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন")
+
+> 🎥 উপরের ছবিতে ক্লিক করে লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন সম্পর্কে একটি সংক্ষিপ্ত ভিডিও দেখুন।
+
+আমাদের লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দেওয়ার জন্য, আমরা **স্কিকিট-লার্ন** লাইব্রেরি ব্যবহার করব।
+
+```python
+from sklearn.linear_model import LinearRegression
+from sklearn.metrics import mean_squared_error
+from sklearn.model_selection import train_test_split
+```
+
+আমরা ইনপুট মান (ফিচার) এবং প্রত্যাশিত আউটপুট (লেবেল) পৃথক নাম্পাই অ্যারেতে ভাগ করে শুরু করি:
+
+```python
+X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
+y = pie_pumpkins['Price']
+```
+
+> লক্ষ্য করুন যে আমরা ইনপুট ডেটার উপর `reshape` প্রয়োগ করতে হয়েছিল যাতে লিনিয়ার রিগ্রেশন প্যাকেজ এটি সঠিকভাবে বুঝতে পারে। লিনিয়ার রিগ্রেশন একটি 2D-অ্যারে ইনপুট হিসাবে প্রত্যাশা করে, যেখানে অ্যারেটির প্রতিটি সারি ইনপুট ফিচারের একটি ভেক্টরের সাথে সম্পর্কিত। আমাদের ক্ষেত্রে, যেহেতু আমাদের শুধুমাত্র একটি ইনপুট রয়েছে - আমাদের একটি N×1 আকৃতির অ্যারে প্রয়োজন, যেখানে N হল ডেটাসেটের আকার।
+
+তারপর, আমরা ডেটাকে প্রশিক্ষণ এবং পরীক্ষা ডেটাসেটে ভাগ করি, যাতে প্রশিক্ষণের পরে আমাদের মডেলটি যাচাই করতে পারি:
+
+```python
+X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
+```
+
+অবশেষে, প্রকৃত লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দেওয়া মাত্র দুটি লাইনের কোডে সম্পন্ন হয়। আমরা `LinearRegression` অবজেক্টটি সংজ্ঞায়িত করি এবং `fit` পদ্ধতি ব্যবহার করে এটি আমাদের ডেটার সাথে ফিট করি:
+
+```python
+lin_reg = LinearRegression()
+lin_reg.fit(X_train,y_train)
+```
+
+`LinearRegression` অবজেক্টটি `fit` করার পরে সমস্ত রিগ্রেশনের সহগ ধারণ করে, যা `.coef_` প্রপার্টি ব্যবহার করে অ্যাক্সেস করা যায়। আমাদের ক্ষেত্রে, এখানে মাত্র একটি সহগ রয়েছে, যা প্রায় `-0.017` হওয়া উচিত। এটি বোঝায় যে সময়ের সাথে দাম কিছুটা কমে যায়, তবে খুব বেশি নয়, প্রতিদিন প্রায় ২ সেন্ট। আমরা `lin_reg.intercept_` ব্যবহার করে রিগ্রেশনের Y-অক্ষের সাথে ছেদ বিন্দুটিও অ্যাক্সেস করতে পারি - এটি আমাদের ক্ষেত্রে প্রায় `21` হবে, যা বছরের শুরুতে দামের ইঙ্গিত দেয়।
+
+আমাদের মডেলটি কতটা সঠিক তা দেখতে, আমরা একটি টেস্ট ডেটাসেটে দাম পূর্বাভাস দিতে পারি এবং তারপর প্রত্যাশিত এবং পূর্বাভাসিত মানের মধ্যে পার্থক্য কতটা কাছাকাছি তা পরিমাপ করতে পারি। এটি গড় বর্গ ত্রুটি (MSE) মেট্রিক্স ব্যবহার করে করা যেতে পারে, যা প্রত্যাশিত এবং পূর্বাভাসিত মানের মধ্যে সমস্ত বর্গ পার্থক্যের গড়।
+
+```python
+pred = lin_reg.predict(X_test)
+
+mse = np.sqrt(mean_squared_error(y_test,pred))
+print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
+```
+আমাদের ত্রুটি প্রায় ২টি পয়েন্টের আশেপাশে, যা ~১৭%। খুব ভালো নয়। মডেলের গুণমানের আরেকটি সূচক হলো **coefficient of determination**, যা এইভাবে পাওয়া যায়:
+
+```python
+score = lin_reg.score(X_train,y_train)
+print('Model determination: ', score)
+```
+যদি মান ০ হয়, তাহলে এর অর্থ মডেল ইনপুট ডেটাকে বিবেচনা করে না এবং *সবচেয়ে খারাপ লিনিয়ার প্রেডিক্টর* হিসেবে কাজ করে, যা কেবলমাত্র ফলাফলের গড় মান। মান ১ হলে আমরা সমস্ত প্রত্যাশিত আউটপুট নিখুঁতভাবে পূর্বাভাস দিতে পারি। আমাদের ক্ষেত্রে, coefficient প্রায় ০.০৬, যা বেশ কম।
+
+আমরা পরীক্ষার ডেটা এবং রিগ্রেশন লাইনের সাথে একটি গ্রাফ আঁকতে পারি, যাতে আমাদের ক্ষেত্রে রিগ্রেশন কীভাবে কাজ করছে তা আরও ভালোভাবে দেখা যায়:
+
+```python
+plt.scatter(X_test,y_test)
+plt.plot(X_test,pred)
+```
+
+
+
+## পলিনোমিয়াল রিগ্রেশন
+
+লিনিয়ার রিগ্রেশনের আরেকটি ধরন হলো পলিনোমিয়াল রিগ্রেশন। কখনও কখনও ভেরিয়েবলগুলোর মধ্যে একটি লিনিয়ার সম্পর্ক থাকে - যেমন কুমড়ার আয়তন যত বড়, দাম তত বেশি - কিন্তু কখনও কখনও এই সম্পর্কগুলোকে একটি সমতল বা সরল রেখা হিসেবে চিত্রিত করা যায় না।
+
+✅ এখানে [আরও কিছু উদাহরণ](https://online.stat.psu.edu/stat501/lesson/9/9.8) রয়েছে, যেখানে পলিনোমিয়াল রিগ্রেশন ব্যবহার করা যেতে পারে।
+
+Date এবং Price-এর মধ্যে সম্পর্ক আবার দেখুন। এই scatterplot কি সরল রেখা দিয়ে বিশ্লেষণ করা উচিত বলে মনে হয়? দাম কি ওঠানামা করতে পারে না? এই ক্ষেত্রে, আপনি পলিনোমিয়াল রিগ্রেশন চেষ্টা করতে পারেন।
+
+✅ পলিনোমিয়াল হলো গাণিতিক প্রকাশ, যা এক বা একাধিক ভেরিয়েবল এবং coefficients নিয়ে গঠিত হতে পারে।
+
+পলিনোমিয়াল রিগ্রেশন একটি বাঁকা রেখা তৈরি করে, যা nonlinear ডেটার সাথে আরও ভালোভাবে মানানসই হয়। আমাদের ক্ষেত্রে, যদি আমরা ইনপুট ডেটায় একটি বর্গাকার `DayOfYear` ভেরিয়েবল অন্তর্ভুক্ত করি, তাহলে আমরা একটি parabolic curve দিয়ে আমাদের ডেটা ফিট করতে পারব, যার একটি নির্দিষ্ট সময়ে সর্বনিম্ন মান থাকবে।
+
+Scikit-learn একটি সহায়ক [pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) অন্তর্ভুক্ত করে, যা ডেটা প্রসেসিংয়ের বিভিন্ন ধাপ একসাথে সংযুক্ত করতে সাহায্য করে। একটি **pipeline** হলো **estimators**-এর একটি চেইন। আমাদের ক্ষেত্রে, আমরা একটি pipeline তৈরি করব, যা প্রথমে আমাদের মডেলে পলিনোমিয়াল ফিচার যোগ করবে এবং তারপর রিগ্রেশন প্রশিক্ষণ দেবে:
+
+```python
+from sklearn.preprocessing import PolynomialFeatures
+from sklearn.pipeline import make_pipeline
+
+pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
+
+pipeline.fit(X_train,y_train)
+```
+
+`PolynomialFeatures(2)` ব্যবহার করার অর্থ হলো আমরা ইনপুট ডেটা থেকে সমস্ত দ্বিতীয়-ডিগ্রি পলিনোমিয়াল অন্তর্ভুক্ত করব। আমাদের ক্ষেত্রে এটি কেবল `DayOfYear`2 হবে, কিন্তু দুটি ইনপুট ভেরিয়েবল X এবং Y দেওয়া হলে এটি X2, XY এবং Y2 যোগ করবে। আমরা চাইলে আরও উচ্চ-ডিগ্রি পলিনোমিয়াল ব্যবহার করতে পারি।
+
+Pipeline-গুলোকে মূল `LinearRegression` অবজেক্টের মতোই ব্যবহার করা যায়, অর্থাৎ আমরা pipeline-কে `fit` করতে পারি এবং তারপর `predict` ব্যবহার করে পূর্বাভাসের ফলাফল পেতে পারি। এখানে পরীক্ষার ডেটা এবং approximation curve দেখানো হয়েছে:
+
+
+
+পলিনোমিয়াল রিগ্রেশন ব্যবহার করে আমরা সামান্য কম MSE এবং বেশি determination পেতে পারি, কিন্তু খুব বেশি নয়। আমাদের অন্যান্য ফিচার বিবেচনা করতে হবে!
+
+> আপনি দেখতে পাচ্ছেন যে Halloween-এর আশেপাশে কুমড়ার সর্বনিম্ন দাম দেখা যায়। আপনি এটি কীভাবে ব্যাখ্যা করবেন?
+
+🎃 অভিনন্দন, আপনি একটি মডেল তৈরি করেছেন, যা পাই কুমড়ার দাম পূর্বাভাস দিতে সাহায্য করতে পারে। আপনি সম্ভবত একই পদ্ধতি সমস্ত কুমড়ার ধরনগুলোর জন্য পুনরাবৃত্তি করতে পারেন, কিন্তু এটি বেশ ক্লান্তিকর হবে। এখন চলুন শিখি কীভাবে আমাদের মডেলে কুমড়ার বৈচিত্র্যকে বিবেচনায় নেওয়া যায়!
+
+## ক্যাটেগরিকাল ফিচার
+
+আদর্শ ক্ষেত্রে, আমরা চাই একই মডেল ব্যবহার করে বিভিন্ন কুমড়ার ধরনগুলোর দাম পূর্বাভাস দিতে সক্ষম হতে। তবে, `Variety` কলামটি `Month`-এর মতো নয়, কারণ এটি non-numeric মান ধারণ করে। এই ধরনের কলামগুলোকে **categorical** বলা হয়।
+
+[](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন ক্যাটেগরিকাল ফিচার ব্যবহার সম্পর্কে একটি সংক্ষিপ্ত ভিডিও দেখার জন্য।
+
+এখানে আপনি দেখতে পাচ্ছেন কীভাবে গড় দাম বৈচিত্র্যের উপর নির্ভর করে:
+
+
+
+বৈচিত্র্যকে বিবেচনায় নিতে, প্রথমে এটি numeric আকারে রূপান্তর করতে হবে, বা **encode** করতে হবে। এটি করার কয়েকটি উপায় রয়েছে:
+
+* সাধারণ **numeric encoding** একটি টেবিল তৈরি করবে, যেখানে বিভিন্ন বৈচিত্র্য থাকবে এবং তারপর বৈচিত্র্যের নামকে সেই টেবিলের একটি সূচকে প্রতিস্থাপন করবে। এটি লিনিয়ার রিগ্রেশনের জন্য সেরা ধারণা নয়, কারণ লিনিয়ার রিগ্রেশন সূচকের প্রকৃত সংখ্যাসূচক মান গ্রহণ করে এবং এটি ফলাফলে যোগ করে, কিছু coefficient দ্বারা গুণ করে। আমাদের ক্ষেত্রে, সূচক নম্বর এবং দামের মধ্যে সম্পর্ক স্পষ্টতই non-linear, এমনকি যদি আমরা নিশ্চিত করি যে সূচকগুলো নির্দিষ্টভাবে সাজানো হয়েছে।
+* **One-hot encoding** `Variety` কলামটিকে ৪টি ভিন্ন কলামে প্রতিস্থাপন করবে, প্রতিটি বৈচিত্র্যের জন্য একটি। প্রতিটি কলামে `1` থাকবে যদি সংশ্লিষ্ট সারিটি একটি নির্দিষ্ট বৈচিত্র্যের হয়, অন্যথায় `0` থাকবে। এর অর্থ হলো লিনিয়ার রিগ্রেশনে ৪টি coefficient থাকবে, প্রতিটি কুমড়ার বৈচিত্র্যের জন্য একটি, যা সেই নির্দিষ্ট বৈচিত্র্যের জন্য "starting price" (বা বরং "additional price") নির্ধারণ করবে।
+
+নিচের কোডটি দেখায় কীভাবে আমরা একটি বৈচিত্র্যকে one-hot encode করতে পারি:
+
+```python
+pd.get_dummies(new_pumpkins['Variety'])
+```
+
+ ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE
+----|-----------|-----------|--------------------------|----------
+70 | 0 | 0 | 0 | 1
+71 | 0 | 0 | 0 | 1
+... | ... | ... | ... | ...
+1738 | 0 | 1 | 0 | 0
+1739 | 0 | 1 | 0 | 0
+1740 | 0 | 1 | 0 | 0
+1741 | 0 | 1 | 0 | 0
+1742 | 0 | 1 | 0 | 0
+
+One-hot encoded বৈচিত্র্যকে ইনপুট হিসেবে ব্যবহার করে লিনিয়ার রিগ্রেশন প্রশিক্ষণ দিতে, আমাদের কেবল `X` এবং `y` ডেটা সঠিকভাবে initialize করতে হবে:
+
+```python
+X = pd.get_dummies(new_pumpkins['Variety'])
+y = new_pumpkins['Price']
+```
+
+বাকি কোডটি উপরে ব্যবহৃত লিনিয়ার রিগ্রেশন প্রশিক্ষণের কোডের মতোই। যদি আপনি এটি চেষ্টা করেন, আপনি দেখতে পাবেন যে গড় স্কোয়ার্ড ত্রুটি প্রায় একই, কিন্তু আমরা অনেক বেশি coefficient of determination (~৭৭%) পাই। আরও সঠিক পূর্বাভাস পেতে, আমরা আরও ক্যাটেগরিকাল ফিচার এবং সংখ্যাসূচক ফিচার যেমন `Month` বা `DayOfYear` বিবেচনা করতে পারি। একটি বড় ফিচার array পেতে, আমরা `join` ব্যবহার করতে পারি:
+
+```python
+X = pd.get_dummies(new_pumpkins['Variety']) \
+ .join(new_pumpkins['Month']) \
+ .join(pd.get_dummies(new_pumpkins['City'])) \
+ .join(pd.get_dummies(new_pumpkins['Package']))
+y = new_pumpkins['Price']
+```
+
+এখানে আমরা `City` এবং `Package` টাইপকেও বিবেচনায় নিয়েছি, যা আমাদের MSE ২.৮৪ (১০%) এবং determination ০.৯৪ দেয়!
+
+## সবকিছু একত্রিত করা
+
+সেরা মডেল তৈরি করতে, আমরা উপরের উদাহরণ থেকে পলিনোমিয়াল রিগ্রেশনের সাথে একত্রিত (one-hot encoded ক্যাটেগরিকাল + সংখ্যাসূচক) ডেটা ব্যবহার করতে পারি। আপনার সুবিধার জন্য এখানে সম্পূর্ণ কোড দেওয়া হলো:
+
+```python
+# set up training data
+X = pd.get_dummies(new_pumpkins['Variety']) \
+ .join(new_pumpkins['Month']) \
+ .join(pd.get_dummies(new_pumpkins['City'])) \
+ .join(pd.get_dummies(new_pumpkins['Package']))
+y = new_pumpkins['Price']
+
+# make train-test split
+X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
+
+# setup and train the pipeline
+pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
+pipeline.fit(X_train,y_train)
+
+# predict results for test data
+pred = pipeline.predict(X_test)
+
+# calculate MSE and determination
+mse = np.sqrt(mean_squared_error(y_test,pred))
+print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
+
+score = pipeline.score(X_train,y_train)
+print('Model determination: ', score)
+```
+
+এটি আমাদের প্রায় ৯৭% determination coefficient এবং MSE=২.২৩ (~৮% পূর্বাভাস ত্রুটি) দেবে।
+
+| Model | MSE | Determination |
+|-------|-----|---------------|
+| `DayOfYear` Linear | 2.77 (17.2%) | 0.07 |
+| `DayOfYear` Polynomial | 2.73 (17.0%) | 0.08 |
+| `Variety` Linear | 5.24 (19.7%) | 0.77 |
+| All features Linear | 2.84 (10.5%) | 0.94 |
+| All features Polynomial | 2.23 (8.25%) | 0.97 |
+
+🏆 অভিনন্দন! আপনি এক পাঠে চারটি রিগ্রেশন মডেল তৈরি করেছেন এবং মডেলের গুণমান ৯৭% পর্যন্ত উন্নত করেছেন। রিগ্রেশনের চূড়ান্ত অংশে, আপনি ক্যাটেগরি নির্ধারণের জন্য Logistic Regression সম্পর্কে শিখবেন।
+
+---
+## 🚀চ্যালেঞ্জ
+
+এই নোটবুকে বিভিন্ন ভেরিয়েবল পরীক্ষা করুন এবং দেখুন কীভাবে correlation মডেলের সঠিকতার সাথে সম্পর্কিত।
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+এই পাঠে আমরা লিনিয়ার রিগ্রেশন সম্পর্কে শিখেছি। রিগ্রেশনের আরও গুরুত্বপূর্ণ ধরন রয়েছে। Stepwise, Ridge, Lasso এবং Elasticnet কৌশল সম্পর্কে পড়ুন। আরও শেখার জন্য একটি ভালো কোর্স হলো [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)।
+
+## অ্যাসাইনমেন্ট
+
+[একটি মডেল তৈরি করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/3-Linear/assignment.md b/translations/bn/2-Regression/3-Linear/assignment.md
new file mode 100644
index 000000000..a39aa1f54
--- /dev/null
+++ b/translations/bn/2-Regression/3-Linear/assignment.md
@@ -0,0 +1,25 @@
+
+# একটি রিগ্রেশন মডেল তৈরি করুন
+
+## নির্দেশনা
+
+এই পাঠে আপনাকে দেখানো হয়েছে কীভাবে লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন ব্যবহার করে একটি মডেল তৈরি করতে হয়। এই জ্ঞান ব্যবহার করে একটি ডেটাসেট খুঁজুন বা Scikit-learn-এর বিল্ট-ইন সেটগুলির একটি ব্যবহার করে একটি নতুন মডেল তৈরি করুন। আপনার নোটবুকে ব্যাখ্যা করুন কেন আপনি যে পদ্ধতিটি বেছে নিয়েছেন তা করেছেন এবং আপনার মডেলের সঠিকতা প্রদর্শন করুন। যদি এটি সঠিক না হয়, তবে ব্যাখ্যা করুন কেন।
+
+## মূল্যায়ন
+
+| মানদণ্ড | চমৎকারভাবে উপস্থাপিত | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ---------------------------------------------------------- | -------------------------- | ------------------------------- |
+| | একটি সম্পূর্ণ নোটবুক উপস্থাপন করে যেখানে সমাধানটি ভালোভাবে নথিভুক্ত | সমাধানটি অসম্পূর্ণ | সমাধানটি ত্রুটিপূর্ণ বা বাগযুক্ত |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/3-Linear/notebook.ipynb b/translations/bn/2-Regression/3-Linear/notebook.ipynb
new file mode 100644
index 000000000..5654ef166
--- /dev/null
+++ b/translations/bn/2-Regression/3-Linear/notebook.ipynb
@@ -0,0 +1,128 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## কুমড়ার মূল্য নির্ধারণ\n",
+ "\n",
+ "প্রয়োজনীয় লাইব্রেরি এবং ডেটাসেট লোড করুন। ডেটাকে একটি ডেটাফ্রেমে রূপান্তর করুন যা ডেটার একটি অংশ ধারণ করে:\n",
+ "\n",
+ "- শুধুমাত্র সেই কুমড়াগুলো নিন যেগুলোর মূল্য বাসেল অনুযায়ী নির্ধারিত\n",
+ "- তারিখকে মাসে রূপান্তর করুন\n",
+ "- উচ্চ এবং নিম্ন মূল্যের গড় হিসাব করে মূল্য নির্ধারণ করুন\n",
+ "- বাসেল পরিমাণ অনুযায়ী মূল্যকে রূপান্তর করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from datetime import datetime\n",
+ "\n",
+ "pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
+ "\n",
+ "pumpkins.head()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
+ "\n",
+ "columns_to_select = ['Package', 'Variety', 'City Name', 'Low Price', 'High Price', 'Date']\n",
+ "pumpkins = pumpkins.loc[:, columns_to_select]\n",
+ "\n",
+ "price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2\n",
+ "\n",
+ "month = pd.DatetimeIndex(pumpkins['Date']).month\n",
+ "day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)\n",
+ "\n",
+ "new_pumpkins = pd.DataFrame(\n",
+ " {'Month': month, \n",
+ " 'DayOfYear' : day_of_year, \n",
+ " 'Variety': pumpkins['Variety'], \n",
+ " 'City': pumpkins['City Name'], \n",
+ " 'Package': pumpkins['Package'], \n",
+ " 'Low Price': pumpkins['Low Price'],\n",
+ " 'High Price': pumpkins['High Price'], \n",
+ " 'Price': price})\n",
+ "\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/1.1\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price*2\n",
+ "\n",
+ "new_pumpkins.head()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "একটি সাধারণ স্ক্যাটারপ্লট আমাদের মনে করিয়ে দেয় যে আমাদের কাছে শুধুমাত্র আগস্ট থেকে ডিসেম্বর পর্যন্ত মাসের ডেটা রয়েছে। সম্ভবত আমাদের আরও ডেটা প্রয়োজন যাতে আমরা একটি সরলরৈখিক পদ্ধতিতে সিদ্ধান্ত নিতে পারি।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "plt.scatter('Month','Price',data=new_pumpkins)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "plt.scatter('DayOfYear','Price',data=new_pumpkins)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.3-final"
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "b032d371c75279373507f003439a577e",
+ "translation_date": "2025-08-29T22:45:08+00:00",
+ "source_file": "2-Regression/3-Linear/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/3-Linear/solution/Julia/README.md b/translations/bn/2-Regression/3-Linear/solution/Julia/README.md
new file mode 100644
index 000000000..b94157447
--- /dev/null
+++ b/translations/bn/2-Regression/3-Linear/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**দাবিত্যাগ**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/3-Linear/solution/R/lesson_3-R.ipynb b/translations/bn/2-Regression/3-Linear/solution/R/lesson_3-R.ipynb
new file mode 100644
index 000000000..9725812e1
--- /dev/null
+++ b/translations/bn/2-Regression/3-Linear/solution/R/lesson_3-R.ipynb
@@ -0,0 +1,1080 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "metadata": {
+ "colab": {
+ "name": "lesson_3-R.ipynb",
+ "provenance": [],
+ "collapsed_sections": [],
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "name": "ir",
+ "display_name": "R"
+ },
+ "language_info": {
+ "name": "R"
+ },
+ "coopTranslator": {
+ "original_hash": "5015d65d61ba75a223bfc56c273aa174",
+ "translation_date": "2025-08-29T22:50:00+00:00",
+ "source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# একটি রিগ্রেশন মডেল তৈরি করুন: লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন মডেল\n"
+ ],
+ "metadata": {
+ "id": "EgQw8osnsUV-"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## কুমড়ার মূল্য নির্ধারণের জন্য লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন - পাঠ ৩\n",
+ "
\n",
+ " \n",
+ " ইনফোগ্রাফিক: দাসানি মাদিপল্লি\n",
+ "\n",
+ "\n",
+ "#### ভূমিকা\n",
+ "\n",
+ "এখন পর্যন্ত আপনি রিগ্রেশন কী তা নিয়ে আলোচনা করেছেন, উদাহরণস্বরূপ কুমড়ার মূল্য নির্ধারণের ডেটাসেট থেকে সংগৃহীত ডেটা ব্যবহার করে যা আমরা এই পাঠে ব্যবহার করব। আপনি এটি `ggplot2` ব্যবহার করে ভিজুয়ালাইজও করেছেন।💪\n",
+ "\n",
+ "এখন আপনি মেশিন লার্নিংয়ের জন্য রিগ্রেশন নিয়ে আরও গভীরে যাওয়ার জন্য প্রস্তুত। এই পাঠে, আপনি দুটি ধরণের রিগ্রেশন সম্পর্কে শিখবেন: *বেসিক লিনিয়ার রিগ্রেশন* এবং *পলিনোমিয়াল রিগ্রেশন*, এবং এই পদ্ধতিগুলোর পেছনের কিছু গণিত সম্পর্কেও জানবেন।\n",
+ "\n",
+ "> এই পাঠক্রমে, আমরা গণিতের ন্যূনতম জ্ঞান ধরে নিয়ে এগোই এবং অন্যান্য ক্ষেত্র থেকে আসা শিক্ষার্থীদের জন্য এটি সহজবোধ্য করার চেষ্টা করি। তাই নোট, 🧮 কলআউট, ডায়াগ্রাম এবং অন্যান্য শিক্ষণ উপকরণগুলোর দিকে নজর রাখুন যা বুঝতে সাহায্য করবে।\n",
+ "\n",
+ "#### প্রস্তুতি\n",
+ "\n",
+ "স্মরণ করিয়ে দেওয়া হচ্ছে, আপনি এই ডেটা লোড করছেন যাতে এর উপর প্রশ্ন করতে পারেন।\n",
+ "\n",
+ "- কুমড়া কেনার সেরা সময় কখন?\n",
+ "\n",
+ "- ক্ষুদ্রাকৃতির কুমড়ার একটি কেসের মূল্য কত হতে পারে?\n",
+ "\n",
+ "- আমি কি এগুলো আধা-বাস্কেট ঝুড়িতে কিনব নাকি ১ ১/৯ বাস্কেট বাক্সে? চলুন এই ডেটা নিয়ে আরও গভীরে যাই।\n",
+ "\n",
+ "পূর্ববর্তী পাঠে, আপনি একটি `tibble` (ডেটা ফ্রেমের আধুনিক সংস্করণ) তৈরি করেছিলেন এবং মূল ডেটাসেটের অংশ দিয়ে এটি পূরণ করেছিলেন, বাস্কেট অনুযায়ী মূল্য নির্ধারণ করে। তবে, এর মাধ্যমে আপনি মাত্র ৪০০টি ডেটা পয়েন্ট সংগ্রহ করতে পেরেছিলেন এবং শুধুমাত্র শরৎকালের মাসগুলোর জন্য। হয়তো আমরা ডেটা আরও পরিষ্কার করে এর প্রকৃতি সম্পর্কে আরও বিস্তারিত জানতে পারি? দেখা যাক... 🕵️♀️\n",
+ "\n",
+ "এই কাজের জন্য আমাদের নিম্নলিখিত প্যাকেজগুলো প্রয়োজন হবে:\n",
+ "\n",
+ "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) হলো [R প্যাকেজের একটি সংগ্রহ](https://www.tidyverse.org/packages) যা ডেটা সায়েন্সকে দ্রুত, সহজ এবং আরও মজাদার করে তোলে!\n",
+ "\n",
+ "- `tidymodels`: [tidymodels](https://www.tidymodels.org/) ফ্রেমওয়ার্ক হলো [মডেলিং এবং মেশিন লার্নিংয়ের জন্য প্যাকেজের একটি সংগ্রহ](https://www.tidymodels.org/packages/)।\n",
+ "\n",
+ "- `janitor`: [janitor প্যাকেজ](https://github.com/sfirke/janitor) ডেটা পরীক্ষা এবং পরিষ্কার করার জন্য সহজ সরঞ্জাম সরবরাহ করে।\n",
+ "\n",
+ "- `corrplot`: [corrplot প্যাকেজ](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) একটি ভিজুয়াল এক্সপ্লোরেটরি টুল সরবরাহ করে যা ভেরিয়েবলগুলোর মধ্যে লুকানো প্যাটার্ন শনাক্ত করতে সহায়তা করে।\n",
+ "\n",
+ "আপনি এগুলো ইনস্টল করতে পারেন:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n",
+ "\n",
+ "নিচের স্ক্রিপ্টটি পরীক্ষা করে দেখবে যে এই মডিউল সম্পন্ন করার জন্য আপনার প্রয়োজনীয় প্যাকেজগুলো আছে কিনা এবং যদি না থাকে তবে সেগুলো ইনস্টল করবে।\n"
+ ],
+ "metadata": {
+ "id": "WqQPS1OAsg3H"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "suppressWarnings(if (!require(\"pacman\")) install.packages(\"pacman\"))\n",
+ "\n",
+ "pacman::p_load(tidyverse, tidymodels, janitor, corrplot)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "tA4C2WN3skCf",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "c06cd805-5534-4edc-f72b-d0d1dab96ac0"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আমরা পরে এই চমৎকার প্যাকেজগুলো লোড করব এবং আমাদের বর্তমান R সেশনে উপলব্ধ করব। (এটি শুধুমাত্র উদাহরণের জন্য, `pacman::p_load()` ইতিমধ্যেই এটি আপনার জন্য করেছে)\n",
+ "\n",
+ "## ১. একটি লিনিয়ার রিগ্রেশন লাইন\n",
+ "\n",
+ "লেসন ১-এ আপনি শিখেছেন, একটি লিনিয়ার রিগ্রেশন অনুশীলনের লক্ষ্য হলো একটি *সেরা ফিটের লাইন* আঁকা:\n",
+ "\n",
+ "- **ভেরিয়েবল সম্পর্ক দেখানো**। ভেরিয়েবলগুলোর মধ্যে সম্পর্ক প্রদর্শন করা।\n",
+ "\n",
+ "- **প্রেডিকশন করা**। নতুন ডেটা পয়েন্ট কোথায় পড়বে তা সঠিকভাবে পূর্বাভাস দেওয়া।\n",
+ "\n",
+ "এই ধরনের লাইন আঁকার জন্য আমরা একটি পরিসংখ্যানিক কৌশল ব্যবহার করি, যাকে **লিস্ট-স্কোয়ার রিগ্রেশন** বলা হয়। `লিস্ট-স্কোয়ার` শব্দটি বোঝায় যে রিগ্রেশন লাইনের চারপাশের সমস্ত ডেটা পয়েন্ট স্কোয়ার করা হয় এবং তারপর যোগ করা হয়। আদর্শভাবে, সেই চূড়ান্ত যোগফল যতটা সম্ভব ছোট হওয়া উচিত, কারণ আমরা কম সংখ্যক ত্রুটি চাই, বা `লিস্ট-স্কোয়ার`। সুতরাং, সেরা ফিটের লাইন হলো সেই লাইন যা আমাদের স্কোয়ার ত্রুটিগুলোর যোগফলের জন্য সর্বনিম্ন মান দেয় - তাই নাম *লিস্ট-স্কোয়ার রিগ্রেশন*।\n",
+ "\n",
+ "আমরা এটি করি কারণ আমরা এমন একটি লাইন মডেল করতে চাই যা আমাদের সমস্ত ডেটা পয়েন্ট থেকে সর্বনিম্ন সামগ্রিক দূরত্ব রাখে। আমরা যোগ করার আগে টার্মগুলো স্কোয়ার করি কারণ আমরা এর দিকের চেয়ে এর মাত্রা নিয়ে বেশি চিন্তিত।\n",
+ "\n",
+ "> **🧮 আমাকে গণিত দেখাও**\n",
+ ">\n",
+ "> এই লাইন, যাকে *সেরা ফিটের লাইন* বলা হয়, [একটি সমীকরণ](https://en.wikipedia.org/wiki/Simple_linear_regression) দ্বারা প্রকাশ করা যেতে পারে:\n",
+ ">\n",
+ "> Y = a + bX\n",
+ ">\n",
+ "> `X` হলো '`ব্যাখ্যামূলক ভেরিয়েবল` বা `প্রেডিক্টর`'। `Y` হলো '`নির্ভরশীল ভেরিয়েবল` বা `ফলাফল`'। লাইনের ঢাল হলো `b` এবং `a` হলো y-ইন্টারসেপ্ট, যা `X = 0` হলে `Y` এর মানকে বোঝায়।\n",
+ ">\n",
+ "\n",
+ "> \n",
+ " জেন লুপারের ইনফোগ্রাফিক\n",
+ ">\n",
+ "> প্রথমে, ঢাল `b` গণনা করুন।\n",
+ ">\n",
+ "> অন্য কথায়, এবং আমাদের কুমড়ার ডেটার মূল প্রশ্নের দিকে ইঙ্গিত করে: \"মাস অনুযায়ী প্রতি বাসেল কুমড়ার দাম পূর্বাভাস দিন\", `X` দামকে বোঝাবে এবং `Y` বিক্রয়ের মাসকে বোঝাবে।\n",
+ ">\n",
+ "> \n",
+ " জেন লুপারের ইনফোগ্রাফিক\n",
+ "> \n",
+ "> `Y` এর মান গণনা করুন। যদি আপনি প্রায় \\$4 দিচ্ছেন, তবে এটি অবশ্যই এপ্রিল!\n",
+ ">\n",
+ "> লাইনের ঢাল গণনা করার জন্য যে গণিত ব্যবহার করা হয় তা ইন্টারসেপ্টের উপর নির্ভরশীল, বা যেখানে `X = 0` হলে `Y` অবস্থিত।\n",
+ ">\n",
+ "> এই মানগুলোর গণনার পদ্ধতি আপনি [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) ওয়েবসাইটে দেখতে পারেন। এছাড়াও [এই লিস্ট-স্কোয়ার ক্যালকুলেটর](https://www.mathsisfun.com/data/least-squares-calculator.html) দেখুন, যেখানে আপনি দেখতে পাবেন কীভাবে সংখ্যাগুলোর মান লাইনে প্রভাব ফেলে।\n",
+ "\n",
+ "ভয় পাওয়ার কিছু নেই, তাই না? 🤓\n",
+ "\n",
+ "#### করেলেশন\n",
+ "\n",
+ "আরেকটি গুরুত্বপূর্ণ শব্দ হলো **করেলেশন কোইফিসিয়েন্ট**, যা প্রদত্ত X এবং Y ভেরিয়েবলগুলোর মধ্যে সম্পর্ক বোঝায়। একটি স্ক্যাটারপ্লট ব্যবহার করে আপনি সহজেই এই কোইফিসিয়েন্টটি দেখতে পারেন। একটি প্লটে যদি ডেটাপয়েন্টগুলো একটি সুশৃঙ্খল লাইনে ছড়িয়ে থাকে, তবে করেলেশন বেশি থাকে। কিন্তু যদি ডেটাপয়েন্টগুলো X এবং Y এর মধ্যে এলোমেলোভাবে ছড়িয়ে থাকে, তবে করেলেশন কম থাকে।\n",
+ "\n",
+ "একটি ভালো লিনিয়ার রিগ্রেশন মডেল হবে এমন একটি মডেল যার করেলেশন কোইফিসিয়েন্ট উচ্চ (১ এর কাছাকাছি, ০ এর চেয়ে বেশি) থাকে, যা লিস্ট-স্কোয়ার রিগ্রেশন পদ্ধতি এবং একটি রিগ্রেশন লাইন ব্যবহার করে।\n"
+ ],
+ "metadata": {
+ "id": "cdX5FRpvsoP5"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## **২. ডেটার সাথে নৃত্য: একটি ডেটা ফ্রেম তৈরি করা যা মডেলিংয়ের জন্য ব্যবহৃত হবে**\n",
+ "\n",
+ "
\n",
+ " \n",
+ " চিত্রশিল্প: @allison_horst\n"
+ ],
+ "metadata": {
+ "id": "WdUKXk7Bs8-V"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "প্রয়োজনীয় লাইব্রেরি এবং ডেটাসেট লোড করুন। ডেটাকে একটি ডেটা ফ্রেমে রূপান্তর করুন যা ডেটার একটি অংশবিশেষ ধারণ করে:\n",
+ "\n",
+ "- শুধুমাত্র সেই কুমড়াগুলো নিন যেগুলোর দাম বাসেল অনুযায়ী নির্ধারিত\n",
+ "\n",
+ "- তারিখকে মাসে রূপান্তর করুন\n",
+ "\n",
+ "- দামের হিসাব উচ্চ এবং নিম্ন দামের গড় হিসেবে নির্ধারণ করুন\n",
+ "\n",
+ "- দামের হিসাব বাসেল পরিমাণ অনুযায়ী রূপান্তর করুন\n",
+ "\n",
+ "> আমরা এই ধাপগুলো [পূর্ববর্তী পাঠে](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/2-Data/solution/lesson_2-R.ipynb) আলোচনা করেছি।\n"
+ ],
+ "metadata": {
+ "id": "fMCtu2G2s-p8"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load the core Tidyverse packages\n",
+ "library(tidyverse)\n",
+ "library(lubridate)\n",
+ "\n",
+ "# Import the pumpkins data\n",
+ "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
+ "\n",
+ "\n",
+ "# Get a glimpse and dimensions of the data\n",
+ "glimpse(pumpkins)\n",
+ "\n",
+ "\n",
+ "# Print the first 50 rows of the data set\n",
+ "pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "ryMVZEEPtERn"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "শুদ্ধ অভিযানের চেতনায়, চলুন [`janitor package`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor) অন্বেষণ করি যা নোংরা ডেটা পরীক্ষা এবং পরিষ্কার করার জন্য সহজ ফাংশন সরবরাহ করে। উদাহরণস্বরূপ, চলুন আমাদের ডেটার কলামের নামগুলো দেখি:\n"
+ ],
+ "metadata": {
+ "id": "xcNxM70EtJjb"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Return column names\n",
+ "pumpkins %>% \n",
+ " names()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "5XtpaIigtPfW"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "🤔 আমরা আরও ভালো করতে পারি। চলুন এই কলাম নামগুলোকে `friendR` বানাই [snake_case](https://en.wikipedia.org/wiki/Snake_case) কনভেনশন ব্যবহার করে `janitor::clean_names` এর মাধ্যমে। এই ফাংশন সম্পর্কে আরও জানতে: `?clean_names`\n"
+ ],
+ "metadata": {
+ "id": "IbIqrMINtSHe"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Clean names to the snake_case convention\n",
+ "pumpkins <- pumpkins %>% \n",
+ " clean_names(case = \"snake\")\n",
+ "\n",
+ "# Return column names\n",
+ "pumpkins %>% \n",
+ " names()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "a2uYvclYtWvX"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "অনেক পরিষ্কার tidyR 🧹! এখন, আগের পাঠের মতো `dplyr` ব্যবহার করে ডেটার সাথে একটি নাচ! 💃\n"
+ ],
+ "metadata": {
+ "id": "HfhnuzDDtaDd"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Select desired columns\n",
+ "pumpkins <- pumpkins %>% \n",
+ " select(variety, city_name, package, low_price, high_price, date)\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Extract the month from the dates to a new column\n",
+ "pumpkins <- pumpkins %>%\n",
+ " mutate(date = mdy(date),\n",
+ " month = month(date)) %>% \n",
+ " select(-date)\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Create a new column for average Price\n",
+ "pumpkins <- pumpkins %>% \n",
+ " mutate(price = (low_price + high_price)/2)\n",
+ "\n",
+ "\n",
+ "# Retain only pumpkins with the string \"bushel\"\n",
+ "new_pumpkins <- pumpkins %>% \n",
+ " filter(str_detect(string = package, pattern = \"bushel\"))\n",
+ "\n",
+ "\n",
+ "# Normalize the pricing so that you show the pricing per bushel, not per 1 1/9 or 1/2 bushel\n",
+ "new_pumpkins <- new_pumpkins %>% \n",
+ " mutate(price = case_when(\n",
+ " str_detect(package, \"1 1/9\") ~ price/(1.1),\n",
+ " str_detect(package, \"1/2\") ~ price*2,\n",
+ " TRUE ~ price))\n",
+ "\n",
+ "# Relocate column positions\n",
+ "new_pumpkins <- new_pumpkins %>% \n",
+ " relocate(month, .before = variety)\n",
+ "\n",
+ "\n",
+ "# Display the first 5 rows\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "X0wU3gQvtd9f"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ভালো কাজ!👌 এখন আপনার কাছে একটি পরিষ্কার, সুশৃঙ্খল ডেটা সেট রয়েছে যার উপর আপনি আপনার নতুন রিগ্রেশন মডেল তৈরি করতে পারেন!\n",
+ "\n",
+ "একটি স্ক্যাটার প্লট দেখতে চান?\n"
+ ],
+ "metadata": {
+ "id": "UpaIwaxqth82"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Set theme\n",
+ "theme_set(theme_light())\n",
+ "\n",
+ "# Make a scatter plot of month and price\n",
+ "new_pumpkins %>% \n",
+ " ggplot(mapping = aes(x = month, y = price)) +\n",
+ " geom_point(size = 1.6)\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "DXgU-j37tl5K"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "একটি স্ক্যাটার প্লট আমাদের মনে করিয়ে দেয় যে আমাদের কাছে শুধুমাত্র আগস্ট থেকে ডিসেম্বর পর্যন্ত মাসের ডেটা রয়েছে। সম্ভবত আমাদের আরও ডেটা প্রয়োজন যাতে আমরা সরলরৈখিকভাবে উপসংহার টানতে পারি।\n",
+ "\n",
+ "আসুন আবার আমাদের মডেলিং ডেটা দেখে নিই:\n"
+ ],
+ "metadata": {
+ "id": "Ve64wVbwtobI"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Display first 5 rows\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "HFQX2ng1tuSJ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আমরা যদি `city` বা `package` কলামগুলোর উপর ভিত্তি করে একটি কুমড়ার `price` পূর্বাভাস দিতে চাই, যেগুলো চরিত্র টাইপের? অথবা আরও সহজভাবে বললে, আমরা কীভাবে `package` এবং `price` এর মধ্যে সম্পর্ক খুঁজে বের করতে পারি (যার জন্য উভয় ইনপুটই সংখ্যাসূচক হতে হবে)? 🤷🤷\n",
+ "\n",
+ "মেশিন লার্নিং মডেলগুলো সাধারণত সংখ্যাসূচক বৈশিষ্ট্যগুলোর সাথে ভালো কাজ করে, টেক্সট মানগুলোর তুলনায়। তাই সাধারণত আপনাকে শ্রেণীবদ্ধ বৈশিষ্ট্যগুলোকে সংখ্যাসূচক উপস্থাপনায় রূপান্তর করতে হয়।\n",
+ "\n",
+ "এর মানে হলো আমাদের ভবিষ্যদ্বাণীকারীদের এমনভাবে পুনর্গঠন করতে হবে যাতে মডেল সেগুলো আরও কার্যকরভাবে ব্যবহার করতে পারে। এই প্রক্রিয়াটি `feature engineering` নামে পরিচিত।\n"
+ ],
+ "metadata": {
+ "id": "7hsHoxsStyjJ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## ৩. মডেলিংয়ের জন্য ডেটা প্রিপ্রসেসিং রেসিপি দিয়ে 👩🍳👨🍳\n",
+ "\n",
+ "প্রেডিক্টর মানগুলোকে এমনভাবে পুনরায় ফরম্যাট করা, যাতে মডেল সেগুলো আরও কার্যকরভাবে ব্যবহার করতে পারে, তাকে `ফিচার ইঞ্জিনিয়ারিং` বলা হয়।\n",
+ "\n",
+ "বিভিন্ন মডেলের জন্য বিভিন্ন প্রিপ্রসেসিংয়ের প্রয়োজন হয়। উদাহরণস্বরূপ, লিস্ট স্কয়ার্স মডেলের জন্য `ক্যাটেগরিক্যাল ভেরিয়েবল এনকোডিং` প্রয়োজন হয়, যেমন মাস, ভ্যারাইটি এবং শহরের নাম। এটি মূলত একটি `ক্যাটেগরিক্যাল ভ্যালু` সম্বলিত কলামকে এক বা একাধিক `সংখ্যাসূচক কলামে` রূপান্তর করার প্রক্রিয়া, যা মূল কলামের জায়গা নেয়।\n",
+ "\n",
+ "উদাহরণস্বরূপ, ধরুন আপনার ডেটাতে নিম্নলিখিত ক্যাটেগরিক্যাল ফিচারটি রয়েছে:\n",
+ "\n",
+ "| শহর |\n",
+ "|:-------:|\n",
+ "| ডেনভার |\n",
+ "| নাইরোবি |\n",
+ "| টোকিও |\n",
+ "\n",
+ "আপনি *অর্ডিনাল এনকোডিং* প্রয়োগ করে প্রতিটি ক্যাটেগরির জন্য একটি অনন্য পূর্ণসংখ্যা মান স্থাপন করতে পারেন, যেমন:\n",
+ "\n",
+ "| শহর |\n",
+ "|:----:|\n",
+ "| ০ |\n",
+ "| ১ |\n",
+ "| ২ |\n",
+ "\n",
+ "এবং এটাই আমরা আমাদের ডেটার ক্ষেত্রে করব!\n",
+ "\n",
+ "এই অংশে, আমরা আরেকটি অসাধারণ টিডিমডেলস প্যাকেজ নিয়ে আলোচনা করব: [recipes](https://tidymodels.github.io/recipes/) - যা আপনার ডেটা মডেল ট্রেনিংয়ের **আগে** প্রিপ্রসেস করতে সাহায্য করার জন্য ডিজাইন করা হয়েছে। মূলত, একটি রেসিপি হলো এমন একটি অবজেক্ট যা নির্ধারণ করে যে একটি ডেটাসেটে কোন ধাপগুলো প্রয়োগ করা উচিত, যাতে এটি মডেলিংয়ের জন্য প্রস্তুত হয়।\n",
+ "\n",
+ "এখন, চলুন একটি রেসিপি তৈরি করি, যা আমাদের ডেটাকে মডেলিংয়ের জন্য প্রস্তুত করবে এবং প্রেডিক্টর কলামগুলোর সমস্ত অবজারভেশনের জন্য একটি অনন্য পূর্ণসংখ্যা প্রতিস্থাপন করবে:\n"
+ ],
+ "metadata": {
+ "id": "AD5kQbcvt3Xl"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Specify a recipe\n",
+ "pumpkins_recipe <- recipe(price ~ ., data = new_pumpkins) %>% \n",
+ " step_integer(all_predictors(), zero_based = TRUE)\n",
+ "\n",
+ "\n",
+ "# Print out the recipe\n",
+ "pumpkins_recipe"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "BNaFKXfRt9TU"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "দারুণ! 👏 আমরা ঠিক এখনই আমাদের প্রথম রেসিপি তৈরি করলাম যা একটি ফলাফল (মূল্য) এবং তার সংশ্লিষ্ট পূর্বাভাসকারী নির্ধারণ করে এবং যেখানে সমস্ত পূর্বাভাসকারী কলামগুলোকে একটি পূর্ণসংখ্যার সেটে এনকোড করা উচিত 🙌! চলুন দ্রুত এটি বিশ্লেষণ করি:\n",
+ "\n",
+ "- `recipe()`-এর কলটি একটি ফর্মুলার মাধ্যমে রেসিপিকে জানায় যে ভেরিয়েবলগুলোর *ভূমিকা* কী হবে, যেখানে `new_pumpkins` ডেটা রেফারেন্স হিসেবে ব্যবহৃত হচ্ছে। উদাহরণস্বরূপ, `price` কলামটিকে একটি `outcome` ভূমিকা দেওয়া হয়েছে, আর বাকি কলামগুলোকে `predictor` ভূমিকা দেওয়া হয়েছে।\n",
+ "\n",
+ "- `step_integer(all_predictors(), zero_based = TRUE)` নির্দেশ করে যে সমস্ত পূর্বাভাসকারীকে পূর্ণসংখ্যার একটি সেটে রূপান্তরিত করা উচিত, যেখানে নম্বরিং ০ থেকে শুরু হবে।\n",
+ "\n",
+ "আমরা নিশ্চিত, আপনার মনে হয়তো এমন চিন্তা আসছে: \"এটা তো দারুণ!! কিন্তু যদি আমি নিশ্চিত হতে চাই যে রেসিপিগুলো ঠিক যেমনটা আমি আশা করছি তেমনটাই করছে? 🤔\"\n",
+ "\n",
+ "এটা দারুণ চিন্তা! দেখুন, একবার আপনার রেসিপি সংজ্ঞায়িত হয়ে গেলে, আপনি ডেটা প্রিপ্রসেস করার জন্য প্রয়োজনীয় প্যারামিটারগুলো অনুমান করতে পারেন এবং তারপর প্রক্রিয়াজাত ডেটা বের করতে পারেন। সাধারণত, যখন আপনি Tidymodels ব্যবহার করেন তখন এটি করার প্রয়োজন হয় না (আমরা এক মিনিটের মধ্যেই স্বাভাবিক পদ্ধতি দেখব -> `workflows`), তবে এটি কাজে লাগতে পারে যখন আপনি নিশ্চিত হতে চান যে রেসিপিগুলো আপনার প্রত্যাশা অনুযায়ী কাজ করছে।\n",
+ "\n",
+ "এর জন্য, আপনাকে আরও দুটি ক্রিয়া দরকার হবে: `prep()` এবং `bake()`। এবং সবসময়, আমাদের ছোট্ট R বন্ধুরা [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations)-এর মাধ্যমে আপনাকে এটি আরও ভালোভাবে বুঝতে সাহায্য করবে!\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Artwork by @allison_horst\n"
+ ],
+ "metadata": {
+ "id": "KEiO0v7kuC9O"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "[`prep()`](https://recipes.tidymodels.org/reference/prep.html): একটি প্রশিক্ষণ সেট থেকে প্রয়োজনীয় প্যারামিটার অনুমান করে, যা পরে অন্যান্য ডেটা সেটে প্রয়োগ করা যেতে পারে। উদাহরণস্বরূপ, একটি নির্দিষ্ট পূর্বাভাসকারী কলামের জন্য, কোন পর্যবেক্ষণ integer 0, 1, 2 ইত্যাদি হিসাবে নির্ধারিত হবে।\n",
+ "\n",
+ "[`bake()`](https://recipes.tidymodels.org/reference/bake.html): একটি প্রস্তুত করা রেসিপি নেয় এবং সেটি যেকোনো ডেটা সেটে প্রয়োগ করে।\n",
+ "\n",
+ "এখন, চলুন আমাদের রেসিপিগুলো প্রস্তুত করি এবং প্রয়োগ করি, যাতে নিশ্চিত হওয়া যায় যে অভ্যন্তরীণভাবে পূর্বাভাসকারী কলামগুলো প্রথমে এনকোড করা হবে, তারপর একটি মডেল ফিট করা হবে।\n"
+ ],
+ "metadata": {
+ "id": "Q1xtzebuuTCP"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Prep the recipe\n",
+ "pumpkins_prep <- prep(pumpkins_recipe)\n",
+ "\n",
+ "# Bake the recipe to extract a preprocessed new_pumpkins data\n",
+ "baked_pumpkins <- bake(pumpkins_prep, new_data = NULL)\n",
+ "\n",
+ "# Print out the baked data set\n",
+ "baked_pumpkins %>% \n",
+ " slice_head(n = 10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "FGBbJbP_uUUn"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "হুররে! 🥳 প্রক্রিয়াকৃত ডেটা `baked_pumpkins`-এর সমস্ত পূর্বাভাস এনকোড করা হয়েছে, যা নিশ্চিত করে যে আমাদের সংজ্ঞায়িত প্রিপ্রসেসিং ধাপগুলি প্রত্যাশিতভাবে কাজ করবে। এটি আপনার পড়ার জন্য কিছুটা কঠিন হতে পারে, তবে Tidymodels-এর জন্য অনেক বেশি বোধগম্য। কিছু সময় নিয়ে দেখুন কোন পর্যবেক্ষণটি সংশ্লিষ্ট পূর্ণসংখ্যায় ম্যাপ করা হয়েছে।\n",
+ "\n",
+ "এটি উল্লেখ করার মতো যে `baked_pumpkins` একটি ডেটা ফ্রেম, যার উপর আমরা গণনা করতে পারি।\n",
+ "\n",
+ "উদাহরণস্বরূপ, চলুন আপনার ডেটার দুটি পয়েন্টের মধ্যে একটি ভালো সম্পর্ক খুঁজে বের করার চেষ্টা করি, যাতে একটি সম্ভাব্য ভালো পূর্বাভাস মডেল তৈরি করা যায়। আমরা এটি করার জন্য `cor()` ফাংশন ব্যবহার করব। ফাংশন সম্পর্কে আরও জানতে `?cor()` টাইপ করুন।\n"
+ ],
+ "metadata": {
+ "id": "1dvP0LBUueAW"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Find the correlation between the city_name and the price\n",
+ "cor(baked_pumpkins$city_name, baked_pumpkins$price)\n",
+ "\n",
+ "# Find the correlation between the package and the price\n",
+ "cor(baked_pumpkins$package, baked_pumpkins$price)\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "3bQzXCjFuiSV"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "যেমনটা দেখা যাচ্ছে, সিটি এবং দামের মধ্যে খুবই দুর্বল সম্পর্ক রয়েছে। তবে প্যাকেজ এবং এর দামের মধ্যে কিছুটা ভালো সম্পর্ক দেখা যায়। এটা তো স্বাভাবিক, তাই না? সাধারণত, যত বড় প্রোডাক্টের বাক্স, তত বেশি দাম।\n",
+ "\n",
+ "যেহেতু আমরা এই প্রসঙ্গে আছি, চলুন `corrplot` প্যাকেজ ব্যবহার করে সব কলামের একটি সম্পর্ক ম্যাট্রিক্স ভিজুয়ালাইজ করার চেষ্টা করি।\n"
+ ],
+ "metadata": {
+ "id": "BToPWbgjuoZw"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load the corrplot package\n",
+ "library(corrplot)\n",
+ "\n",
+ "# Obtain correlation matrix\n",
+ "corr_mat <- cor(baked_pumpkins %>% \n",
+ " # Drop columns that are not really informative\n",
+ " select(-c(low_price, high_price)))\n",
+ "\n",
+ "# Make a correlation plot between the variables\n",
+ "corrplot(corr_mat, method = \"shade\", shade.col = NA, tl.col = \"black\", tl.srt = 45, addCoef.col = \"black\", cl.pos = \"n\", order = \"original\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "ZwAL3ksmutVR"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "🤩🤩 আরও ভালো হয়েছে।\n",
+ "\n",
+ "এখন এই ডেটা থেকে একটি ভালো প্রশ্ন হতে পারে: '`একটি নির্দিষ্ট কুমড়ার প্যাকেজের জন্য আমি কী দাম আশা করতে পারি?`' চলুন, সরাসরি শুরু করা যাক!\n",
+ "\n",
+ "> নোট: যখন আপনি **`bake()`** ফাংশনটি **`new_data = NULL`** দিয়ে **`pumpkins_prep`** রেসিপি প্রস্তুত করেন, তখন আপনি প্রক্রিয়াজাত (অর্থাৎ এনকোড করা) প্রশিক্ষণ ডেটা বের করেন। উদাহরণস্বরূপ, যদি আপনার আরেকটি ডেটাসেট থাকে, যেমন একটি টেস্ট সেট, এবং আপনি দেখতে চান রেসিপিটি কীভাবে সেটি প্রি-প্রসেস করবে, তাহলে আপনি সহজেই **`pumpkins_prep`** রেসিপিটি **`new_data = test_set`** দিয়ে বেক করতে পারেন।\n",
+ "\n",
+ "## ৪. একটি লিনিয়ার রিগ্রেশন মডেল তৈরি করুন\n",
+ "\n",
+ "
\n",
+ " \n",
+ " ইনফোগ্রাফিক: দাসানি মাদিপল্লি\n"
+ ],
+ "metadata": {
+ "id": "YqXjLuWavNxW"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এখন যেহেতু আমরা একটি রেসিপি তৈরি করেছি এবং নিশ্চিত করেছি যে ডেটা সঠিকভাবে প্রি-প্রসেস হবে, চলুন একটি রিগ্রেশন মডেল তৈরি করি এই প্রশ্নের উত্তর দেওয়ার জন্য: `একটি নির্দিষ্ট কুমড়ার প্যাকেজের জন্য আমি কী মূল্য আশা করতে পারি?`\n",
+ "\n",
+ "#### প্রশিক্ষণ সেট ব্যবহার করে একটি লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দিন\n",
+ "\n",
+ "আপনি হয়তো ইতিমধ্যেই বুঝে গেছেন, *price* কলামটি হলো `outcome` ভেরিয়েবল এবং *package* কলামটি হলো `predictor` ভেরিয়েবল।\n",
+ "\n",
+ "এটি করতে, আমরা প্রথমে ডেটাকে এমনভাবে ভাগ করব যাতে ৮০% প্রশিক্ষণ সেটে এবং ২০% টেস্ট সেটে যায়। এরপর একটি রেসিপি সংজ্ঞায়িত করব যা প্রেডিক্টর কলামটিকে একটি পূর্ণসংখ্যার সেটে এনকোড করবে, তারপর একটি মডেল স্পেসিফিকেশন তৈরি করব। আমরা আমাদের রেসিপি প্রিপ এবং বেক করব না, কারণ আমরা ইতিমধ্যেই জানি এটি ডেটাকে প্রত্যাশিতভাবে প্রি-প্রসেস করবে।\n"
+ ],
+ "metadata": {
+ "id": "Pq0bSzCevW-h"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "set.seed(2056)\n",
+ "# Split the data into training and test sets\n",
+ "pumpkins_split <- new_pumpkins %>% \n",
+ " initial_split(prop = 0.8)\n",
+ "\n",
+ "\n",
+ "# Extract training and test data\n",
+ "pumpkins_train <- training(pumpkins_split)\n",
+ "pumpkins_test <- testing(pumpkins_split)\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Create a recipe for preprocessing the data\n",
+ "lm_pumpkins_recipe <- recipe(price ~ package, data = pumpkins_train) %>% \n",
+ " step_integer(all_predictors(), zero_based = TRUE)\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Create a linear model specification\n",
+ "lm_spec <- linear_reg() %>% \n",
+ " set_engine(\"lm\") %>% \n",
+ " set_mode(\"regression\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "CyoEh_wuvcLv"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ভালো কাজ! এখন যেহেতু আমাদের কাছে একটি রেসিপি এবং একটি মডেল স্পেসিফিকেশন আছে, আমাদের সেগুলোকে একত্রিত করে এমন একটি অবজেক্ট খুঁজে বের করতে হবে যা প্রথমে ডেটা প্রিপ্রসেস করবে (পেছনে প্রেপ+বেক করবে), প্রিপ্রসেস করা ডেটার উপর মডেল ফিট করবে এবং সম্ভাব্য পোস্ট-প্রসেসিং কার্যক্রমের জন্যও সুযোগ দেবে। কেমন লাগছে, নিশ্চিন্ত মনে?🤩\n",
+ "\n",
+ "Tidymodels-এ, এই সুবিধাজনক অবজেক্টটিকে বলা হয় [`workflow`](https://workflows.tidymodels.org/), যা আপনার মডেলিং উপাদানগুলোকে সহজেই ধরে রাখে! Python-এ যেটিকে আমরা *pipelines* বলি, এটি ঠিক তাই।\n",
+ "\n",
+ "তাহলে চলুন, সবকিছু একত্রিত করে একটি workflow-এ বেঁধে ফেলি!📦\n"
+ ],
+ "metadata": {
+ "id": "G3zF_3DqviFJ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Hold modelling components in a workflow\n",
+ "lm_wf <- workflow() %>% \n",
+ " add_recipe(lm_pumpkins_recipe) %>% \n",
+ " add_model(lm_spec)\n",
+ "\n",
+ "# Print out the workflow\n",
+ "lm_wf"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "T3olroU3v-WX"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "সাথে সাথে, একটি ওয়ার্কফ্লো প্রায় একইভাবে ফিট/প্রশিক্ষণ করা যেতে পারে যেভাবে একটি মডেল করা যায়।\n"
+ ],
+ "metadata": {
+ "id": "zd1A5tgOwEPX"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Train the model\n",
+ "lm_wf_fit <- lm_wf %>% \n",
+ " fit(data = pumpkins_train)\n",
+ "\n",
+ "# Print the model coefficients learned \n",
+ "lm_wf_fit"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "NhJagFumwFHf"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "মডেলের আউটপুট থেকে আমরা প্রশিক্ষণের সময় শেখা সহগগুলো দেখতে পারি। এগুলো হল সেই রেখার সহগ যা আমাদের প্রকৃত এবং পূর্বাভাসিত ভেরিয়েবলের মধ্যে সর্বনিম্ন সামগ্রিক ত্রুটি দেয়।\n",
+ "\n",
+ "#### টেস্ট সেট ব্যবহার করে মডেলের কার্যকারিতা মূল্যায়ন\n",
+ "\n",
+ "এখন সময় এসেছে মডেলের কার্যকারিতা দেখার 📏! আমরা কীভাবে এটি করব?\n",
+ "\n",
+ "এখন যেহেতু আমরা মডেলটি প্রশিক্ষণ দিয়েছি, আমরা এটি ব্যবহার করে `parsnip::predict()` এর মাধ্যমে test_set এর জন্য পূর্বাভাস তৈরি করতে পারি। এরপর আমরা এই পূর্বাভাসগুলো প্রকৃত লেবেল মানগুলোর সাথে তুলনা করতে পারি, যাতে মডেলটি কতটা ভালো (বা খারাপ!) কাজ করছে তা মূল্যায়ন করা যায়।\n",
+ "\n",
+ "চলুন শুরু করি টেস্ট সেটের জন্য পূর্বাভাস তৈরি করে, তারপর টেস্ট সেটের সাথে কলামগুলো যুক্ত করি।\n"
+ ],
+ "metadata": {
+ "id": "_4QkGtBTwItF"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make predictions for the test set\n",
+ "predictions <- lm_wf_fit %>% \n",
+ " predict(new_data = pumpkins_test)\n",
+ "\n",
+ "\n",
+ "# Bind predictions to the test set\n",
+ "lm_results <- pumpkins_test %>% \n",
+ " select(c(package, price)) %>% \n",
+ " bind_cols(predictions)\n",
+ "\n",
+ "\n",
+ "# Print the first ten rows of the tibble\n",
+ "lm_results %>% \n",
+ " slice_head(n = 10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "UFZzTG0gwTs9"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "হ্যাঁ, আপনি একটি মডেল প্রশিক্ষণ দিয়েছেন এবং এটি ব্যবহার করে পূর্বাভাস তৈরি করেছেন!🔮 এটি কতটা কার্যকর, চলুন মডেলের কার্যকারিতা মূল্যায়ন করি!\n",
+ "\n",
+ "Tidymodels-এ, আমরা এটি `yardstick::metrics()` ব্যবহার করে করি! লিনিয়ার রিগ্রেশনের জন্য, আমরা নিম্নলিখিত মেট্রিকগুলোর উপর ফোকাস করব:\n",
+ "\n",
+ "- `Root Mean Square Error (RMSE)`: [MSE](https://en.wikipedia.org/wiki/Mean_squared_error)-এর বর্গমূল। এটি একটি নির্দিষ্ট মেট্রিক প্রদান করে যা লেবেলের (এই ক্ষেত্রে, কুমড়ার দাম) একই এককে থাকে। মান যত ছোট হবে, মডেল তত ভালো (সরলভাবে বলতে গেলে, এটি গড় দামের প্রতিনিধিত্ব করে, যার দ্বারা পূর্বাভাসগুলো ভুল হয়েছে!)\n",
+ "\n",
+ "- `Coefficient of Determination (সাধারণত R-squared বা R2 নামে পরিচিত)`: একটি আপেক্ষিক মেট্রিক, যেখানে মান যত বেশি হবে, মডেলের ফিট তত ভালো হবে। মূলত, এই মেট্রিকটি বোঝায় যে মডেলটি পূর্বাভাসিত এবং প্রকৃত লেবেল মানগুলোর মধ্যে বৈচিত্র্যের কতটা ব্যাখ্যা করতে সক্ষম।\n"
+ ],
+ "metadata": {
+ "id": "0A5MjzM7wW9M"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Evaluate performance of linear regression\n",
+ "metrics(data = lm_results,\n",
+ " truth = price,\n",
+ " estimate = .pred)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "reJ0UIhQwcEH"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "মডেলের কার্যকারিতা এখানে শেষ। চলুন দেখি, প্যাকেজ এবং দামের একটি স্ক্যাটার প্লট ভিজুয়ালাইজ করে এবং তারপর মডেলের তৈরি করা পূর্বাভাস ব্যবহার করে একটি সেরা ফিট লাইন ওভারলে করে আমরা আরও ভালো ইঙ্গিত পেতে পারি কিনা।\n",
+ "\n",
+ "এর মানে হলো, আমাদের টেস্ট সেট প্রস্তুত এবং বেক করতে হবে যাতে প্যাকেজ কলাম এনকোড করা যায় এবং তারপর এটি মডেলের তৈরি পূর্বাভাসের সাথে যুক্ত করতে হয়।\n"
+ ],
+ "metadata": {
+ "id": "fdgjzjkBwfWt"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Encode package column\n",
+ "package_encode <- lm_pumpkins_recipe %>% \n",
+ " prep() %>% \n",
+ " bake(new_data = pumpkins_test) %>% \n",
+ " select(package)\n",
+ "\n",
+ "\n",
+ "# Bind encoded package column to the results\n",
+ "lm_results <- lm_results %>% \n",
+ " bind_cols(package_encode %>% \n",
+ " rename(package_integer = package)) %>% \n",
+ " relocate(package_integer, .after = package)\n",
+ "\n",
+ "\n",
+ "# Print new results data frame\n",
+ "lm_results %>% \n",
+ " slice_head(n = 5)\n",
+ "\n",
+ "\n",
+ "# Make a scatter plot\n",
+ "lm_results %>% \n",
+ " ggplot(mapping = aes(x = package_integer, y = price)) +\n",
+ " geom_point(size = 1.6) +\n",
+ " # Overlay a line of best fit\n",
+ " geom_line(aes(y = .pred), color = \"orange\", size = 1.2) +\n",
+ " xlab(\"package\")\n",
+ " \n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "R0nw719lwkHE"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "দারুণ! যেমনটি আপনি দেখতে পাচ্ছেন, লিনিয়ার রিগ্রেশন মডেলটি প্যাকেজ এবং তার সংশ্লিষ্ট মূল্যের মধ্যে সম্পর্কটি খুব ভালোভাবে সাধারণীকরণ করতে পারে না।\n",
+ "\n",
+ "🎃 অভিনন্দন, আপনি ঠিক এখনই এমন একটি মডেল তৈরি করেছেন যা কিছু প্রজাতির কুমড়ার দাম পূর্বানুমান করতে সাহায্য করতে পারে। আপনার ছুটির কুমড়ার ক্ষেতটি দারুণ সুন্দর হবে। তবে, আপনি সম্ভবত আরও ভালো একটি মডেল তৈরি করতে পারবেন!\n",
+ "\n",
+ "## ৫. একটি পলিনোমিয়াল রিগ্রেশন মডেল তৈরি করুন\n",
+ "\n",
+ "
\n",
+ " \n",
+ " ইনফোগ্রাফিক: দাসানি মাদিপল্লি\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "HOCqJXLTwtWI"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "কখনও কখনও আমাদের ডেটার মধ্যে সরলরৈখিক সম্পর্ক থাকে না, কিন্তু আমরা এখনও একটি ফলাফল পূর্বাভাস দিতে চাই। পলিনোমিয়াল রিগ্রেশন আমাদের আরও জটিল অ-রৈখিক সম্পর্কের জন্য পূর্বাভাস দিতে সাহায্য করতে পারে।\n",
+ "\n",
+ "উদাহরণস্বরূপ, আমাদের কুমড়ার ডেটা সেটে প্যাকেজ এবং দামের মধ্যে সম্পর্কটি বিবেচনা করুন। কখনও কখনও ভেরিয়েবলগুলির মধ্যে একটি সরলরৈখিক সম্পর্ক থাকে - যেমন, কুমড়ার আয়তন যত বড়, দাম তত বেশি - কিন্তু কখনও কখনও এই সম্পর্কগুলোকে একটি সমতল বা সরলরেখা দিয়ে চিত্রিত করা যায় না।\n",
+ "\n",
+ "> ✅ এখানে [আরও কিছু উদাহরণ](https://online.stat.psu.edu/stat501/lesson/9/9.8) রয়েছে যেখানে পলিনোমিয়াল রিগ্রেশন ব্যবহার করা যেতে পারে।\n",
+ ">\n",
+ "> আগের প্লটে Variety এবং Price এর মধ্যে সম্পর্কটি আবার দেখুন। এই স্ক্যাটারপ্লটটি কি সরলরেখা দিয়ে বিশ্লেষণ করা উচিত বলে মনে হয়? সম্ভবত না। এই ক্ষেত্রে, আপনি পলিনোমিয়াল রিগ্রেশন চেষ্টা করতে পারেন।\n",
+ ">\n",
+ "> ✅ পলিনোমিয়াল হল গাণিতিক অভিব্যক্তি যা এক বা একাধিক ভেরিয়েবল এবং কোইফিসিয়েন্ট নিয়ে গঠিত হতে পারে।\n",
+ "\n",
+ "#### প্রশিক্ষণ সেট ব্যবহার করে একটি পলিনোমিয়াল রিগ্রেশন মডেল প্রশিক্ষণ দিন\n",
+ "\n",
+ "পলিনোমিয়াল রিগ্রেশন একটি *বাঁকা রেখা* তৈরি করে যা অ-রৈখিক ডেটার সাথে আরও ভালোভাবে মানানসই হয়।\n",
+ "\n",
+ "চলুন দেখি একটি পলিনোমিয়াল মডেল পূর্বাভাসে আরও ভালো পারফর্ম করে কিনা। আমরা আগের মতোই কিছুটা অনুরূপ পদ্ধতি অনুসরণ করব:\n",
+ "\n",
+ "- একটি রেসিপি তৈরি করুন যা আমাদের ডেটাকে মডেলিংয়ের জন্য প্রস্তুত করতে প্রয়োজনীয় প্রি-প্রসেসিং ধাপগুলি নির্ধারণ করে, যেমন: প্রেডিক্টর এনকোডিং এবং ডিগ্রি *n* এর পলিনোমিয়াল গণনা।\n",
+ "\n",
+ "- একটি মডেল স্পেসিফিকেশন তৈরি করুন।\n",
+ "\n",
+ "- রেসিপি এবং মডেল স্পেসিফিকেশনকে একটি ওয়ার্কফ্লোতে একত্রিত করুন।\n",
+ "\n",
+ "- ওয়ার্কফ্লো ফিট করে একটি মডেল তৈরি করুন।\n",
+ "\n",
+ "- টেস্ট ডেটায় মডেলটি কতটা ভালো পারফর্ম করে তা মূল্যায়ন করুন।\n",
+ "\n",
+ "চলুন শুরু করি!\n"
+ ],
+ "metadata": {
+ "id": "VcEIpRV9wzYr"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Specify a recipe\r\n",
+ "poly_pumpkins_recipe <-\r\n",
+ " recipe(price ~ package, data = pumpkins_train) %>%\r\n",
+ " step_integer(all_predictors(), zero_based = TRUE) %>% \r\n",
+ " step_poly(all_predictors(), degree = 4)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Create a model specification\r\n",
+ "poly_spec <- linear_reg() %>% \r\n",
+ " set_engine(\"lm\") %>% \r\n",
+ " set_mode(\"regression\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Bundle recipe and model spec into a workflow\r\n",
+ "poly_wf <- workflow() %>% \r\n",
+ " add_recipe(poly_pumpkins_recipe) %>% \r\n",
+ " add_model(poly_spec)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Create a model\r\n",
+ "poly_wf_fit <- poly_wf %>% \r\n",
+ " fit(data = pumpkins_train)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Print learned model coefficients\r\n",
+ "poly_wf_fit\r\n",
+ "\r\n",
+ " "
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "63n_YyRXw3CC"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### মডেলের কার্যকারিতা মূল্যায়ন করুন\n",
+ "\n",
+ "👏👏আপনি একটি পলিনোমিয়াল মডেল তৈরি করেছেন, চলুন এখন টেস্ট সেটে পূর্বাভাস করি!\n"
+ ],
+ "metadata": {
+ "id": "-LHZtztSxDP0"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make price predictions on test data\r\n",
+ "poly_results <- poly_wf_fit %>% predict(new_data = pumpkins_test) %>% \r\n",
+ " bind_cols(pumpkins_test %>% select(c(package, price))) %>% \r\n",
+ " relocate(.pred, .after = last_col())\r\n",
+ "\r\n",
+ "\r\n",
+ "# Print the results\r\n",
+ "poly_results %>% \r\n",
+ " slice_head(n = 10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "YUFpQ_dKxJGx"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "উহু-হু, চলুন দেখি মডেলটি কীভাবে test_set-এ কাজ করেছে `yardstick::metrics()` ব্যবহার করে।\n"
+ ],
+ "metadata": {
+ "id": "qxdyj86bxNGZ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "metrics(data = poly_results, truth = price, estimate = .pred)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "8AW5ltkBxXDm"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "🤩🤩 অনেক ভালো পারফরম্যান্স।\n",
+ "\n",
+ "`rmse` প্রায় ৭ থেকে প্রায় ৩-এ নেমে এসেছে, যা প্রকৃত মূল্য এবং পূর্বাভাসিত মূল্যের মধ্যে ত্রুটি হ্রাসের ইঙ্গিত দেয়। আপনি এটিকে *আনুমানিকভাবে* এইভাবে ব্যাখ্যা করতে পারেন যে গড়ে ভুল পূর্বাভাস প্রায় \\$৩ এর কাছাকাছি ভুল। `rsq` প্রায় ০.৪ থেকে ০.৮-এ বৃদ্ধি পেয়েছে।\n",
+ "\n",
+ "এই সমস্ত মেট্রিক দেখায় যে পলিনোমিয়াল মডেলটি লিনিয়ার মডেলের তুলনায় অনেক ভালো পারফর্ম করে। দারুণ কাজ!\n",
+ "\n",
+ "চলুন দেখি আমরা এটি ভিজুয়ালাইজ করতে পারি কিনা!\n"
+ ],
+ "metadata": {
+ "id": "6gLHNZDwxYaS"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Bind encoded package column to the results\r\n",
+ "poly_results <- poly_results %>% \r\n",
+ " bind_cols(package_encode %>% \r\n",
+ " rename(package_integer = package)) %>% \r\n",
+ " relocate(package_integer, .after = package)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Print new results data frame\r\n",
+ "poly_results %>% \r\n",
+ " slice_head(n = 5)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Make a scatter plot\r\n",
+ "poly_results %>% \r\n",
+ " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
+ " geom_point(size = 1.6) +\r\n",
+ " # Overlay a line of best fit\r\n",
+ " geom_line(aes(y = .pred), color = \"midnightblue\", size = 1.2) +\r\n",
+ " xlab(\"package\")\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "A83U16frxdF1"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আপনি দেখতে পাচ্ছেন একটি বাঁকানো রেখা যা আপনার ডেটার সাথে আরও ভালোভাবে মানানসই! 🤩\n",
+ "\n",
+ "আপনি এটি আরও মসৃণ করতে পারেন একটি পলিনোমিয়াল সূত্র `geom_smooth`-এ পাস করে, যেমন:\n"
+ ],
+ "metadata": {
+ "id": "4U-7aHOVxlGU"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make a scatter plot\r\n",
+ "poly_results %>% \r\n",
+ " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
+ " geom_point(size = 1.6) +\r\n",
+ " # Overlay a line of best fit\r\n",
+ " geom_smooth(method = lm, formula = y ~ poly(x, degree = 4), color = \"midnightblue\", size = 1.2, se = FALSE) +\r\n",
+ " xlab(\"package\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "5vzNT0Uexm-w"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "একটি মসৃণ বক্ররেখার মতো!🤩\n",
+ "\n",
+ "নতুন পূর্বাভাস তৈরি করার উপায় এখানে:\n"
+ ],
+ "metadata": {
+ "id": "v9u-wwyLxq4G"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make a hypothetical data frame\r\n",
+ "hypo_tibble <- tibble(package = \"bushel baskets\")\r\n",
+ "\r\n",
+ "# Make predictions using linear model\r\n",
+ "lm_pred <- lm_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
+ "\r\n",
+ "# Make predictions using polynomial model\r\n",
+ "poly_pred <- poly_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
+ "\r\n",
+ "# Return predictions in a list\r\n",
+ "list(\"linear model prediction\" = lm_pred, \r\n",
+ " \"polynomial model prediction\" = poly_pred)\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "jRPSyfQGxuQv"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "`polynomial model` এর পূর্বাভাস `price` এবং `package` এর স্ক্যাটার প্লট দেখে যথাযথ মনে হয়! এবং, যদি এটি আগের মডেলের তুলনায় ভালো হয়, তাহলে একই ডেটা দেখে আপনাকে এই বেশি দামের কুমড়োর জন্য বাজেট করতে হবে!\n",
+ "\n",
+ "🏆 খুব ভালো কাজ! আপনি এক পাঠে দুটি রিগ্রেশন মডেল তৈরি করেছেন। রিগ্রেশনের শেষ অংশে, আপনি ক্যাটাগরি নির্ধারণের জন্য লজিস্টিক রিগ্রেশন সম্পর্কে শিখবেন।\n",
+ "\n",
+ "## **🚀চ্যালেঞ্জ**\n",
+ "\n",
+ "এই নোটবুকে বিভিন্ন ভেরিয়েবল পরীক্ষা করুন এবং দেখুন কিভাবে করেলেশন মডেলের সঠিকতার সাথে সম্পর্কিত।\n",
+ "\n",
+ "## [**পাঠ-পরবর্তী কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n",
+ "\n",
+ "## **পুনরালোচনা ও স্ব-অধ্যয়ন**\n",
+ "\n",
+ "এই পাঠে আমরা লিনিয়ার রিগ্রেশন সম্পর্কে শিখেছি। রিগ্রেশনের আরও কিছু গুরুত্বপূর্ণ ধরণ রয়েছে। Stepwise, Ridge, Lasso এবং Elasticnet পদ্ধতি সম্পর্কে পড়ুন। আরও জানার জন্য একটি ভালো কোর্স হলো [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)।\n",
+ "\n",
+ "যদি আপনি অসাধারণ Tidymodels ফ্রেমওয়ার্ক ব্যবহার করতে আরও শিখতে চান, তাহলে নিচের রিসোর্সগুলো দেখুন:\n",
+ "\n",
+ "- Tidymodels ওয়েবসাইট: [Tidymodels দিয়ে শুরু করুন](https://www.tidymodels.org/start/)\n",
+ "\n",
+ "- ম্যাক্স কুন এবং জুলিয়া সিলজ, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n",
+ "\n",
+ "###### **ধন্যবাদ জানাই:**\n",
+ "\n",
+ "[অ্যালিসন হর্স্ট](https://twitter.com/allison_horst?lang=en) কে, যিনি অসাধারণ ইলাস্ট্রেশন তৈরি করেছেন যা R-কে আরও আকর্ষণীয় এবং বন্ধুত্বপূর্ণ করে তুলেছে। তার আরও ইলাস্ট্রেশন খুঁজে পেতে দেখুন তার [গ্যালারি](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM)।\n"
+ ],
+ "metadata": {
+ "id": "8zOLOWqMxzk5"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/3-Linear/solution/notebook.ipynb b/translations/bn/2-Regression/3-Linear/solution/notebook.ipynb
new file mode 100644
index 000000000..2db62bf3b
--- /dev/null
+++ b/translations/bn/2-Regression/3-Linear/solution/notebook.ipynb
@@ -0,0 +1,1115 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## কুমড়ার মূল্য নির্ধারণের জন্য লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন - পাঠ ৩\n",
+ "\n",
+ "প্রয়োজনীয় লাইব্রেরি এবং ডেটাসেট লোড করুন। ডেটাকে একটি ডেটাফ্রেমে রূপান্তর করুন যা ডেটার একটি অংশ ধারণ করে:\n",
+ "\n",
+ "- শুধুমাত্র সেই কুমড়াগুলো নিন যেগুলো বাসেল অনুযায়ী মূল্য নির্ধারণ করা হয়েছে\n",
+ "- তারিখকে মাসে রূপান্তর করুন\n",
+ "- উচ্চ এবং নিম্ন মূল্যের গড় হিসাব করে মূল্য নির্ধারণ করুন\n",
+ "- মূল্যকে বাসেল পরিমাণ অনুযায়ী রূপান্তর করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 167,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Type
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Sub Variety
\n",
+ "
Grade
\n",
+ "
Date
\n",
+ "
Low Price
\n",
+ "
High Price
\n",
+ "
Mostly Low
\n",
+ "
...
\n",
+ "
Unit of Sale
\n",
+ "
Quality
\n",
+ "
Condition
\n",
+ "
Appearance
\n",
+ "
Storage
\n",
+ "
Crop
\n",
+ "
Repack
\n",
+ "
Trans Mode
\n",
+ "
Unnamed: 24
\n",
+ "
Unnamed: 25
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
4/29/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
5/6/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
11/5/16
\n",
+ "
90.0
\n",
+ "
100.0
\n",
+ "
90.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Type Package Variety Sub Variety Grade Date \\\n",
+ "0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \n",
+ "1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n",
+ "2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n",
+ "\n",
+ " Low Price High Price Mostly Low ... Unit of Sale Quality Condition \\\n",
+ "0 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "1 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "2 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "3 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "4 90.0 100.0 90.0 ... NaN NaN NaN \n",
+ "\n",
+ " Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n",
+ "0 NaN NaN NaN E NaN NaN NaN \n",
+ "1 NaN NaN NaN E NaN NaN NaN \n",
+ "2 NaN NaN NaN N NaN NaN NaN \n",
+ "3 NaN NaN NaN N NaN NaN NaN \n",
+ "4 NaN NaN NaN N NaN NaN NaN \n",
+ "\n",
+ "[5 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 167,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from datetime import datetime\n",
+ "\n",
+ "pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n",
+ "pumpkins.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 168,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
Month
\n",
+ "
DayOfYear
\n",
+ "
Variety
\n",
+ "
City
\n",
+ "
Package
\n",
+ "
Low Price
\n",
+ "
High Price
\n",
+ "
Price
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
70
\n",
+ "
9
\n",
+ "
267
\n",
+ "
PIE TYPE
\n",
+ "
BALTIMORE
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
13.636364
\n",
+ "
\n",
+ "
\n",
+ "
71
\n",
+ "
9
\n",
+ "
267
\n",
+ "
PIE TYPE
\n",
+ "
BALTIMORE
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
16.363636
\n",
+ "
\n",
+ "
\n",
+ "
72
\n",
+ "
10
\n",
+ "
274
\n",
+ "
PIE TYPE
\n",
+ "
BALTIMORE
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
16.363636
\n",
+ "
\n",
+ "
\n",
+ "
73
\n",
+ "
10
\n",
+ "
274
\n",
+ "
PIE TYPE
\n",
+ "
BALTIMORE
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
17.0
\n",
+ "
17.0
\n",
+ "
15.454545
\n",
+ "
\n",
+ "
\n",
+ "
74
\n",
+ "
10
\n",
+ "
281
\n",
+ "
PIE TYPE
\n",
+ "
BALTIMORE
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
13.636364
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Month DayOfYear Variety City Package Low Price \\\n",
+ "70 9 267 PIE TYPE BALTIMORE 1 1/9 bushel cartons 15.0 \n",
+ "71 9 267 PIE TYPE BALTIMORE 1 1/9 bushel cartons 18.0 \n",
+ "72 10 274 PIE TYPE BALTIMORE 1 1/9 bushel cartons 18.0 \n",
+ "73 10 274 PIE TYPE BALTIMORE 1 1/9 bushel cartons 17.0 \n",
+ "74 10 281 PIE TYPE BALTIMORE 1 1/9 bushel cartons 15.0 \n",
+ "\n",
+ " High Price Price \n",
+ "70 15.0 13.636364 \n",
+ "71 18.0 16.363636 \n",
+ "72 18.0 16.363636 \n",
+ "73 17.0 15.454545 \n",
+ "74 15.0 13.636364 "
+ ]
+ },
+ "execution_count": 168,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
+ "\n",
+ "new_columns = ['Package', 'Variety', 'City Name', 'Month', 'Low Price', 'High Price', 'Date']\n",
+ "pumpkins = pumpkins.drop([c for c in pumpkins.columns if c not in new_columns], axis=1)\n",
+ "\n",
+ "price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2\n",
+ "\n",
+ "month = pd.DatetimeIndex(pumpkins['Date']).month\n",
+ "day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)\n",
+ "\n",
+ "new_pumpkins = pd.DataFrame(\n",
+ " {'Month': month, \n",
+ " 'DayOfYear' : day_of_year, \n",
+ " 'Variety': pumpkins['Variety'], \n",
+ " 'City': pumpkins['City Name'], \n",
+ " 'Package': pumpkins['Package'], \n",
+ " 'Low Price': pumpkins['Low Price'],\n",
+ " 'High Price': pumpkins['High Price'], \n",
+ " 'Price': price})\n",
+ "\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/1.1\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price*2\n",
+ "\n",
+ "new_pumpkins.head()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "একটি স্ক্যাটারপ্লট আমাদের মনে করিয়ে দেয় যে আমাদের কাছে শুধুমাত্র আগস্ট থেকে ডিসেম্বর পর্যন্ত মাসের ডেটা রয়েছে। সম্ভবত আমাদের আরও ডেটা প্রয়োজন যাতে আমরা একটি সরলরৈখিক পদ্ধতিতে সিদ্ধান্ত নিতে পারি।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 169,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 169,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.scatter(X_test,y_test)\n",
+ "plt.plot(X_test,pred)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "রেখার ঢাল লিনিয়ার রিগ্রেশন সহগ থেকে নির্ধারণ করা যেতে পারে:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 178,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(array([-0.01751876]), 21.133734359909326)"
+ ]
+ },
+ "execution_count": 178,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lin_reg.coef_, lin_reg.intercept_"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "আমরা প্রশিক্ষিত মডেলটি ব্যবহার করে মূল্য পূর্বাভাস দিতে পারি:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 179,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([16.64893156])"
+ ]
+ },
+ "execution_count": 179,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Pumpkin price on programmer's day\n",
+ "\n",
+ "lin_reg.predict([[256]])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### পলিনোমিয়াল রিগ্রেশন\n",
+ "\n",
+ "কখনও কখনও ফিচার এবং ফলাফলের মধ্যে সম্পর্ক স্বাভাবিকভাবেই অ-রৈখিক হয়। উদাহরণস্বরূপ, কুমড়ার দাম শীতকালে (মাস=১,২) বেশি হতে পারে, তারপর গ্রীষ্মে (মাস=৫-৭) কমে যেতে পারে, এবং পরে আবার বাড়তে পারে। লিনিয়ার রিগ্রেশন এই সম্পর্কটি সঠিকভাবে খুঁজে পেতে অক্ষম।\n",
+ "\n",
+ "এই ক্ষেত্রে, আমরা অতিরিক্ত ফিচার যোগ করার কথা বিবেচনা করতে পারি। সহজ উপায় হল ইনপুট ফিচার থেকে পলিনোমিয়াল ব্যবহার করা, যা **পলিনোমিয়াল রিগ্রেশন** তৈরি করবে। সাইকিট লার্ন-এ, আমরা পাইপলাইনের মাধ্যমে স্বয়ংক্রিয়ভাবে পলিনোমিয়াল ফিচার প্রি-কম্পিউট করতে পারি:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 180,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Mean error: 2.73 (17.0%)\n",
+ "Model determination: 0.07639977655280217\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "execution_count": 180,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from sklearn.preprocessing import PolynomialFeatures\n",
+ "from sklearn.pipeline import make_pipeline\n",
+ "\n",
+ "pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())\n",
+ "\n",
+ "pipeline.fit(X_train,y_train)\n",
+ "\n",
+ "pred = pipeline.predict(X_test)\n",
+ "\n",
+ "mse = np.sqrt(mean_squared_error(y_test,pred))\n",
+ "print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')\n",
+ "\n",
+ "score = pipeline.score(X_train,y_train)\n",
+ "print('Model determination: ', score)\n",
+ "\n",
+ "plt.scatter(X_test,y_test)\n",
+ "plt.plot(sorted(X_test),pipeline.predict(sorted(X_test)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### এনকোডিং প্রকারভেদ\n",
+ "\n",
+ "আদর্শ পরিস্থিতিতে, আমরা চাই একই মডেল ব্যবহার করে বিভিন্ন কুমড়ার প্রকারভেদের দাম পূর্বাভাস দিতে সক্ষম হতে। প্রকারভেদকে বিবেচনায় আনতে, প্রথমে আমাদের এটিকে সংখ্যায় রূপান্তর করতে হবে, বা **এনকোড** করতে হবে। এটি করার কয়েকটি পদ্ধতি রয়েছে:\n",
+ "\n",
+ "* সাধারণ সংখ্যাগত এনকোডিং, যা বিভিন্ন প্রকারভেদের একটি টেবিল তৈরি করবে এবং তারপর সেই টেবিলের সূচকের মাধ্যমে প্রকারভেদের নাম প্রতিস্থাপন করবে। এটি লিনিয়ার রিগ্রেশনের জন্য সেরা পদ্ধতি নয়, কারণ লিনিয়ার রিগ্রেশন সূচকের সংখ্যাগত মানকে বিবেচনায় নেয়, এবং সংখ্যাগত মান সম্ভবত দামের সাথে সংখ্যাগতভাবে সম্পর্কিত নয়।\n",
+ "* ওয়ান-হট এনকোডিং, যা `Variety` কলামকে ৪টি ভিন্ন কলামে প্রতিস্থাপন করবে, প্রতিটি প্রকারভেদের জন্য একটি কলাম থাকবে, যেখানে সংশ্লিষ্ট সারি যদি নির্দিষ্ট প্রকারভেদের হয়, তাহলে ১ থাকবে, অন্যথায় ০ থাকবে।\n",
+ "\n",
+ "নিচের কোডটি দেখায় কীভাবে আমরা একটি প্রকারভেদকে ওয়ান-হট এনকোড করতে পারি:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 181,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
FAIRYTALE
\n",
+ "
MINIATURE
\n",
+ "
MIXED HEIRLOOM VARIETIES
\n",
+ "
PIE TYPE
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
70
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
71
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
72
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
73
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
74
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
\n",
+ "
\n",
+ "
1738
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1739
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1740
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1741
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1742
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
415 rows × 4 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " FAIRYTALE MINIATURE MIXED HEIRLOOM VARIETIES PIE TYPE\n",
+ "70 0 0 0 1\n",
+ "71 0 0 0 1\n",
+ "72 0 0 0 1\n",
+ "73 0 0 0 1\n",
+ "74 0 0 0 1\n",
+ "... ... ... ... ...\n",
+ "1738 0 1 0 0\n",
+ "1739 0 1 0 0\n",
+ "1740 0 1 0 0\n",
+ "1741 0 1 0 0\n",
+ "1742 0 1 0 0\n",
+ "\n",
+ "[415 rows x 4 columns]"
+ ]
+ },
+ "execution_count": 181,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.get_dummies(new_pumpkins['Variety'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### বিভিন্নতার উপর লিনিয়ার রিগ্রেশন\n",
+ "\n",
+ "এখন আমরা উপরের একই কোড ব্যবহার করব, তবে `DayOfYear` এর পরিবর্তে ইনপুট হিসেবে আমাদের এক-হট-এনকোড করা বিভিন্নতা ব্যবহার করব:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 182,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X = pd.get_dummies(new_pumpkins['Variety'])\n",
+ "y = new_pumpkins['Price']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 183,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Mean error: 5.24 (19.7%)\n",
+ "Model determination: 0.774085281105197\n"
+ ]
+ }
+ ],
+ "source": [
+ "def run_linear_regression(X,y):\n",
+ " X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n",
+ " lin_reg = LinearRegression()\n",
+ " lin_reg.fit(X_train,y_train)\n",
+ "\n",
+ " pred = lin_reg.predict(X_test)\n",
+ "\n",
+ " mse = np.sqrt(mean_squared_error(y_test,pred))\n",
+ " print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')\n",
+ "\n",
+ " score = lin_reg.score(X_train,y_train)\n",
+ " print('Model determination: ', score)\n",
+ "\n",
+ "run_linear_regression(X,y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "আমরা একই পদ্ধতিতে অন্যান্য বৈশিষ্ট্য ব্যবহার করার চেষ্টা করতে পারি এবং সেগুলিকে সংখ্যাগত বৈশিষ্ট্যের সাথে যেমন `Month` বা `DayOfYear` এর সাথে সংযুক্ত করতে পারি:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 184,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Mean error: 2.84 (10.5%)\n",
+ "Model determination: 0.9401096672643048\n"
+ ]
+ }
+ ],
+ "source": [
+ "X = pd.get_dummies(new_pumpkins['Variety']) \\\n",
+ " .join(new_pumpkins['Month']) \\\n",
+ " .join(pd.get_dummies(new_pumpkins['City'])) \\\n",
+ " .join(pd.get_dummies(new_pumpkins['Package']))\n",
+ "y = new_pumpkins['Price']\n",
+ "\n",
+ "run_linear_regression(X,y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### পলিনোমিয়াল রিগ্রেশন\n",
+ "\n",
+ "পলিনোমিয়াল রিগ্রেশন এক-হট-এনকোড করা ক্যাটেগরিকাল বৈশিষ্ট্যগুলোর সাথেও ব্যবহার করা যেতে পারে। পলিনোমিয়াল রিগ্রেশন প্রশিক্ষণের কোড মূলত উপরে দেখা কোডের মতোই হবে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Mean error: 2.23 (8.25%)\n",
+ "Model determination: 0.9652870784724543\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.preprocessing import PolynomialFeatures\n",
+ "from sklearn.pipeline import make_pipeline\n",
+ "\n",
+ "pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n",
+ "\n",
+ "pipeline.fit(X_train,y_train)\n",
+ "\n",
+ "pred = pipeline.predict(X_test)\n",
+ "\n",
+ "mse = np.sqrt(mean_squared_error(y_test,pred))\n",
+ "print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')\n",
+ "\n",
+ "score = pipeline.score(X_train,y_train)\n",
+ "print('Model determination: ', score)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
+ },
+ "kernelspec": {
+ "display_name": "Python 3.7.0 64-bit ('3.7')",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.5"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "d77bd89ae7e79780c68c58bab91f13f8",
+ "translation_date": "2025-08-29T22:46:07+00:00",
+ "source_file": "2-Regression/3-Linear/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/4-Logistic/README.md b/translations/bn/2-Regression/4-Logistic/README.md
new file mode 100644
index 000000000..127e50bca
--- /dev/null
+++ b/translations/bn/2-Regression/4-Logistic/README.md
@@ -0,0 +1,404 @@
+
+# লজিস্টিক রিগ্রেশন দিয়ে ক্যাটাগরি প্রেডিকশন
+
+
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)
+
+> ### [এই লেসনটি R-এও পাওয়া যায়!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html)
+
+## ভূমিকা
+
+রিগ্রেশনের উপর এই চূড়ান্ত পাঠে, যা একটি মৌলিক _ক্লাসিক_ মেশিন লার্নিং কৌশল, আমরা লজিস্টিক রিগ্রেশনের দিকে নজর দেব। এই কৌশলটি ব্যবহার করে আপনি বাইনারি ক্যাটাগরি প্রেডিক্ট করার জন্য প্যাটার্ন খুঁজে বের করতে পারেন। এই ক্যান্ডি চকলেট কিনা? এই রোগ সংক্রামক কিনা? এই গ্রাহক এই পণ্যটি কিনবে কিনা?
+
+এই পাঠে আপনি শিখবেন:
+
+- ডেটা ভিজ্যুয়ালাইজেশনের জন্য একটি নতুন লাইব্রেরি
+- লজিস্টিক রিগ্রেশনের কৌশল
+
+✅ এই [Learn module](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott) থেকে এই ধরনের রিগ্রেশনের সাথে কাজ করার দক্ষতা আরও গভীর করুন।
+
+## পূর্বশর্ত
+
+কুমড়ার ডেটার সাথে কাজ করার পর, আমরা এখন যথেষ্ট পরিচিত যে বুঝতে পারি যে একটি বাইনারি ক্যাটাগরি আছে যার সাথে আমরা কাজ করতে পারি: `Color`।
+
+চলুন একটি লজিস্টিক রিগ্রেশন মডেল তৈরি করি যা প্রেডিক্ট করবে, কিছু ভেরিয়েবলের ভিত্তিতে, _একটি নির্দিষ্ট কুমড়ার রঙ কী হতে পারে_ (কমলা 🎃 বা সাদা 👻)।
+
+> কেন আমরা রিগ্রেশনের পাঠে বাইনারি ক্লাসিফিকেশনের কথা বলছি? শুধুমাত্র ভাষাগত সুবিধার জন্য, কারণ লজিস্টিক রিগ্রেশন [আসলে একটি ক্লাসিফিকেশন পদ্ধতি](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), যদিও এটি লিনিয়ার ভিত্তিক। পরবর্তী পাঠে ডেটা ক্লাসিফাই করার অন্যান্য পদ্ধতি সম্পর্কে জানুন।
+
+## প্রশ্ন নির্ধারণ
+
+আমাদের উদ্দেশ্যে, আমরা এটিকে একটি বাইনারি হিসেবে প্রকাশ করব: 'সাদা' বা 'সাদা নয়'। আমাদের ডেটাসেটে একটি 'স্ট্রাইপড' ক্যাটাগরিও আছে, কিন্তু এর উদাহরণ খুব কম, তাই আমরা এটি ব্যবহার করব না। যাই হোক, এটি ডেটাসেট থেকে নাল ভ্যালু সরানোর পর অদৃশ্য হয়ে যায়।
+
+> 🎃 মজার তথ্য, আমরা কখনও কখনও সাদা কুমড়াকে 'ভূত' কুমড়া বলি। এগুলো খোদাই করা খুব সহজ নয়, তাই এগুলো কমলা কুমড়ার মতো জনপ্রিয় নয়, কিন্তু দেখতে বেশ সুন্দর! সুতরাং আমরা আমাদের প্রশ্নটি এভাবেও পুনর্গঠন করতে পারি: 'ভূত' বা 'ভূত নয়'। 👻
+
+## লজিস্টিক রিগ্রেশন সম্পর্কে
+
+লজিস্টিক রিগ্রেশন লিনিয়ার রিগ্রেশনের থেকে কিছু গুরুত্বপূর্ণ দিক দিয়ে আলাদা, যা আপনি পূর্বে শিখেছেন।
+
+[](https://youtu.be/KpeCT6nEpBY "শিক্ষার্থীদের জন্য মেশিন লার্নিং - লজিস্টিক রিগ্রেশন বুঝুন")
+
+> 🎥 লজিস্টিক রিগ্রেশনের একটি সংক্ষিপ্ত ভিডিও ওভারভিউ দেখতে উপরের ছবিতে ক্লিক করুন।
+
+### বাইনারি ক্লাসিফিকেশন
+
+লজিস্টিক রিগ্রেশন লিনিয়ার রিগ্রেশনের মতো একই বৈশিষ্ট্য প্রদান করে না। প্রথমটি একটি বাইনারি ক্যাটাগরি সম্পর্কে প্রেডিকশন প্রদান করে ("সাদা বা সাদা নয়"), যেখানে দ্বিতীয়টি ধারাবাহিক মান প্রেডিক্ট করতে সক্ষম, যেমন কুমড়ার উৎপত্তি এবং ফসল কাটার সময়ের ভিত্তিতে, _এর দাম কতটা বাড়বে_।
+
+
+> ইনফোগ্রাফিক: [দাসানি মাদিপল্লি](https://twitter.com/dasani_decoded)
+
+### অন্যান্য ক্লাসিফিকেশন
+
+লজিস্টিক রিগ্রেশনের অন্যান্য ধরনও আছে, যেমন মাল্টিনোমিয়াল এবং অর্ডিনাল:
+
+- **মাল্টিনোমিয়াল**, যেখানে একাধিক ক্যাটাগরি থাকে - "কমলা, সাদা এবং স্ট্রাইপড"।
+- **অর্ডিনাল**, যেখানে ক্যাটাগরিগুলো ক্রমানুসারে সাজানো থাকে, যা তখনই উপকারী যখন আমরা আমাদের ফলাফলগুলোকে যৌক্তিকভাবে সাজাতে চাই, যেমন আমাদের কুমড়াগুলোকে আকার অনুযায়ী সাজানো (মিনি, ছোট, মাঝারি, বড়, এক্সএল, ডাবল এক্সএল)।
+
+
+
+### ভেরিয়েবলগুলোর সম্পর্ক থাকা জরুরি নয়
+
+মনে আছে লিনিয়ার রিগ্রেশন কিভাবে আরও ভালো কাজ করত যখন ভেরিয়েবলগুলোর মধ্যে সম্পর্ক বেশি ছিল? লজিস্টিক রিগ্রেশন ঠিক উল্টো - ভেরিয়েবলগুলোর সম্পর্ক থাকা জরুরি নয়। এটি এই ডেটার জন্য কার্যকর, যেখানে সম্পর্ক তুলনামূলকভাবে দুর্বল।
+
+### প্রচুর পরিষ্কার ডেটা প্রয়োজন
+
+লজিস্টিক রিগ্রেশন আরও সঠিক ফলাফল দেবে যদি আপনি বেশি ডেটা ব্যবহার করেন; আমাদের ছোট ডেটাসেট এই কাজের জন্য আদর্শ নয়, তাই এটি মনে রাখুন।
+
+[](https://youtu.be/B2X4H9vcXTs "শিক্ষার্থীদের জন্য মেশিন লার্নিং - লজিস্টিক রিগ্রেশনের জন্য ডেটা বিশ্লেষণ এবং প্রস্তুতি")
+
+> 🎥 লিনিয়ার রিগ্রেশনের জন্য ডেটা প্রস্তুতির একটি সংক্ষিপ্ত ভিডিও ওভারভিউ দেখতে উপরের ছবিতে ক্লিক করুন।
+
+✅ এমন ডেটার ধরন নিয়ে ভাবুন যা লজিস্টিক রিগ্রেশনের জন্য উপযুক্ত হতে পারে।
+
+## অনুশীলন - ডেটা পরিষ্কার করুন
+
+প্রথমে, ডেটা কিছুটা পরিষ্কার করুন, নাল ভ্যালু বাদ দিন এবং শুধুমাত্র কিছু কলাম নির্বাচন করুন:
+
+1. নিচের কোডটি যোগ করুন:
+
+ ```python
+
+ columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']
+ pumpkins = full_pumpkins.loc[:, columns_to_select]
+
+ pumpkins.dropna(inplace=True)
+ ```
+
+ আপনার নতুন ডেটাফ্রেমটি দেখতে চাইলে:
+
+ ```python
+ pumpkins.info
+ ```
+
+### ভিজ্যুয়ালাইজেশন - ক্যাটাগরিকাল প্লট
+
+এখন পর্যন্ত আপনি [স্টার্টার নোটবুক](./notebook.ipynb) এ কুমড়ার ডেটা লোড করেছেন এবং এটি পরিষ্কার করেছেন যাতে কিছু ভেরিয়েবল সহ একটি ডেটাসেট সংরক্ষণ করা যায়, যার মধ্যে `Color` অন্তর্ভুক্ত। চলুন নোটবুকে ডেটাফ্রেমটি ভিজ্যুয়ালাইজ করি একটি ভিন্ন লাইব্রেরি ব্যবহার করে: [Seaborn](https://seaborn.pydata.org/index.html), যা পূর্বে ব্যবহৃত Matplotlib এর উপর ভিত্তি করে তৈরি।
+
+Seaborn ডেটা ভিজ্যুয়ালাইজ করার কিছু চমৎকার উপায় প্রদান করে। উদাহরণস্বরূপ, আপনি `Variety` এবং `Color` এর জন্য ডেটার ডিস্ট্রিবিউশন তুলনা করতে পারেন একটি ক্যাটাগরিকাল প্লটে।
+
+1. `catplot` ফাংশন ব্যবহার করে একটি প্লট তৈরি করুন, আমাদের কুমড়ার ডেটা `pumpkins` ব্যবহার করে এবং প্রতিটি কুমড়া ক্যাটাগরির জন্য একটি রঙের ম্যাপিং নির্ধারণ করে (কমলা বা সাদা):
+
+ ```python
+ import seaborn as sns
+
+ palette = {
+ 'ORANGE': 'orange',
+ 'WHITE': 'wheat',
+ }
+
+ sns.catplot(
+ data=pumpkins, y="Variety", hue="Color", kind="count",
+ palette=palette,
+ )
+ ```
+
+ 
+
+ ডেটা পর্যবেক্ষণ করে, আপনি দেখতে পাবেন কিভাবে Color ডেটা Variety এর সাথে সম্পর্কিত।
+
+ ✅ এই ক্যাটাগরিকাল প্লট দেখে, আপনি কী ধরনের আকর্ষণীয় অনুসন্ধান কল্পনা করতে পারেন?
+
+### ডেটা প্রি-প্রসেসিং: ফিচার এবং লেবেল এনকোডিং
+আমাদের কুমড়ার ডেটাসেটে প্রতিটি কলামের জন্য স্ট্রিং মান রয়েছে। মানুষের জন্য ক্যাটাগরিকাল ডেটা নিয়ে কাজ করা সহজ হলেও মেশিনের জন্য তা নয়। মেশিন লার্নিং অ্যালগরিদমগুলো সংখ্যার সাথে ভালো কাজ করে। এজন্য এনকোডিং একটি গুরুত্বপূর্ণ ধাপ ডেটা প্রি-প্রসেসিং পর্যায়ে, কারণ এটি আমাদের ক্যাটাগরিকাল ডেটাকে সংখ্যায় রূপান্তর করতে সক্ষম করে, কোনো তথ্য হারানো ছাড়াই। ভালো এনকোডিং একটি ভালো মডেল তৈরিতে সহায়তা করে।
+
+ফিচার এনকোডিংয়ের জন্য দুটি প্রধান ধরনের এনকোডার রয়েছে:
+
+1. অর্ডিনাল এনকোডার: এটি অর্ডিনাল ভেরিয়েবলের জন্য উপযুক্ত, যা ক্যাটাগরিকাল ভেরিয়েবল যেখানে ডেটা যৌক্তিক ক্রম অনুসরণ করে, যেমন আমাদের ডেটাসেটের `Item Size` কলাম। এটি একটি ম্যাপিং তৈরি করে যাতে প্রতিটি ক্যাটাগরি একটি সংখ্যার দ্বারা উপস্থাপিত হয়, যা কলামে ক্যাটাগরির ক্রম।
+
+ ```python
+ from sklearn.preprocessing import OrdinalEncoder
+
+ item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']]
+ ordinal_features = ['Item Size']
+ ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
+ ```
+
+2. ক্যাটাগরিকাল এনকোডার: এটি নোমিনাল ভেরিয়েবলের জন্য উপযুক্ত, যা ক্যাটাগরিকাল ভেরিয়েবল যেখানে ডেটা যৌক্তিক ক্রম অনুসরণ করে না, যেমন আমাদের ডেটাসেটের `Item Size` ব্যতীত অন্যান্য ফিচার। এটি একটি ওয়ান-হট এনকোডিং, যার মানে প্রতিটি ক্যাটাগরি একটি বাইনারি কলামের দ্বারা উপস্থাপিত হয়: এনকোড করা ভেরিয়েবলটি 1 এর সমান যদি কুমড়া সেই Variety এর অন্তর্ভুক্ত হয় এবং অন্যথায় 0।
+
+ ```python
+ from sklearn.preprocessing import OneHotEncoder
+
+ categorical_features = ['City Name', 'Package', 'Variety', 'Origin']
+ categorical_encoder = OneHotEncoder(sparse_output=False)
+ ```
+এরপর, `ColumnTransformer` ব্যবহার করে একাধিক এনকোডারকে একটি ধাপে একত্রিত করা হয় এবং সেগুলোকে উপযুক্ত কলামে প্রয়োগ করা হয়।
+
+```python
+ from sklearn.compose import ColumnTransformer
+
+ ct = ColumnTransformer(transformers=[
+ ('ord', ordinal_encoder, ordinal_features),
+ ('cat', categorical_encoder, categorical_features)
+ ])
+
+ ct.set_output(transform='pandas')
+ encoded_features = ct.fit_transform(pumpkins)
+```
+অন্যদিকে, লেবেল এনকোড করতে, আমরা স্কিকিট-লার্নের `LabelEncoder` ক্লাস ব্যবহার করি, যা একটি ইউটিলিটি ক্লাস যা লেবেলগুলোকে স্বাভাবিক করতে সহায়তা করে যাতে সেগুলো শুধুমাত্র 0 থেকে n_classes-1 (এখানে, 0 এবং 1) এর মধ্যে মান ধারণ করে।
+
+```python
+ from sklearn.preprocessing import LabelEncoder
+
+ label_encoder = LabelEncoder()
+ encoded_label = label_encoder.fit_transform(pumpkins['Color'])
+```
+ফিচার এবং লেবেল এনকোড করার পর, আমরা সেগুলোকে একটি নতুন ডেটাফ্রেম `encoded_pumpkins` এ একত্রিত করতে পারি।
+
+```python
+ encoded_pumpkins = encoded_features.assign(Color=encoded_label)
+```
+✅ `Item Size` কলামের জন্য অর্ডিনাল এনকোডার ব্যবহারের সুবিধাগুলো কী?
+
+### ভেরিয়েবলগুলোর মধ্যে সম্পর্ক বিশ্লেষণ
+
+এখন যেহেতু আমরা আমাদের ডেটা প্রি-প্রসেস করেছি, আমরা ফিচার এবং লেবেলের মধ্যে সম্পর্ক বিশ্লেষণ করতে পারি যাতে মডেলটি ফিচারগুলো থেকে লেবেল প্রেডিক্ট করতে কতটা কার্যকর হবে তা বোঝা যায়।
+এই ধরনের বিশ্লেষণ করার সেরা উপায় হলো ডেটা প্লট করা। আমরা আবার Seaborn এর `catplot` ফাংশন ব্যবহার করব, `Item Size`, `Variety` এবং `Color` এর মধ্যে সম্পর্ক ভিজ্যুয়ালাইজ করতে একটি ক্যাটাগরিকাল প্লটে। ডেটা আরও ভালোভাবে প্লট করার জন্য আমরা এনকোড করা `Item Size` কলাম এবং আনএনকোড করা `Variety` কলাম ব্যবহার করব।
+
+```python
+ palette = {
+ 'ORANGE': 'orange',
+ 'WHITE': 'wheat',
+ }
+ pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
+
+ g = sns.catplot(
+ data=pumpkins,
+ x="Item Size", y="Color", row='Variety',
+ kind="box", orient="h",
+ sharex=False, margin_titles=True,
+ height=1.8, aspect=4, palette=palette,
+ )
+ g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
+ g.set_titles(row_template="{row_name}")
+```
+
+
+### একটি 'সোয়ার্ম' প্লট ব্যবহার করুন
+
+যেহেতু Color একটি বাইনারি ক্যাটাগরি (সাদা বা সাদা নয়), এটি ভিজ্যুয়ালাইজেশনের জন্য 'একটি [বিশেষ পদ্ধতি](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar)' প্রয়োজন। এই ক্যাটাগরির সাথে অন্যান্য ভেরিয়েবলের সম্পর্ক ভিজ্যুয়ালাইজ করার আরও উপায় রয়েছে।
+
+আপনি Seaborn প্লট ব্যবহার করে ভেরিয়েবলগুলোকে পাশাপাশি ভিজ্যুয়ালাইজ করতে পারেন।
+
+1. একটি 'সোয়ার্ম' প্লট চেষ্টা করুন যা মানগুলোর ডিস্ট্রিবিউশন দেখায়:
+
+ ```python
+ palette = {
+ 0: 'orange',
+ 1: 'wheat'
+ }
+ sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
+ ```
+
+ 
+
+**সতর্ক থাকুন**: উপরের কোডটি একটি সতর্কবার্তা তৈরি করতে পারে, কারণ Seaborn এত সংখ্যক ডেটাপয়েন্টকে সোয়ার্ম প্লটে উপস্থাপন করতে ব্যর্থ হতে পারে। একটি সম্ভাব্য সমাধান হলো মার্কারের আকার কমানো, 'size' প্যারামিটার ব্যবহার করে। তবে, মনে রাখবেন এটি প্লটের পাঠযোগ্যতাকে প্রভাবিত করতে পারে।
+
+> **🧮 আমাকে গাণিতিক ব্যাখ্যা দিন**
+>
+> লজিস্টিক রিগ্রেশন 'সর্বাধিক সম্ভাব্যতা' ধারণার উপর নির্ভর করে [সিগময়েড ফাংশন](https://wikipedia.org/wiki/Sigmoid_function) ব্যবহার করে। একটি 'সিগময়েড ফাংশন' একটি প্লটে 'S' আকৃতির দেখায়। এটি একটি মান নেয় এবং সেটিকে 0 এবং 1 এর মধ্যে কোথাও ম্যাপ করে। এর কার্ভটিকে 'লজিস্টিক কার্ভ'ও বলা হয়। এর সূত্রটি এ রকম দেখায়:
+>
+> 
+>
+> যেখানে সিগময়েডের মধ্যবিন্দু x এর 0 পয়েন্টে থাকে, L হলো কার্ভের সর্বাধিক মান, এবং k হলো কার্ভের খাড়াভাব। যদি ফাংশনের ফলাফল 0.5 এর বেশি হয়, সংশ্লিষ্ট লেবেলটি বাইনারি পছন্দের '1' ক্লাসে দেওয়া হবে। অন্যথায়, এটি '0' হিসেবে শ্রেণীবদ্ধ হবে।
+
+## আপনার মডেল তৈরি করুন
+
+স্কিকিট-লার্নে এই বাইনারি ক্লাসিফিকেশন খুঁজে বের করার জন্য একটি মডেল তৈরি করা আশ্চর্যজনকভাবে সহজ।
+
+[](https://youtu.be/MmZS2otPrQ8 "শিক্ষার্থীদের জন্য মেশিন লার্নিং - ডেটা ক্লাসিফিকেশনের জন্য লজিস্টিক রিগ্রেশন")
+
+> 🎥 একটি লিনিয়ার রিগ্রেশন মডেল তৈরির সংক্ষিপ্ত ভিডিও ওভারভিউ দেখতে উপরের ছবিতে ক্লিক করুন।
+
+1. আপনার ক্লাসিফিকেশন মডেলে ব্যবহার করতে চান এমন ভেরিয়েবলগুলো নির্বাচন করুন এবং `train_test_split()` কল করে ট্রেনিং এবং টেস্ট সেটগুলো ভাগ করুন:
+
+ ```python
+ from sklearn.model_selection import train_test_split
+
+ X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]
+ y = encoded_pumpkins['Color']
+
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
+
+ ```
+
+2. এখন আপনি আপনার মডেলটি ট্রেন করতে পারেন, আপনার ট্রেনিং ডেটা দিয়ে `fit()` কল করে, এবং এর ফলাফল প্রিন্ট করতে পারেন:
+
+ ```python
+ from sklearn.metrics import f1_score, classification_report
+ from sklearn.linear_model import LogisticRegression
+
+ model = LogisticRegression()
+ model.fit(X_train, y_train)
+ predictions = model.predict(X_test)
+
+ print(classification_report(y_test, predictions))
+ print('Predicted labels: ', predictions)
+ print('F1-score: ', f1_score(y_test, predictions))
+ ```
+
+ আপনার মডেলের স্কোরবোর্ডটি দেখুন। এটি খারাপ নয়, বিশেষ করে যখন আপনার কাছে মাত্র ১০০০টি ডেটা রো আছে:
+
+ ```output
+ precision recall f1-score support
+
+ 0 0.94 0.98 0.96 166
+ 1 0.85 0.67 0.75 33
+
+ accuracy 0.92 199
+ macro avg 0.89 0.82 0.85 199
+ weighted avg 0.92 0.92 0.92 199
+
+ Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 0 0 0 1 0 0 0 0 0 0 0 0 1 1]
+ F1-score: 0.7457627118644068
+ ```
+
+## কনফিউশন ম্যাট্রিক্সের মাধ্যমে আরও ভালো বোঝাপড়া
+
+যদিও আপনি উপরের আইটেমগুলো প্রিন্ট করে একটি স্কোরবোর্ড রিপোর্ট [টার্ম](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) পেতে পারেন, আপনি সম্ভবত একটি [কনফিউশন ম্যাট্রিক্স](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) ব্যবহার করে আপনার মডেলটি আরও সহজে বুঝতে পারবেন, যা আমাদের মডেলের কার্যকারিতা বোঝাতে সাহায্য করে।
+
+> 🎓 একটি '[কনফিউশন ম্যাট্রিক্স](https://wikipedia.org/wiki/Confusion_matrix)' (বা 'এরর ম্যাট্রিক্স') হলো একটি টেবিল যা আপনার মডেলের সত্য বনাম মিথ্যা পজিটিভ এবং নেগেটিভ প্রকাশ করে, এভাবে প্রেডিকশনের সঠিকতা পরিমাপ করে।
+
+1. একটি কনফিউশন ম্যাট্রিক্স ব্যবহার করতে, `confusion_matrix()` কল করুন:
+
+ ```python
+ from sklearn.metrics import confusion_matrix
+ confusion_matrix(y_test, predictions)
+ ```
+
+ আপনার মডেলের কনফিউশন ম্যাট্রিক্সটি দেখুন:
+
+ ```output
+ array([[162, 4],
+ [ 11, 22]])
+ ```
+
+স্কিকিট-লার্নে, কনফিউশন ম্যাট্রিক্সের সারি (অক্ষ 0) হলো প্রকৃত লেবেল এবং কলাম (অক্ষ 1) হলো প্রেডিক্টেড লেবেল।
+
+| | 0 | 1 |
+| :---: | :---: | :---: |
+| 0 | TN | FP |
+| 1 | FN | TP |
+
+এখানে কী ঘটছে? ধরুন আমাদের মডেলকে কুমড়াগুলোকে দুটি বাইনার
+কনফিউশন ম্যাট্রিক্স কীভাবে প্রিসিশন এবং রিকল-এর সাথে সম্পর্কিত? মনে রাখুন, উপরে প্রিন্ট করা ক্লাসিফিকেশন রিপোর্টে প্রিসিশন (0.85) এবং রিকল (0.67) দেখানো হয়েছিল।
+
+প্রিসিশন = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461
+
+রিকল = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666
+
+✅ প্রশ্ন: কনফিউশন ম্যাট্রিক্স অনুযায়ী মডেলটি কেমন করেছে? উত্তর: খারাপ নয়; বেশ কিছু ট্রু নেগেটিভ আছে, তবে কিছু ফলস নেগেটিভও রয়েছে।
+
+চলুন, কনফিউশন ম্যাট্রিক্সের TP/TN এবং FP/FN ম্যাপিংয়ের সাহায্যে আমরা আগে দেখা টার্মগুলো আবার দেখে নিই:
+
+🎓 প্রিসিশন: TP/(TP + FP)
+রিট্রিভ করা ইনস্ট্যান্সগুলোর মধ্যে প্রাসঙ্গিক ইনস্ট্যান্সের অনুপাত (যেমন, কোন লেবেলগুলো সঠিকভাবে লেবেল করা হয়েছে)
+
+🎓 রিকল: TP/(TP + FN)
+প্রাসঙ্গিক ইনস্ট্যান্সগুলোর অনুপাত যা রিট্রিভ করা হয়েছে, সঠিকভাবে লেবেল করা হোক বা না হোক
+
+🎓 f1-স্কোর: (2 * প্রিসিশন * রিকল)/(প্রিসিশন + রিকল)
+প্রিসিশন এবং রিকলের একটি ওজনযুক্ত গড়, যেখানে সর্বোচ্চ মান 1 এবং সর্বনিম্ন মান 0
+
+🎓 সাপোর্ট: প্রতিটি লেবেলের রিট্রিভ হওয়া ঘটনার সংখ্যা
+
+🎓 একিউরেসি: (TP + TN)/(TP + TN + FP + FN)
+একটি স্যাম্পলের জন্য সঠিকভাবে প্রেডিক্ট করা লেবেলের শতাংশ।
+
+🎓 ম্যাক্রো অ্যাভারেজ: প্রতিটি লেবেলের জন্য ওজনহীন গড় মেট্রিকের হিসাব, লেবেলের ভারসাম্যকে বিবেচনায় না নিয়ে।
+
+🎓 ওয়েটেড অ্যাভারেজ: প্রতিটি লেবেলের জন্য গড় মেট্রিকের হিসাব, সাপোর্ট (প্রতিটি লেবেলের জন্য সত্যিকারের ঘটনার সংখ্যা) দ্বারা ওজন করে লেবেলের ভারসাম্যকে বিবেচনায় নিয়ে।
+
+✅ আপনি কি ভাবতে পারেন কোন মেট্রিকটি আপনি মনোযোগ দেবেন যদি আপনি চান আপনার মডেল ফলস নেগেটিভের সংখ্যা কমিয়ে আনুক?
+
+## এই মডেলের ROC কার্ভ ভিজুয়ালাইজ করুন
+
+[](https://youtu.be/GApO575jTA0 "ML for beginners - Analyzing Logistic Regression Performance with ROC Curves")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন ROC কার্ভের একটি সংক্ষিপ্ত ভিডিও ওভারভিউ দেখার জন্য
+
+চলুন, আমরা আরেকটি ভিজুয়ালাইজেশন করি যাতে তথাকথিত 'ROC' কার্ভ দেখা যায়:
+
+```python
+from sklearn.metrics import roc_curve, roc_auc_score
+import matplotlib
+import matplotlib.pyplot as plt
+%matplotlib inline
+
+y_scores = model.predict_proba(X_test)
+fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
+
+fig = plt.figure(figsize=(6, 6))
+plt.plot([0, 1], [0, 1], 'k--')
+plt.plot(fpr, tpr)
+plt.xlabel('False Positive Rate')
+plt.ylabel('True Positive Rate')
+plt.title('ROC Curve')
+plt.show()
+```
+
+Matplotlib ব্যবহার করে মডেলের [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) বা ROC প্লট করুন। ROC কার্ভ সাধারণত একটি ক্লাসিফায়ারের আউটপুটের একটি ভিউ পেতে ব্যবহৃত হয়, যা ট্রু পজিটিভ বনাম ফলস পজিটিভের দিক থেকে। "ROC কার্ভ সাধারণত Y অক্ষে ট্রু পজিটিভ রেট এবং X অক্ষে ফলস পজিটিভ রেট দেখায়।" তাই কার্ভের খাড়া হওয়া এবং মধ্যরেখা ও কার্ভের মধ্যবর্তী স্থান গুরুত্বপূর্ণ: আপনি এমন একটি কার্ভ চান যা দ্রুত উপরে উঠে এবং রেখার ওপরে চলে যায়। আমাদের ক্ষেত্রে, শুরুতে কিছু ফলস পজিটিভ রয়েছে, তারপর রেখাটি সঠিকভাবে উপরে উঠে যায়:
+
+
+
+শেষে, Scikit-learn-এর [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) ব্যবহার করে প্রকৃত 'Area Under the Curve' (AUC) গণনা করুন:
+
+```python
+auc = roc_auc_score(y_test,y_scores[:,1])
+print(auc)
+```
+ফলাফল হলো `0.9749908725812341`। যেহেতু AUC-এর মান 0 থেকে 1 পর্যন্ত হয়, আপনি একটি বড় স্কোর চান, কারণ একটি মডেল যা 100% সঠিক প্রেডিকশন করে তার AUC হবে 1; এই ক্ষেত্রে, মডেলটি _খুব ভালো_।
+
+ভবিষ্যতের ক্লাসিফিকেশন লেসনে, আপনি শিখবেন কীভাবে আপনার মডেলের স্কোর উন্নত করতে ইটারেট করবেন। তবে আপাতত, অভিনন্দন! আপনি এই রিগ্রেশন লেসনগুলো সম্পন্ন করেছেন!
+
+---
+## 🚀চ্যালেঞ্জ
+
+লজিস্টিক রিগ্রেশন সম্পর্কে আরও অনেক কিছু জানার আছে! তবে শেখার সেরা উপায় হলো পরীক্ষা-নিরীক্ষা করা। এমন একটি ডেটাসেট খুঁজুন যা এই ধরনের বিশ্লেষণের জন্য উপযুক্ত এবং এর সাথে একটি মডেল তৈরি করুন। আপনি কী শিখলেন? টিপ: [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) এ আকর্ষণীয় ডেটাসেট খুঁজে দেখুন।
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/16/)
+
+## রিভিউ এবং স্ব-অধ্যয়ন
+
+[স্ট্যানফোর্ডের এই পেপারের](https://web.stanford.edu/~jurafsky/slp3/5.pdf) প্রথম কয়েকটি পৃষ্ঠা পড়ুন যেখানে লজিস্টিক রিগ্রেশনের কিছু ব্যবহারিক প্রয়োগ নিয়ে আলোচনা করা হয়েছে। এমন কাজগুলো নিয়ে ভাবুন যা আমরা এখন পর্যন্ত অধ্যয়ন করা রিগ্রেশন টাস্কগুলোর মধ্যে একটির জন্য বেশি উপযুক্ত। কোনটি সবচেয়ে ভালো কাজ করবে?
+
+## অ্যাসাইনমেন্ট
+
+[এই রিগ্রেশনটি পুনরায় চেষ্টা করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/4-Logistic/assignment.md b/translations/bn/2-Regression/4-Logistic/assignment.md
new file mode 100644
index 000000000..d2b4a46e9
--- /dev/null
+++ b/translations/bn/2-Regression/4-Logistic/assignment.md
@@ -0,0 +1,25 @@
+
+# কিছু রিগ্রেশন পুনরায় চেষ্টা করা
+
+## নির্দেশাবলী
+
+পাঠে, আপনি কুমড়ার ডেটার একটি অংশ ব্যবহার করেছিলেন। এখন, মূল ডেটায় ফিরে যান এবং সম্পূর্ণ ডেটা, যা পরিষ্কার এবং মানানসই করা হয়েছে, ব্যবহার করে একটি Logistic Regression মডেল তৈরি করার চেষ্টা করুন।
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ----------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- |
+| | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে একটি ভালোভাবে ব্যাখ্যা করা এবং ভালোভাবে কার্যকরী মডেল রয়েছে | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে একটি মডেল ন্যূনতম কার্যকরী | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে একটি দুর্বল কার্যকরী মডেল রয়েছে বা কোনো মডেল নেই |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/4-Logistic/notebook.ipynb b/translations/bn/2-Regression/4-Logistic/notebook.ipynb
new file mode 100644
index 000000000..de9062eeb
--- /dev/null
+++ b/translations/bn/2-Regression/4-Logistic/notebook.ipynb
@@ -0,0 +1,269 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## কুমড়ার প্রজাতি এবং রঙ\n",
+ "\n",
+ "প্রয়োজনীয় লাইব্রেরি এবং ডেটাসেট লোড করুন। ডেটাকে একটি ডেটাফ্রেমে রূপান্তর করুন যা ডেটার একটি অংশ ধারণ করে:\n",
+ "\n",
+ "চলুন রঙ এবং প্রজাতির মধ্যে সম্পর্কটি দেখি\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Type
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Sub Variety
\n",
+ "
Grade
\n",
+ "
Date
\n",
+ "
Low Price
\n",
+ "
High Price
\n",
+ "
Mostly Low
\n",
+ "
...
\n",
+ "
Unit of Sale
\n",
+ "
Quality
\n",
+ "
Condition
\n",
+ "
Appearance
\n",
+ "
Storage
\n",
+ "
Crop
\n",
+ "
Repack
\n",
+ "
Trans Mode
\n",
+ "
Unnamed: 24
\n",
+ "
Unnamed: 25
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
4/29/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
5/6/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
11/5/16
\n",
+ "
90.0
\n",
+ "
100.0
\n",
+ "
90.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Type Package Variety Sub Variety Grade Date \\\n",
+ "0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \n",
+ "1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n",
+ "2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n",
+ "\n",
+ " Low Price High Price Mostly Low ... Unit of Sale Quality Condition \\\n",
+ "0 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "1 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "2 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "3 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "4 90.0 100.0 90.0 ... NaN NaN NaN \n",
+ "\n",
+ " Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n",
+ "0 NaN NaN NaN E NaN NaN NaN \n",
+ "1 NaN NaN NaN E NaN NaN NaN \n",
+ "2 NaN NaN NaN N NaN NaN NaN \n",
+ "3 NaN NaN NaN N NaN NaN NaN \n",
+ "4 NaN NaN NaN N NaN NaN NaN \n",
+ "\n",
+ "[5 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n",
+ "full_pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
+ "\n",
+ "full_pumpkins.head()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.1"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "dee08c2b49057b0de8b6752c4dbca368",
+ "translation_date": "2025-08-29T22:57:30+00:00",
+ "source_file": "2-Regression/4-Logistic/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/4-Logistic/solution/Julia/README.md b/translations/bn/2-Regression/4-Logistic/solution/Julia/README.md
new file mode 100644
index 000000000..e593c2b33
--- /dev/null
+++ b/translations/bn/2-Regression/4-Logistic/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb b/translations/bn/2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb
new file mode 100644
index 000000000..60ec24621
--- /dev/null
+++ b/translations/bn/2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb
@@ -0,0 +1,685 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## লজিস্টিক রিগ্রেশন মডেল তৈরি করুন - পাঠ ৪\n",
+ "\n",
+ "\n",
+ "\n",
+ "#### **[পাঠের পূর্ববর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)**\n",
+ "\n",
+ "#### ভূমিকা\n",
+ "\n",
+ "রিগ্রেশনের উপর এই চূড়ান্ত পাঠে, যা একটি মৌলিক *ক্লাসিক* মেশিন লার্নিং কৌশল, আমরা লজিস্টিক রিগ্রেশন নিয়ে আলোচনা করব। এই কৌশলটি ব্যবহার করে আপনি প্যাটার্ন খুঁজে বের করতে পারেন যা বাইনারি ক্যাটাগরি পূর্বাভাস দিতে সাহায্য করে। এই ক্যান্ডি চকলেট কিনা? এই রোগ সংক্রামক কিনা? এই গ্রাহক এই পণ্যটি কিনবে কিনা?\n",
+ "\n",
+ "এই পাঠে আপনি শিখবেন:\n",
+ "\n",
+ "- লজিস্টিক রিগ্রেশনের কৌশলসমূহ\n",
+ "\n",
+ "✅ এই [Learn module](https://learn.microsoft.com/training/modules/introduction-classification-models/?WT.mc_id=academic-77952-leestott) এ এই ধরনের রিগ্রেশনের সাথে কাজ করার দক্ষতা আরও গভীর করুন।\n",
+ "\n",
+ "## পূর্বশর্ত\n",
+ "\n",
+ "কুমড়ার ডেটা নিয়ে কাজ করার পর, আমরা এখন এটি সম্পর্কে যথেষ্ট পরিচিত হয়েছি যাতে বুঝতে পারি যে একটি বাইনারি ক্যাটাগরি রয়েছে যার সাথে আমরা কাজ করতে পারি: `Color`।\n",
+ "\n",
+ "চলুন একটি লজিস্টিক রিগ্রেশন মডেল তৈরি করি যা পূর্বাভাস দিতে পারে, কিছু ভেরিয়েবল দেওয়া হলে, *একটি নির্দিষ্ট কুমড়ার রঙ কী হতে পারে* (কমলা 🎃 বা সাদা 👻)।\n",
+ "\n",
+ "> আমরা কেন রিগ্রেশনের পাঠে বাইনারি ক্লাসিফিকেশন নিয়ে আলোচনা করছি? শুধুমাত্র ভাষাগত সুবিধার জন্য, কারণ লজিস্টিক রিগ্রেশন [আসলে একটি ক্লাসিফিকেশন পদ্ধতি](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), যদিও এটি লিনিয়ার-ভিত্তিক। ডেটা ক্লাসিফাই করার অন্যান্য পদ্ধতি সম্পর্কে পরবর্তী পাঠে জানুন।\n",
+ "\n",
+ "এই পাঠের জন্য, আমাদের নিম্নলিখিত প্যাকেজগুলোর প্রয়োজন হবে:\n",
+ "\n",
+ "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) হলো একটি [R প্যাকেজের সংগ্রহ](https://www.tidyverse.org/packages) যা ডেটা সায়েন্সকে দ্রুত, সহজ এবং আরও মজাদার করে তোলে!\n",
+ "\n",
+ "- `tidymodels`: [tidymodels](https://www.tidymodels.org/) ফ্রেমওয়ার্ক হলো মডেলিং এবং মেশিন লার্নিংয়ের জন্য একটি [প্যাকেজের সংগ্রহ](https://www.tidymodels.org/packages/)।\n",
+ "\n",
+ "- `janitor`: [janitor প্যাকেজ](https://github.com/sfirke/janitor) ডেটা পরীক্ষা এবং পরিষ্কার করার জন্য সহজ সরঞ্জাম সরবরাহ করে।\n",
+ "\n",
+ "- `ggbeeswarm`: [ggbeeswarm প্যাকেজ](https://github.com/eclarke/ggbeeswarm) ggplot2 ব্যবহার করে beeswarm-স্টাইল প্লট তৈরি করার পদ্ধতি সরবরাহ করে।\n",
+ "\n",
+ "আপনি এগুলো ইনস্টল করতে পারেন:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"ggbeeswarm\"))`\n",
+ "\n",
+ "অথবা, নিচের স্ক্রিপ্টটি পরীক্ষা করে দেখবে যে আপনার এই মডিউল সম্পন্ন করার জন্য প্রয়োজনীয় প্যাকেজগুলো আছে কিনা এবং যদি না থাকে তবে সেগুলো ইনস্টল করবে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
+ "\n",
+ "pacman::p_load(tidyverse, tidymodels, janitor, ggbeeswarm)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## **প্রশ্নটি সংজ্ঞায়িত করুন**\n",
+ "\n",
+ "আমাদের উদ্দেশ্যে, আমরা এটিকে একটি বাইনারি আকারে প্রকাশ করব: 'সাদা' বা 'সাদা নয়'। আমাদের ডেটাসেটে একটি 'ডোরা কাটা' বিভাগও রয়েছে, তবে এর উদাহরণ খুব কম, তাই আমরা এটি ব্যবহার করব না। যাই হোক, এটি ডেটাসেট থেকে null মান সরানোর পর অদৃশ্য হয়ে যায়।\n",
+ "\n",
+ "> 🎃 মজার তথ্য, আমরা কখনও কখনও সাদা কুমড়াকে 'ভূত' কুমড়া বলে থাকি। এগুলো খোদাই করা খুব সহজ নয়, তাই এগুলো কম জনপ্রিয়, তবে দেখতে বেশ আকর্ষণীয়! সুতরাং আমরা আমাদের প্রশ্নটি এভাবে পুনর্গঠন করতে পারি: 'ভূত' বা 'ভূত নয়'। 👻\n",
+ "\n",
+ "## **লজিস্টিক রিগ্রেশন সম্পর্কে**\n",
+ "\n",
+ "লজিস্টিক রিগ্রেশন কিছু গুরুত্বপূর্ণ উপায়ে পূর্বে শেখা লিনিয়ার রিগ্রেশন থেকে আলাদা।\n",
+ "\n",
+ "#### **বাইনারি শ্রেণীবিভাগ**\n",
+ "\n",
+ "লজিস্টিক রিগ্রেশন লিনিয়ার রিগ্রেশনের মতো একই বৈশিষ্ট্য প্রদান করে না। প্রথমটি একটি `বাইনারি বিভাগ` (\"কমলা বা কমলা নয়\") সম্পর্কে পূর্বাভাস দেয়, যেখানে দ্বিতীয়টি `ধারাবাহিক মান` পূর্বাভাস দিতে সক্ষম, যেমন কুমড়ার উৎপত্তি এবং ফসল তোলার সময় দেওয়া হলে, *এর দাম কতটা বাড়বে*।\n",
+ "\n",
+ "\n",
+ "\n",
+ "### অন্যান্য শ্রেণীবিভাগ\n",
+ "\n",
+ "লজিস্টিক রিগ্রেশনের অন্যান্য ধরন রয়েছে, যেমন মাল্টিনোমিয়াল এবং অর্ডিনাল:\n",
+ "\n",
+ "- **মাল্টিনোমিয়াল**, যেখানে একাধিক বিভাগ থাকে - \"কমলা, সাদা এবং ডোরা কাটা\"।\n",
+ "\n",
+ "- **অর্ডিনাল**, যেখানে ক্রমানুসারে বিভাগ থাকে, যা আমাদের ফলাফলগুলোকে যৌক্তিকভাবে সাজাতে সাহায্য করে, যেমন আমাদের কুমড়াগুলো যা একটি নির্দিষ্ট সংখ্যক আকারে সাজানো থাকে (মিনি, ছোট, মাঝারি, বড়, এক্সএল, ডাবল এক্সএল)।\n",
+ "\n",
+ "\n",
+ "\n",
+ "#### **ভেরিয়েবলগুলোর মধ্যে সম্পর্ক থাকা জরুরি নয়**\n",
+ "\n",
+ "আপনি কি মনে করেন লিনিয়ার রিগ্রেশন আরও ভালো কাজ করত যদি ভেরিয়েবলগুলো আরও বেশি সম্পর্কিত হতো? লজিস্টিক রিগ্রেশন ঠিক উল্টো - ভেরিয়েবলগুলোকে একে অপরের সাথে সামঞ্জস্যপূর্ণ হতে হবে না। এটি এই ডেটার জন্য কার্যকর, যেখানে সম্পর্কগুলো তুলনামূলকভাবে দুর্বল।\n",
+ "\n",
+ "#### **আপনার অনেক পরিষ্কার ডেটা দরকার**\n",
+ "\n",
+ "লজিস্টিক রিগ্রেশন আরও সঠিক ফলাফল দেবে যদি আপনি বেশি ডেটা ব্যবহার করেন; আমাদের ছোট ডেটাসেট এই কাজের জন্য আদর্শ নয়, তাই এটি মনে রাখুন।\n",
+ "\n",
+ "✅ এমন ডেটার ধরন সম্পর্কে চিন্তা করুন যা লজিস্টিক রিগ্রেশনের জন্য উপযুক্ত হতে পারে।\n",
+ "\n",
+ "## অনুশীলন - ডেটা পরিষ্কার করুন\n",
+ "\n",
+ "প্রথমে, ডেটা একটু পরিষ্কার করুন, null মানগুলো বাদ দিন এবং শুধুমাত্র কিছু কলাম নির্বাচন করুন:\n",
+ "\n",
+ "1. নিম্নলিখিত কোড যোগ করুন:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Load the core tidyverse packages\n",
+ "library(tidyverse)\n",
+ "\n",
+ "# Import the data and clean column names\n",
+ "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\") %>% \n",
+ " clean_names()\n",
+ "\n",
+ "# Select desired columns\n",
+ "pumpkins_select <- pumpkins %>% \n",
+ " select(c(city_name, package, variety, origin, item_size, color)) \n",
+ "\n",
+ "# Drop rows containing missing values and encode color as factor (category)\n",
+ "pumpkins_select <- pumpkins_select %>% \n",
+ " drop_na() %>% \n",
+ " mutate(color = factor(color))\n",
+ "\n",
+ "# View the first few rows\n",
+ "pumpkins_select %>% \n",
+ " slice_head(n = 5)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "আপনি সবসময় আপনার নতুন ডেটাফ্রেমটি একবার দেখে নিতে পারেন, নিচের মতো [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) ফাংশন ব্যবহার করে:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "pumpkins_select %>% \n",
+ " glimpse()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "চলুন নিশ্চিত করি যে আমরা আসলে একটি বাইনারি শ্রেণীবিন্যাস সমস্যা করতে যাচ্ছি:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Subset distinct observations in outcome column\n",
+ "pumpkins_select %>% \n",
+ " distinct(color)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### ভিজুয়ালাইজেশন - শ্রেণীবদ্ধ প্লট\n",
+ "এখন পর্যন্ত আপনি আবারও কুমড়ার ডেটা লোড করেছেন এবং এটি পরিষ্কার করেছেন যাতে কিছু ভেরিয়েবলসহ একটি ডেটাসেট সংরক্ষণ করা যায়, যার মধ্যে রঙ অন্তর্ভুক্ত রয়েছে। চলুন নোটবুকে ggplot লাইব্রেরি ব্যবহার করে ডেটাফ্রেমটি ভিজুয়ালাইজ করি।\n",
+ "\n",
+ "ggplot লাইব্রেরি আপনার ডেটা ভিজুয়ালাইজ করার জন্য কিছু চমৎকার উপায় প্রদান করে। উদাহরণস্বরূপ, আপনি একটি শ্রেণীবদ্ধ প্লটে প্রতিটি Variety এবং Color এর জন্য ডেটার বিতরণ তুলনা করতে পারেন।\n",
+ "\n",
+ "1. geombar ফাংশন ব্যবহার করে এমন একটি প্লট তৈরি করুন, আমাদের কুমড়ার ডেটা ব্যবহার করে, এবং প্রতিটি কুমড়ার ক্যাটাগরির (কমলা বা সাদা) জন্য একটি রঙের ম্যাপিং নির্দিষ্ট করুন:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Specify colors for each value of the hue variable\n",
+ "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
+ "\n",
+ "# Create the bar plot\n",
+ "ggplot(pumpkins_select, aes(y = variety, fill = color)) +\n",
+ " geom_bar(position = \"dodge\") +\n",
+ " scale_fill_manual(values = palette) +\n",
+ " labs(y = \"Variety\", fill = \"Color\") +\n",
+ " theme_minimal()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "ডেটা পর্যবেক্ষণ করে, আপনি দেখতে পারেন কীভাবে রঙের ডেটা বৈচিত্র্যের সাথে সম্পর্কিত।\n",
+ "\n",
+ "✅ এই শ্রেণীবদ্ধ প্লটটি দেখে, আপনি কী কী আকর্ষণীয় অনুসন্ধান কল্পনা করতে পারেন?\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### ডেটা প্রি-প্রসেসিং: ফিচার এনকোডিং\n",
+ "\n",
+ "আমাদের পাম্পকিনস ডেটাসেটে সমস্ত কলামের জন্য স্ট্রিং মান রয়েছে। মানুষের জন্য ক্যাটেগরিকাল ডেটা নিয়ে কাজ করা সহজ হলেও মেশিনের জন্য তা নয়। মেশিন লার্নিং অ্যালগরিদমগুলো সংখ্যার সাথে ভালো কাজ করে। এজন্য এনকোডিং ডেটা প্রি-প্রসেসিং ধাপের একটি অত্যন্ত গুরুত্বপূর্ণ অংশ, কারণ এটি আমাদের ক্যাটেগরিকাল ডেটাকে সংখ্যায় রূপান্তর করতে সাহায্য করে, কোনো তথ্য হারানো ছাড়াই। ভালো এনকোডিং একটি ভালো মডেল তৈরিতে সহায়ক হয়।\n",
+ "\n",
+ "ফিচার এনকোডিংয়ের জন্য দুটি প্রধান ধরনের এনকোডার রয়েছে:\n",
+ "\n",
+ "1. **অর্ডিনাল এনকোডার**: এটি অর্ডিনাল ভ্যারিয়েবলগুলোর জন্য উপযুক্ত, যা ক্যাটেগরিকাল ভ্যারিয়েবল যেখানে ডেটা একটি যৌক্তিক ক্রম অনুসরণ করে, যেমন আমাদের ডেটাসেটের `item_size` কলাম। এটি একটি ম্যাপিং তৈরি করে যেখানে প্রতিটি ক্যাটেগরি একটি সংখ্যার মাধ্যমে উপস্থাপিত হয়, যা কলামে ক্যাটেগরির ক্রম নির্দেশ করে।\n",
+ "\n",
+ "2. **ক্যাটেগরিকাল এনকোডার**: এটি নোমিনাল ভ্যারিয়েবলগুলোর জন্য উপযুক্ত, যা ক্যাটেগরিকাল ভ্যারিয়েবল যেখানে ডেটা কোনো যৌক্তিক ক্রম অনুসরণ করে না, যেমন আমাদের ডেটাসেটে `item_size` ব্যতীত অন্যান্য ফিচার। এটি একটি ওয়ান-হট এনকোডিং, যার অর্থ প্রতিটি ক্যাটেগরি একটি বাইনারি কলামের মাধ্যমে উপস্থাপিত হয়: এনকোড করা ভ্যারিয়েবলটি 1 হয় যদি পাম্পকিন সেই ভ্যারাইটির অন্তর্ভুক্ত হয় এবং অন্যথায় 0 হয়।\n",
+ "\n",
+ "**Tidymodels** আরেকটি চমৎকার প্যাকেজ সরবরাহ করে: [recipes](https://recipes.tidymodels.org/) - ডেটা প্রি-প্রসেসিংয়ের জন্য একটি প্যাকেজ। আমরা একটি `recipe` সংজ্ঞায়িত করব যা নির্ধারণ করবে যে সমস্ত প্রেডিক্টর কলামগুলোকে একটি সেট ইন্টিজারে এনকোড করা উচিত, `prep` ব্যবহার করে প্রয়োজনীয় পরিমাণ এবং পরিসংখ্যান অনুমান করব যা কোনো অপারেশনের জন্য প্রয়োজন এবং শেষে `bake` ব্যবহার করে নতুন ডেটায় সেই গণনাগুলো প্রয়োগ করব।\n",
+ "\n",
+ "> সাধারণত, **recipes** সাধারণত মডেলিংয়ের জন্য একটি প্রি-প্রসেসর হিসেবে ব্যবহৃত হয় যেখানে এটি নির্ধারণ করে যে একটি ডেটাসেটের উপর মডেলিংয়ের জন্য প্রস্তুত করতে কী ধাপগুলো প্রয়োগ করা উচিত। এই ক্ষেত্রে, এটি **অত্যন্ত সুপারিশ করা হয়** যে আপনি `workflow()` ব্যবহার করুন, `prep` এবং `bake` ব্যবহার করে ম্যানুয়ালি একটি রেসিপি অনুমান করার পরিবর্তে। আমরা এটি কিছুক্ষণের মধ্যেই দেখব।\n",
+ ">\n",
+ "> তবে আপাতত, আমরা **recipes + prep + bake** ব্যবহার করছি একটি ডেটাসেটের উপর কী ধাপগুলো প্রয়োগ করা উচিত তা নির্ধারণ করতে যাতে এটি ডেটা বিশ্লেষণের জন্য প্রস্তুত হয় এবং প্রয়োগ করা ধাপগুলো সহ প্রি-প্রসেসড ডেটা বের করতে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Preprocess and extract data to allow some data analysis\n",
+ "baked_pumpkins <- recipe(color ~ ., data = pumpkins_select) %>%\n",
+ " # Define ordering for item_size column\n",
+ " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
+ " # Convert factors to numbers using the order defined above (Ordinal encoding)\n",
+ " step_integer(item_size, zero_based = F) %>%\n",
+ " # Encode all other predictors using one hot encoding\n",
+ " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE) %>%\n",
+ " prep(data = pumpkin_select) %>%\n",
+ " bake(new_data = NULL)\n",
+ "\n",
+ "# Display the first few rows of preprocessed data\n",
+ "baked_pumpkins %>% \n",
+ " slice_head(n = 5)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "✅ আইটেম সাইজ কলামের জন্য অর্ডিনাল এনকোডার ব্যবহারের সুবিধাগুলো কী?\n",
+ "\n",
+ "### ভেরিয়েবলগুলোর মধ্যে সম্পর্ক বিশ্লেষণ\n",
+ "\n",
+ "এখন যেহেতু আমরা আমাদের ডেটা প্রি-প্রসেস করেছি, আমরা ফিচার এবং লেবেলের মধ্যে সম্পর্ক বিশ্লেষণ করতে পারি, যাতে বোঝা যায় মডেলটি ফিচারগুলো থেকে লেবেল কতটা ভালোভাবে পূর্বানুমান করতে পারবে। এই ধরনের বিশ্লেষণ করার সবচেয়ে ভালো উপায় হলো ডেটা প্লট করা। \n",
+ "আমরা আবারও ggplot-এর geom_boxplot_ ফাংশন ব্যবহার করব, যাতে একটি ক্যাটেগরিক্যাল প্লটে আইটেম সাইজ, ভ্যারাইটি এবং কালারের মধ্যে সম্পর্কগুলো ভিজুয়ালাইজ করা যায়। ডেটা আরও ভালোভাবে প্লট করার জন্য আমরা এনকোড করা আইটেম সাইজ কলাম এবং আনএনকোড করা ভ্যারাইটি কলাম ব্যবহার করব।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Define the color palette\n",
+ "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
+ "\n",
+ "# We need the encoded Item Size column to use it as the x-axis values in the plot\n",
+ "pumpkins_select_plot<-pumpkins_select\n",
+ "pumpkins_select_plot$item_size <- baked_pumpkins$item_size\n",
+ "\n",
+ "# Create the grouped box plot\n",
+ "ggplot(pumpkins_select_plot, aes(x = `item_size`, y = color, fill = color)) +\n",
+ " geom_boxplot() +\n",
+ " facet_grid(variety ~ ., scales = \"free_x\") +\n",
+ " scale_fill_manual(values = palette) +\n",
+ " labs(x = \"Item Size\", y = \"\") +\n",
+ " theme_minimal() +\n",
+ " theme(strip.text = element_text(size = 12)) +\n",
+ " theme(axis.text.x = element_text(size = 10)) +\n",
+ " theme(axis.title.x = element_text(size = 12)) +\n",
+ " theme(axis.title.y = element_blank()) +\n",
+ " theme(legend.position = \"bottom\") +\n",
+ " guides(fill = guide_legend(title = \"Color\")) +\n",
+ " theme(panel.spacing = unit(0.5, \"lines\"))+\n",
+ " theme(strip.text.y = element_text(size = 4, hjust = 0)) \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### একটি স্বার্ম প্লট ব্যবহার করুন\n",
+ "\n",
+ "যেহেতু Color একটি দ্বৈত ক্যাটাগরি (সাদা বা নয়), এটি ভিজুয়ালাইজেশনের জন্য 'একটি [বিশেষ পদ্ধতির](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf) প্রয়োজন'।\n",
+ "\n",
+ "Color-এর বণ্টন item_size-এর সাথে সম্পর্কিতভাবে দেখানোর জন্য একটি `swarm plot` চেষ্টা করুন।\n",
+ "\n",
+ "আমরা [ggbeeswarm প্যাকেজ](https://github.com/eclarke/ggbeeswarm) ব্যবহার করব, যা ggplot2 ব্যবহার করে beeswarm-স্টাইলের প্লট তৈরি করার পদ্ধতি প্রদান করে। Beeswarm প্লট এমন একটি পদ্ধতি যেখানে সাধারণত পয়েন্টগুলো একটির উপর আরেকটি পড়ে যেত, সেগুলোকে পাশাপাশি ফেলার জন্য ব্যবহার করা হয়।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Create beeswarm plots of color and item_size\n",
+ "baked_pumpkins %>% \n",
+ " mutate(color = factor(color)) %>% \n",
+ " ggplot(mapping = aes(x = color, y = item_size, color = color)) +\n",
+ " geom_quasirandom() +\n",
+ " scale_color_brewer(palette = \"Dark2\", direction = -1) +\n",
+ " theme(legend.position = \"none\")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "এখন যেহেতু আমরা রঙের দ্বৈত শ্রেণীবিভাগ এবং আকারের বৃহত্তর গোষ্ঠীর মধ্যে সম্পর্ক সম্পর্কে ধারণা পেয়েছি, চলুন একটি কুমড়ার সম্ভাব্য রঙ নির্ধারণের জন্য লজিস্টিক রিগ্রেশন অন্বেষণ করি।\n",
+ "\n",
+ "## আপনার মডেল তৈরি করুন\n",
+ "\n",
+ "আপনার শ্রেণীবিভাজন মডেলে ব্যবহারের জন্য ভেরিয়েবল নির্বাচন করুন এবং ডেটাকে প্রশিক্ষণ ও পরীক্ষার সেটে ভাগ করুন। [rsample](https://rsample.tidymodels.org/), Tidymodels-এর একটি প্যাকেজ, দক্ষ ডেটা বিভাজন এবং পুনঃনমুনার জন্য অবকাঠামো প্রদান করে:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Split data into 80% for training and 20% for testing\n",
+ "set.seed(2056)\n",
+ "pumpkins_split <- pumpkins_select %>% \n",
+ " initial_split(prop = 0.8)\n",
+ "\n",
+ "# Extract the data in each split\n",
+ "pumpkins_train <- training(pumpkins_split)\n",
+ "pumpkins_test <- testing(pumpkins_split)\n",
+ "\n",
+ "# Print out the first 5 rows of the training set\n",
+ "pumpkins_train %>% \n",
+ " slice_head(n = 5)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "🙌 আমরা এখন একটি মডেল প্রশিক্ষণ করার জন্য প্রস্তুত, যেখানে প্রশিক্ষণের বৈশিষ্ট্যগুলো প্রশিক্ষণের লেবেল (রঙ) এর সাথে মানানসই করা হবে।\n",
+ "\n",
+ "আমরা একটি রেসিপি তৈরি করার মাধ্যমে শুরু করব, যা আমাদের ডেটার উপর প্রি-প্রসেসিং ধাপগুলো নির্ধারণ করবে, যাতে এটি মডেলিংয়ের জন্য প্রস্তুত হয়। উদাহরণস্বরূপ: ক্যাটেগরিকাল ভেরিয়েবলগুলোকে একটি পূর্ণসংখ্যার সেটে এনকোড করা। ঠিক যেমন `baked_pumpkins`, আমরা একটি `pumpkins_recipe` তৈরি করব, কিন্তু এটিকে `prep` এবং `bake` করব না, কারণ এটি একটি ওয়ার্কফ্লোতে অন্তর্ভুক্ত করা হবে, যা আপনি কয়েকটি ধাপ পরে দেখতে পাবেন।\n",
+ "\n",
+ "Tidymodels-এ লজিস্টিক রিগ্রেশন মডেল নির্ধারণ করার বেশ কিছু উপায় রয়েছে। দেখুন `?logistic_reg()`। আপাতত, আমরা ডিফল্ট `stats::glm()` ইঞ্জিন ব্যবহার করে একটি লজিস্টিক রিগ্রেশন মডেল নির্ধারণ করব।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Create a recipe that specifies preprocessing steps for modelling\n",
+ "pumpkins_recipe <- recipe(color ~ ., data = pumpkins_train) %>% \n",
+ " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
+ " step_integer(item_size, zero_based = F) %>% \n",
+ " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE)\n",
+ "\n",
+ "# Create a logistic model specification\n",
+ "log_reg <- logistic_reg() %>% \n",
+ " set_engine(\"glm\") %>% \n",
+ " set_mode(\"classification\")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "এখন যেহেতু আমাদের কাছে একটি রেসিপি এবং একটি মডেল স্পেসিফিকেশন রয়েছে, আমাদের সেগুলোকে একত্রিত করার একটি উপায় খুঁজে বের করতে হবে এমন একটি অবজেক্টে যা প্রথমে ডেটা প্রিপ্রসেস করবে (পর্দার আড়ালে prep+bake), প্রিপ্রসেসড ডেটার উপর মডেল ফিট করবে এবং সম্ভাব্য পোস্ট-প্রসেসিং কার্যক্রমের জন্যও সুযোগ দেবে।\n",
+ "\n",
+ "Tidymodels-এ, এই সুবিধাজনক অবজেক্টটিকে [`workflow`](https://workflows.tidymodels.org/) বলা হয় এবং এটি আপনার মডেলিং উপাদানগুলোকে সহজেই ধরে রাখে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Bundle modelling components in a workflow\n",
+ "log_reg_wf <- workflow() %>% \n",
+ " add_recipe(pumpkins_recipe) %>% \n",
+ " add_model(log_reg)\n",
+ "\n",
+ "# Print out the workflow\n",
+ "log_reg_wf\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "একটি ওয়ার্কফ্লো *নির্ধারণ* করার পর, একটি মডেল [`fit()`](https://tidymodels.github.io/parsnip/reference/fit.html) ফাংশন ব্যবহার করে `প্রশিক্ষণ` দেওয়া যেতে পারে। ওয়ার্কফ্লোটি একটি রেসিপি অনুমান করবে এবং প্রশিক্ষণের আগে ডেটা প্রিপ্রসেস করবে, তাই আমাদের ম্যানুয়ালি prep এবং bake ব্যবহার করে এটি করতে হবে না।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Train the model\n",
+ "wf_fit <- log_reg_wf %>% \n",
+ " fit(data = pumpkins_train)\n",
+ "\n",
+ "# Print the trained workflow\n",
+ "wf_fit\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "মডেল প্রশিক্ষণের সময় শেখা গুণাঙ্কগুলো প্রদর্শন করে।\n",
+ "\n",
+ "এখন আমরা প্রশিক্ষণ ডেটা ব্যবহার করে মডেলটি প্রশিক্ষণ দিয়েছি, আমরা [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) ব্যবহার করে পরীক্ষার ডেটার উপর পূর্বাভাস করতে পারি। চলুন শুরু করি মডেলটি ব্যবহার করে আমাদের পরীক্ষার সেটের জন্য লেবেল এবং প্রতিটি লেবেলের সম্ভাবনা পূর্বাভাস করা। যখন সম্ভাবনা ০.৫ এর বেশি হয়, পূর্বাভাসকৃত শ্রেণি হবে `WHITE`, অন্যথায় `ORANGE`।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Make predictions for color and corresponding probabilities\n",
+ "results <- pumpkins_test %>% select(color) %>% \n",
+ " bind_cols(wf_fit %>% \n",
+ " predict(new_data = pumpkins_test)) %>%\n",
+ " bind_cols(wf_fit %>%\n",
+ " predict(new_data = pumpkins_test, type = \"prob\"))\n",
+ "\n",
+ "# Compare predictions\n",
+ "results %>% \n",
+ " slice_head(n = 10)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "খুব ভালো! এটি লজিস্টিক রিগ্রেশন কীভাবে কাজ করে তার সম্পর্কে আরও কিছু ধারণা প্রদান করে।\n",
+ "\n",
+ "### বিভ্রান্তি ম্যাট্রিক্সের মাধ্যমে আরও ভালো বোঝাপড়া\n",
+ "\n",
+ "প্রত্যেকটি পূর্বাভাসকে তার সংশ্লিষ্ট \"গ্রাউন্ড ট্রুথ\" প্রকৃত মানের সাথে তুলনা করা মডেলের পূর্বাভাসের কার্যকারিতা নির্ধারণ করার জন্য খুব কার্যকর পদ্ধতি নয়। সৌভাগ্যক্রমে, Tidymodels-এর কাছে আরও কিছু কৌশল রয়েছে: [`yardstick`](https://yardstick.tidymodels.org/) - একটি প্যাকেজ যা পারফরম্যান্স মেট্রিক ব্যবহার করে মডেলের কার্যকারিতা পরিমাপ করতে ব্যবহৃত হয়।\n",
+ "\n",
+ "শ্রেণীবিন্যাস সমস্যার সাথে সম্পর্কিত একটি পারফরম্যান্স মেট্রিক হলো [`confusion matrix`](https://wikipedia.org/wiki/Confusion_matrix)। একটি বিভ্রান্তি ম্যাট্রিক্স বর্ণনা করে একটি শ্রেণীবিন্যাস মডেল কতটা ভালো কাজ করছে। বিভ্রান্তি ম্যাট্রিক্স দেখায় প্রতিটি শ্রেণীর কতগুলো উদাহরণ সঠিকভাবে মডেল দ্বারা শ্রেণীবিন্যাস করা হয়েছে। আমাদের ক্ষেত্রে, এটি দেখাবে কতগুলো কমলা রঙের কুমড়া কমলা হিসেবে শ্রেণীবিন্যাস করা হয়েছে এবং কতগুলো সাদা কুমড়া সাদা হিসেবে শ্রেণীবিন্যাস করা হয়েছে; বিভ্রান্তি ম্যাট্রিক্স এটিও দেখাবে কতগুলো **ভুল** শ্রেণীতে শ্রেণীবিন্যাস করা হয়েছে।\n",
+ "\n",
+ "[**`conf_mat()`**](https://tidymodels.github.io/yardstick/reference/conf_mat.html) ফাংশনটি yardstick থেকে পর্যবেক্ষণ এবং পূর্বাভাসিত শ্রেণীগুলোর এই ক্রস-ট্যাবুলেশন গণনা করে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Confusion matrix for prediction results\n",
+ "conf_mat(data = results, truth = color, estimate = .pred_class)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "আসুন কনফিউশন ম্যাট্রিক্সটি বিশ্লেষণ করি। আমাদের মডেলকে কুমড়োগুলোকে দুটি বাইনারি ক্যাটাগরিতে শ্রেণীবদ্ধ করতে বলা হয়েছে: ক্যাটাগরি `সাদা` এবং ক্যাটাগরি `সাদা নয়`।\n",
+ "\n",
+ "- যদি আপনার মডেল একটি কুমড়োকে সাদা হিসেবে পূর্বানুমান করে এবং বাস্তবে সেটি 'সাদা' ক্যাটাগরির অন্তর্ভুক্ত হয়, আমরা এটিকে বলি `সত্য পজিটিভ`, যা উপরের বাম দিকের সংখ্যায় দেখানো হয়।\n",
+ "\n",
+ "- যদি আপনার মডেল একটি কুমড়োকে সাদা নয় হিসেবে পূর্বানুমান করে এবং বাস্তবে সেটি 'সাদা' ক্যাটাগরির অন্তর্ভুক্ত হয়, আমরা এটিকে বলি `মিথ্যা নেগেটিভ`, যা নিচের বাম দিকের সংখ্যায় দেখানো হয়।\n",
+ "\n",
+ "- যদি আপনার মডেল একটি কুমড়োকে সাদা হিসেবে পূর্বানুমান করে এবং বাস্তবে সেটি 'সাদা নয়' ক্যাটাগরির অন্তর্ভুক্ত হয়, আমরা এটিকে বলি `মিথ্যা পজিটিভ`, যা উপরের ডান দিকের সংখ্যায় দেখানো হয়।\n",
+ "\n",
+ "- যদি আপনার মডেল একটি কুমড়োকে সাদা নয় হিসেবে পূর্বানুমান করে এবং বাস্তবে সেটি 'সাদা নয়' ক্যাটাগরির অন্তর্ভুক্ত হয়, আমরা এটিকে বলি `সত্য নেগেটিভ`, যা নিচের ডান দিকের সংখ্যায় দেখানো হয়।\n",
+ "\n",
+ "| সত্য |\n",
+ "|:-----:|\n",
+ "\n",
+ "| | | |\n",
+ "|---------------|--------|-------|\n",
+ "| **পূর্বানুমান** | সাদা | কমলা |\n",
+ "| সাদা | TP | FP |\n",
+ "| কমলা | FN | TN |\n",
+ "\n",
+ "আপনি হয়তো অনুমান করতে পেরেছেন যে, সত্য পজিটিভ এবং সত্য নেগেটিভের সংখ্যা যত বেশি হবে এবং মিথ্যা পজিটিভ ও মিথ্যা নেগেটিভের সংখ্যা যত কম হবে, মডেলের কার্যকারিতা তত ভালো হবে।\n",
+ "\n",
+ "কনফিউশন ম্যাট্রিক্সটি গুরুত্বপূর্ণ কারণ এটি অন্যান্য মেট্রিক্সের জন্ম দেয় যা আমাদের একটি শ্রেণীবিভাজন মডেলের কার্যকারিতা আরও ভালোভাবে মূল্যায়ন করতে সাহায্য করে। আসুন সেগুলো নিয়ে আলোচনা করি:\n",
+ "\n",
+ "🎓 প্রিসিশন: `TP/(TP + FP)` যা পূর্বানুমান করা পজিটিভগুলোর মধ্যে আসল পজিটিভের অনুপাত হিসেবে সংজ্ঞায়িত। এটিকে [পজিটিভ প্রেডিক্টিভ ভ্যালু](https://en.wikipedia.org/wiki/Positive_predictive_value \"Positive predictive value\")-ও বলা হয়।\n",
+ "\n",
+ "🎓 রিকল: `TP/(TP + FN)` যা আসল পজিটিভ নমুনাগুলোর মধ্যে পজিটিভ ফলাফলের অনুপাত হিসেবে সংজ্ঞায়িত। এটিকে `সংবেদনশীলতা` নামেও পরিচিত।\n",
+ "\n",
+ "🎓 স্পেসিফিসিটি: `TN/(TN + FP)` যা আসল নেগেটিভ নমুনাগুলোর মধ্যে নেগেটিভ ফলাফলের অনুপাত হিসেবে সংজ্ঞায়িত।\n",
+ "\n",
+ "🎓 একিউরেসি: `TP + TN/(TP + TN + FP + FN)` একটি নমুনার জন্য সঠিকভাবে পূর্বানুমান করা লেবেলের শতাংশ।\n",
+ "\n",
+ "🎓 এফ মেজার: প্রিসিশন এবং রিকলের একটি ভারসাম্যপূর্ণ গড়, যেখানে সর্বোচ্চ মান ১ এবং সর্বনিম্ন মান ০।\n",
+ "\n",
+ "আসুন এই মেট্রিক্সগুলো গণনা করি!\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Combine metric functions and calculate them all at once\n",
+ "eval_metrics <- metric_set(ppv, recall, spec, f_meas, accuracy)\n",
+ "eval_metrics(data = results, truth = color, estimate = .pred_class)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## এই মডেলের ROC কার্ভ দেখুন\n",
+ "\n",
+ "চলুন আরেকটি ভিজুয়ালাইজেশন করি যাতে তথাকথিত [`ROC কার্ভ`](https://en.wikipedia.org/wiki/Receiver_operating_characteristic) দেখা যায়:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Make a roc_curve\n",
+ "results %>% \n",
+ " roc_curve(color, .pred_ORANGE) %>% \n",
+ " autoplot()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "ROC কার্ভ সাধারণত একটি শ্রেণীবিন্যাসকারীর আউটপুট বিশ্লেষণ করতে ব্যবহৃত হয়, যেখানে সত্য পজিটিভ বনাম মিথ্যা পজিটিভের তুলনা করা হয়। ROC কার্ভে সাধারণত Y অক্ষে `True Positive Rate`/সংবেদনশীলতা এবং X অক্ষে `False Positive Rate`/1-নির্দিষ্টতা দেখানো হয়। সুতরাং, কার্ভের খাড়া হওয়া এবং মধ্যরেখা ও কার্ভের মধ্যবর্তী ফাঁক গুরুত্বপূর্ণ: আপনি এমন একটি কার্ভ চান যা দ্রুত উপরের দিকে উঠে এবং রেখার ওপরে চলে যায়। আমাদের ক্ষেত্রে, শুরুতে কিছু মিথ্যা পজিটিভ থাকে, তারপর রেখাটি সঠিকভাবে উপরের দিকে উঠে যায়।\n",
+ "\n",
+ "শেষে, চলুন `yardstick::roc_auc()` ব্যবহার করে প্রকৃত Area Under the Curve (AUC) গণনা করি। AUC-এর একটি ব্যাখ্যা হতে পারে এটি: মডেলটি একটি এলোমেলো পজিটিভ উদাহরণকে একটি এলোমেলো নেগেটিভ উদাহরণের চেয়ে বেশি র্যাঙ্ক করার সম্ভাবনা।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Calculate area under curve\n",
+ "results %>% \n",
+ " roc_auc(color, .pred_ORANGE)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "ফলাফল প্রায় `0.975`। যেহেতু AUC-এর মান 0 থেকে 1 এর মধ্যে থাকে, আপনি একটি বড় স্কোর পেতে চান, কারণ একটি মডেল যা তার পূর্বাভাসে 100% সঠিক, তার AUC হবে 1; এই ক্ষেত্রে, মডেলটি *খুব ভালো*।\n",
+ "\n",
+ "ভবিষ্যতের শ্রেণীবিভাগের পাঠে, আপনি শিখবেন কীভাবে আপনার মডেলের স্কোর উন্নত করা যায় (যেমন, এই ক্ষেত্রে ভারসাম্যহীন ডেটার সাথে কাজ করা)।\n",
+ "\n",
+ "## 🚀চ্যালেঞ্জ\n",
+ "\n",
+ "লজিস্টিক রিগ্রেশন সম্পর্কে আরও অনেক কিছু জানার আছে! তবে শেখার সেরা উপায় হল পরীক্ষা-নিরীক্ষা করা। এমন একটি ডেটাসেট খুঁজুন যা এই ধরনের বিশ্লেষণের জন্য উপযুক্ত এবং এর সাথে একটি মডেল তৈরি করুন। আপনি কী শিখলেন? টিপ: [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets)-এ আকর্ষণীয় ডেটাসেট খুঁজে দেখুন।\n",
+ "\n",
+ "## পর্যালোচনা ও স্ব-অধ্যয়ন\n",
+ "\n",
+ "[স্ট্যানফোর্ডের এই পেপারের](https://web.stanford.edu/~jurafsky/slp3/5.pdf) প্রথম কয়েকটি পৃষ্ঠা পড়ুন, যেখানে লজিস্টিক রিগ্রেশনের কিছু ব্যবহারিক প্রয়োগ নিয়ে আলোচনা করা হয়েছে। এমন কাজ নিয়ে ভাবুন যেগুলো আমরা এখন পর্যন্ত অধ্যয়ন করা বিভিন্ন রিগ্রেশন পদ্ধতির জন্য উপযুক্ত। কোনটি সবচেয়ে ভালো কাজ করবে?\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": "",
+ "kernelspec": {
+ "display_name": "R",
+ "langauge": "R",
+ "name": "ir"
+ },
+ "language_info": {
+ "codemirror_mode": "r",
+ "file_extension": ".r",
+ "mimetype": "text/x-r-source",
+ "name": "R",
+ "pygments_lexer": "r",
+ "version": "3.4.1"
+ },
+ "coopTranslator": {
+ "original_hash": "feaf125f481a89c468fa115bf2aed580",
+ "translation_date": "2025-08-29T23:00:17+00:00",
+ "source_file": "2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/4-Logistic/solution/notebook.ipynb b/translations/bn/2-Regression/4-Logistic/solution/notebook.ipynb
new file mode 100644
index 000000000..039c4c170
--- /dev/null
+++ b/translations/bn/2-Regression/4-Logistic/solution/notebook.ipynb
@@ -0,0 +1,1259 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## লজিস্টিক রিগ্রেশন - পাঠ ৪\n",
+ "\n",
+ "প্রয়োজনীয় লাইব্রেরি এবং ডেটাসেট লোড করুন। ডেটাকে একটি ডেটাফ্রেমে রূপান্তর করুন যা ডেটার একটি অংশ ধারণ করে:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Type
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Sub Variety
\n",
+ "
Grade
\n",
+ "
Date
\n",
+ "
Low Price
\n",
+ "
High Price
\n",
+ "
Mostly Low
\n",
+ "
...
\n",
+ "
Unit of Sale
\n",
+ "
Quality
\n",
+ "
Condition
\n",
+ "
Appearance
\n",
+ "
Storage
\n",
+ "
Crop
\n",
+ "
Repack
\n",
+ "
Trans Mode
\n",
+ "
Unnamed: 24
\n",
+ "
Unnamed: 25
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
4/29/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
5/6/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
11/5/16
\n",
+ "
90.0
\n",
+ "
100.0
\n",
+ "
90.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Type Package Variety Sub Variety Grade Date \n",
+ "0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \\\n",
+ "1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n",
+ "2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n",
+ "\n",
+ " Low Price High Price Mostly Low ... Unit of Sale Quality Condition \n",
+ "0 270.0 280.0 270.0 ... NaN NaN NaN \\\n",
+ "1 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "2 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "3 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "4 90.0 100.0 90.0 ... NaN NaN NaN \n",
+ "\n",
+ " Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n",
+ "0 NaN NaN NaN E NaN NaN NaN \n",
+ "1 NaN NaN NaN E NaN NaN NaN \n",
+ "2 NaN NaN NaN N NaN NaN NaN \n",
+ "3 NaN NaN NaN N NaN NaN NaN \n",
+ "4 NaN NaN NaN N NaN NaN NaN \n",
+ "\n",
+ "[5 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 63,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n",
+ "full_pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n",
+ "\n",
+ "full_pumpkins.head()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Origin
\n",
+ "
Item Size
\n",
+ "
Color
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
2
\n",
+ "
BALTIMORE
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
DELAWARE
\n",
+ "
med
\n",
+ "
ORANGE
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
BALTIMORE
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
VIRGINIA
\n",
+ "
med
\n",
+ "
ORANGE
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
BALTIMORE
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
MARYLAND
\n",
+ "
lge
\n",
+ "
ORANGE
\n",
+ "
\n",
+ "
\n",
+ "
5
\n",
+ "
BALTIMORE
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
MARYLAND
\n",
+ "
lge
\n",
+ "
ORANGE
\n",
+ "
\n",
+ "
\n",
+ "
6
\n",
+ "
BALTIMORE
\n",
+ "
36 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
MARYLAND
\n",
+ "
med
\n",
+ "
ORANGE
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Package Variety Origin Item Size Color\n",
+ "2 BALTIMORE 24 inch bins HOWDEN TYPE DELAWARE med ORANGE\n",
+ "3 BALTIMORE 24 inch bins HOWDEN TYPE VIRGINIA med ORANGE\n",
+ "4 BALTIMORE 24 inch bins HOWDEN TYPE MARYLAND lge ORANGE\n",
+ "5 BALTIMORE 24 inch bins HOWDEN TYPE MARYLAND lge ORANGE\n",
+ "6 BALTIMORE 36 inch bins HOWDEN TYPE MARYLAND med ORANGE"
+ ]
+ },
+ "execution_count": 64,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Select the columns we want to use\n",
+ "columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']\n",
+ "pumpkins = full_pumpkins.loc[:, columns_to_select]\n",
+ "\n",
+ "# Drop rows with missing values\n",
+ "pumpkins.dropna(inplace=True)\n",
+ "\n",
+ "pumpkins.head()"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# চলুন আমাদের ডেটা দেখি!\n",
+ "\n",
+ "Seaborn ব্যবহার করে এটি ভিজ্যুয়ালাইজ করি\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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S0tLab1CCxcuxAcffIBXXnkFbm5uGDZsGF555RW89dZbBtd1cnLCjBkzMGjQIFy6dAleXl4AYHDuomRnZyM7O1t6nJ6eXqJxRERU/THQEMzMzHD79u2nuuaQIUOwefNmDB06FL1798bp06dx5syZYseYmZkBAHJycsq0Znh4OD755BO9dssOi2BlaQ7bBv5lmpeIiKoe76F5jomiiN27d+PXX39F586di+1br149affFwsICPj4+5V5/+fLlOH36NMaOHYvly5fDwcGhyL4pKSn44osvULduXWl3BgCmTJkiq8vCwgIHDhwwOEdoaCjS0tKk4/r16+W+BiIiqh64Q/Mc2rFjBywsLJCbm4uCggK8+eabmDVrVrFjDhw4ILs3pUaNGuWuw9HREe+99x62bNmCnj17GuxTr149iKKI//77D82aNcPGjRthYmIinZ80aRKCg4NlY+rWrWtwLrVaDbVaXe66iYio+mGgeQ5ptVpERkbCxMQEderUgUr15B8Dd3f3Et1DU1oqlarY9Q8cOAArKys4OjoavNnX3t4eHh4eFV4XEREpCwPNc8jc3FwxIaCyghQRET1bGGioRG7duoWsrCxZm52dXYW89FQeGRkZep+HU7NmTb23mBMR0bONNwVTiXh5ecHJyUl2/PHHH1VdFmbMmKFX1+TJk6u6LCIiesoEURTFqi6CqCqkp6fD2toaV05u4du2iYgUjjs0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4/LZteu7Z1tfy27mJiBSOOzRERESkeAw0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4/KRgeu5dXdUElmYlz/Zuw65UYjVERFQW3KEhIiIixWOgISIiIsVjoCEiIiLFY6AhIiIixWOgISIiIsVjoCEiIiLFY6AhIiIixWOgISIiIsVjoCEiIiLFY6AhIiIixWOgISIiIsVjoCEiIiLFY6AhIiIixWOgISIiIsVjoCml4OBgCIIgHXZ2dggMDMSpU6dk/QRBwJYtW2RtcXFxeO211+Dg4ABTU1M0aNAAAwYMwP79+4td083NDYIgYO3atXrnfHx8IAgCVq5cqXcu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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from sklearn.metrics import roc_curve, roc_auc_score\n",
+ "import matplotlib\n",
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline\n",
+ "\n",
+ "y_scores = model.predict_proba(X_test)\n",
+ "# calculate ROC curve\n",
+ "fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])\n",
+ "\n",
+ "# plot ROC curve\n",
+ "fig = plt.figure(figsize=(6, 6))\n",
+ "# Plot the diagonal 50% line\n",
+ "plt.plot([0, 1], [0, 1], 'k--')\n",
+ "# Plot the FPR and TPR achieved by our model\n",
+ "plt.plot(fpr, tpr)\n",
+ "plt.xlabel('False Positive Rate')\n",
+ "plt.ylabel('True Positive Rate')\n",
+ "plt.title('ROC Curve')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.9749908725812341\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Calculate AUC score\n",
+ "auc = roc_auc_score(y_test,y_scores[:,1])\n",
+ "print(auc)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.16"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "vscode": {
+ "interpreter": {
+ "hash": "949777d72b0d2535278d3dc13498b2535136f6dfe0678499012e853ee9abcab1"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "ef50cc584e0b79412610cc7da15e1f86",
+ "translation_date": "2025-08-29T22:58:03+00:00",
+ "source_file": "2-Regression/4-Logistic/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/2-Regression/README.md b/translations/bn/2-Regression/README.md
new file mode 100644
index 000000000..fdb109623
--- /dev/null
+++ b/translations/bn/2-Regression/README.md
@@ -0,0 +1,54 @@
+
+# মেশিন লার্নিংয়ের জন্য রিগ্রেশন মডেল
+## আঞ্চলিক বিষয়: উত্তর আমেরিকায় কুমড়ার দামের জন্য রিগ্রেশন মডেল 🎃
+
+উত্তর আমেরিকায়, হ্যালোউইনের জন্য কুমড়া প্রায়ই ভয়ঙ্কর মুখে খোদাই করা হয়। চলুন এই চমৎকার সবজিগুলো সম্পর্কে আরও জানি!
+
+
+> ছবি: Beth Teutschmann এর তোলা Unsplash এ
+
+## আপনি কী শিখবেন
+
+[](https://youtu.be/5QnJtDad4iQ "রিগ্রেশনের পরিচিতি ভিডিও - ক্লিক করে দেখুন!")
+> 🎥 উপরের ছবিতে ক্লিক করে এই পাঠের একটি সংক্ষিপ্ত পরিচিতি ভিডিও দেখুন
+
+এই অংশের পাঠগুলো মেশিন লার্নিংয়ের প্রেক্ষাপটে রিগ্রেশনের বিভিন্ন প্রকার নিয়ে আলোচনা করে। রিগ্রেশন মডেল ভেরিয়েবলগুলোর মধ্যে _সম্পর্ক_ নির্ধারণ করতে সাহায্য করে। এই ধরনের মডেল দৈর্ঘ্য, তাপমাত্রা বা বয়সের মতো মান পূর্বাভাস দিতে পারে, ফলে এটি ডেটা পয়েন্ট বিশ্লেষণ করে ভেরিয়েবলগুলোর মধ্যে সম্পর্ক উন্মোচন করে।
+
+এই পাঠমালায়, আপনি লিনিয়ার এবং লজিস্টিক রিগ্রেশনের পার্থক্য এবং কোন পরিস্থিতিতে কোনটি ব্যবহার করা উচিত তা জানতে পারবেন।
+
+[](https://youtu.be/XA3OaoW86R8 "শুরু থেকে মেশিন লার্নিং - মেশিন লার্নিংয়ের জন্য রিগ্রেশন মডেলের পরিচিতি")
+
+> 🎥 উপরের ছবিতে ক্লিক করে রিগ্রেশন মডেলের একটি সংক্ষিপ্ত পরিচিতি ভিডিও দেখুন।
+
+এই পাঠমালায়, আপনি মেশিন লার্নিংয়ের কাজ শুরু করার জন্য প্রস্তুতি নেবেন, যার মধ্যে রয়েছে নোটবুক ব্যবস্থাপনার জন্য Visual Studio Code কনফিগার করা, যা ডেটা বিজ্ঞানীদের সাধারণ পরিবেশ। আপনি Scikit-learn, একটি মেশিন লার্নিং লাইব্রেরি, সম্পর্কে জানবেন এবং আপনার প্রথম মডেল তৈরি করবেন, এই অধ্যায়ে রিগ্রেশন মডেলের উপর ফোকাস করে।
+
+> রিগ্রেশন মডেল নিয়ে কাজ শেখার জন্য কিছু কার্যকর লো-কোড টুল রয়েছে। এই কাজে [Azure ML](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) ব্যবহার করে দেখুন।
+
+### পাঠসমূহ
+
+1. [প্রয়োজনীয় টুল](1-Tools/README.md)
+2. [ডেটা ব্যবস্থাপনা](2-Data/README.md)
+3. [লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন](3-Linear/README.md)
+4. [লজিস্টিক রিগ্রেশন](4-Logistic/README.md)
+
+---
+### কৃতজ্ঞতা
+
+"রিগ্রেশনের মাধ্যমে মেশিন লার্নিং" ♥️ দিয়ে লিখেছেন [Jen Looper](https://twitter.com/jenlooper)
+
+♥️ কুইজ অবদানকারীরা: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) এবং [Ornella Altunyan](https://twitter.com/ornelladotcom)
+
+কুমড়ার ডেটাসেটটি [Kaggle এর এই প্রকল্প](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) দ্বারা প্রস্তাবিত এবং এর ডেটা [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) থেকে সংগৃহীত, যা মার্কিন যুক্তরাষ্ট্রের কৃষি বিভাগের দ্বারা বিতরণ করা হয়। আমরা বৈচিত্র্যের উপর ভিত্তি করে রঙের কিছু পয়েন্ট যোগ করেছি যাতে ডিস্ট্রিবিউশন স্বাভাবিক করা যায়। এই ডেটা পাবলিক ডোমেইনে রয়েছে।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/3-Web-App/1-Web-App/README.md b/translations/bn/3-Web-App/1-Web-App/README.md
new file mode 100644
index 000000000..0fb70ea44
--- /dev/null
+++ b/translations/bn/3-Web-App/1-Web-App/README.md
@@ -0,0 +1,359 @@
+
+# একটি মেশিন লার্নিং মডেল ব্যবহার করার জন্য ওয়েব অ্যাপ তৈরি করুন
+
+এই পাঠে, আপনি একটি ডেটাসেটে একটি মেশিন লার্নিং (ML) মডেল প্রশিক্ষণ দেবেন যা একেবারে অনন্য: _গত শতাব্দীর UFO দর্শনের তথ্য_, যা NUFORC-এর ডেটাবেস থেকে সংগ্রহ করা হয়েছে।
+
+আপনি শিখবেন:
+
+- কীভাবে একটি প্রশিক্ষিত মডেল 'পিকল' করতে হয়
+- কীভাবে সেই মডেলটি একটি Flask অ্যাপে ব্যবহার করতে হয়
+
+আমরা নোটবুক ব্যবহার করে ডেটা পরিষ্কার এবং মডেল প্রশিক্ষণ চালিয়ে যাব, তবে আপনি প্রক্রিয়াটিকে আরও এক ধাপ এগিয়ে নিয়ে যেতে পারেন এবং একটি ওয়েব অ্যাপে মডেল ব্যবহার করার ধারণা অন্বেষণ করতে পারেন।
+
+এটি করতে, আপনাকে Flask ব্যবহার করে একটি ওয়েব অ্যাপ তৈরি করতে হবে।
+
+## [পাঠের পূর্ববর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/17/)
+
+## একটি অ্যাপ তৈরি করা
+
+মেশিন লার্নিং মডেল ব্যবহার করার জন্য ওয়েব অ্যাপ তৈরি করার বিভিন্ন উপায় রয়েছে। আপনার ওয়েব আর্কিটেকচার আপনার মডেল প্রশিক্ষণের পদ্ধতিকে প্রভাবিত করতে পারে। কল্পনা করুন যে আপনি এমন একটি ব্যবসায় কাজ করছেন যেখানে ডেটা সায়েন্স দল একটি মডেল প্রশিক্ষণ দিয়েছে যা তারা চায় আপনি একটি অ্যাপে ব্যবহার করুন।
+
+### বিবেচ্য বিষয়
+
+অনেক প্রশ্ন রয়েছে যা আপনাকে করতে হবে:
+
+- **এটি কি ওয়েব অ্যাপ নাকি মোবাইল অ্যাপ?** যদি আপনি একটি মোবাইল অ্যাপ তৈরি করছেন বা IoT প্রসঙ্গে মডেলটি ব্যবহার করতে চান, আপনি [TensorFlow Lite](https://www.tensorflow.org/lite/) ব্যবহার করতে পারেন এবং মডেলটি একটি Android বা iOS অ্যাপে ব্যবহার করতে পারেন।
+- **মডেলটি কোথায় থাকবে?** ক্লাউডে নাকি লোকাল মেশিনে?
+- **অফলাইন সাপোর্ট।** অ্যাপটি কি অফলাইনে কাজ করতে হবে?
+- **মডেল প্রশিক্ষণের জন্য কোন প্রযুক্তি ব্যবহার করা হয়েছে?** নির্বাচিত প্রযুক্তি আপনার ব্যবহৃত টুলিংকে প্রভাবিত করতে পারে।
+ - **TensorFlow ব্যবহার করা।** উদাহরণস্বরূপ, যদি আপনি TensorFlow ব্যবহার করে একটি মডেল প্রশিক্ষণ দেন, সেই ইকোসিস্টেম [TensorFlow.js](https://www.tensorflow.org/js/) ব্যবহার করে একটি ওয়েব অ্যাপে মডেলটি রূপান্তর করার ক্ষমতা প্রদান করে।
+ - **PyTorch ব্যবহার করা।** যদি আপনি [PyTorch](https://pytorch.org/) এর মতো একটি লাইব্রেরি ব্যবহার করে একটি মডেল তৈরি করেন, আপনি এটি [ONNX](https://onnx.ai/) (Open Neural Network Exchange) ফরম্যাটে রপ্তানি করার বিকল্প পাবেন যা [Onnx Runtime](https://www.onnxruntime.ai/) ব্যবহার করে জাভাস্ক্রিপ্ট ওয়েব অ্যাপে ব্যবহার করা যায়। এই বিকল্পটি ভবিষ্যতের পাঠে Scikit-learn-প্রশিক্ষিত মডেলের জন্য অন্বেষণ করা হবে।
+ - **Lobe.ai বা Azure Custom Vision ব্যবহার করা।** যদি আপনি [Lobe.ai](https://lobe.ai/) বা [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) এর মতো একটি ML SaaS (Software as a Service) সিস্টেম ব্যবহার করে একটি মডেল প্রশিক্ষণ দেন, এই ধরনের সফটওয়্যার অনেক প্ল্যাটফর্মের জন্য মডেল রপ্তানি করার উপায় প্রদান করে, যার মধ্যে রয়েছে ক্লাউডে একটি কাস্টম API তৈরি করা যা আপনার অনলাইন অ্যাপ্লিকেশন দ্বারা প্রশ্ন করা যেতে পারে।
+
+আপনার কাছে একটি সম্পূর্ণ Flask ওয়েব অ্যাপ তৈরি করার সুযোগও রয়েছে যা নিজেই একটি ওয়েব ব্রাউজারে মডেল প্রশিক্ষণ দিতে সক্ষম হবে। এটি TensorFlow.js ব্যবহার করে একটি জাভাস্ক্রিপ্ট প্রসঙ্গে করা যেতে পারে।
+
+আমাদের উদ্দেশ্যে, যেহেতু আমরা Python-ভিত্তিক নোটবুক নিয়ে কাজ করছি, আসুন সেই পদক্ষেপগুলি অন্বেষণ করি যা আপনাকে একটি প্রশিক্ষিত মডেলকে এমন একটি ফরম্যাটে রপ্তানি করতে হবে যা একটি Python-নির্মিত ওয়েব অ্যাপ দ্বারা পড়া যায়।
+
+## টুল
+
+এই কাজের জন্য আপনার দুটি টুল দরকার: Flask এবং Pickle, যা উভয়ই Python-এ চলে।
+
+✅ [Flask](https://palletsprojects.com/p/flask/) কী? এর নির্মাতারা এটিকে একটি 'মাইক্রো-ফ্রেমওয়ার্ক' হিসাবে সংজ্ঞায়িত করেছেন। Flask Python ব্যবহার করে ওয়েব ফ্রেমওয়ার্কের মৌলিক বৈশিষ্ট্য এবং ওয়েব পেজ তৈরি করার জন্য একটি টেমপ্লেটিং ইঞ্জিন প্রদান করে। Flask দিয়ে তৈরি করার অনুশীলন করতে [এই Learn module](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) দেখুন।
+
+✅ [Pickle](https://docs.python.org/3/library/pickle.html) কী? Pickle 🥒 একটি Python মডিউল যা একটি Python অবজেক্ট স্ট্রাকচারকে সিরিয়ালাইজ এবং ডি-সিরিয়ালাইজ করে। যখন আপনি একটি মডেল 'পিকল' করেন, আপনি এর স্ট্রাকচারকে ওয়েবের জন্য সিরিয়ালাইজ বা ফ্ল্যাটেন করেন। সতর্ক থাকুন: Pickle স্বাভাবিকভাবে নিরাপদ নয়, তাই যদি আপনাকে একটি ফাইল 'আন-পিকল' করতে বলা হয় তবে সতর্ক থাকুন। একটি পিকল করা ফাইলের `.pkl` সাফিক্স থাকে।
+
+## অনুশীলন - আপনার ডেটা পরিষ্কার করুন
+
+এই পাঠে আপনি ৮০,০০০ UFO দর্শনের ডেটা ব্যবহার করবেন, যা [NUFORC](https://nuforc.org) (The National UFO Reporting Center) দ্বারা সংগ্রহ করা হয়েছে। এই ডেটায় UFO দর্শনের কিছু আকর্ষণীয় বর্ণনা রয়েছে, যেমন:
+
+- **দীর্ঘ উদাহরণ বর্ণনা।** "একটি আলো রশ্মি থেকে একজন মানুষ বেরিয়ে আসে যা রাতে একটি ঘাসের মাঠে পড়ে এবং তিনি Texas Instruments পার্কিং লটের দিকে দৌড়ান।"
+- **সংক্ষিপ্ত উদাহরণ বর্ণনা।** "আলো আমাদের তাড়া করেছিল।"
+
+[ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) স্প্রেডশিটে `city`, `state` এবং `country` যেখানে দর্শন ঘটেছে, বস্তুটির `shape` এবং এর `latitude` এবং `longitude` সম্পর্কে কলাম রয়েছে।
+
+এই পাঠে অন্তর্ভুক্ত খালি [notebook](notebook.ipynb)-এ:
+
+1. আগের পাঠে যেমন করেছিলেন, `pandas`, `matplotlib`, এবং `numpy` আমদানি করুন এবং ufos স্প্রেডশিট আমদানি করুন। আপনি একটি নমুনা ডেটাসেট দেখতে পারেন:
+
+ ```python
+ import pandas as pd
+ import numpy as np
+
+ ufos = pd.read_csv('./data/ufos.csv')
+ ufos.head()
+ ```
+
+1. ufos ডেটাকে নতুন শিরোনাম সহ একটি ছোট ডেটাফ্রেমে রূপান্তর করুন। `Country` ফিল্ডে ইউনিক মানগুলি পরীক্ষা করুন।
+
+ ```python
+ ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
+
+ ufos.Country.unique()
+ ```
+
+1. এখন, আপনি প্রয়োজনীয় ডেটার পরিমাণ কমাতে পারেন null মানগুলি বাদ দিয়ে এবং শুধুমাত্র ১-৬০ সেকেন্ডের মধ্যে দর্শনগুলি আমদানি করে:
+
+ ```python
+ ufos.dropna(inplace=True)
+
+ ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
+
+ ufos.info()
+ ```
+
+1. Scikit-learn-এর `LabelEncoder` লাইব্রেরি আমদানি করুন যাতে দেশগুলির টেক্সট মানগুলি একটি সংখ্যায় রূপান্তর করা যায়:
+
+ ✅ LabelEncoder ডেটাকে বর্ণানুক্রমিকভাবে এনকোড করে
+
+ ```python
+ from sklearn.preprocessing import LabelEncoder
+
+ ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])
+
+ ufos.head()
+ ```
+
+ আপনার ডেটা দেখতে এরকম হওয়া উচিত:
+
+ ```output
+ Seconds Country Latitude Longitude
+ 2 20.0 3 53.200000 -2.916667
+ 3 20.0 4 28.978333 -96.645833
+ 14 30.0 4 35.823889 -80.253611
+ 23 60.0 4 45.582778 -122.352222
+ 24 3.0 3 51.783333 -0.783333
+ ```
+
+## অনুশীলন - আপনার মডেল তৈরি করুন
+
+এখন আপনি ডেটাকে প্রশিক্ষণ এবং পরীক্ষার গ্রুপে ভাগ করে মডেল প্রশিক্ষণের জন্য প্রস্তুত হতে পারেন।
+
+1. তিনটি বৈশিষ্ট্য নির্বাচন করুন যা আপনি প্রশিক্ষণ দিতে চান আপনার X ভেক্টর হিসাবে, এবং y ভেক্টর হবে `Country`। আপনি `Seconds`, `Latitude` এবং `Longitude` ইনপুট করতে চান এবং একটি country id ফেরত পেতে চান।
+
+ ```python
+ from sklearn.model_selection import train_test_split
+
+ Selected_features = ['Seconds','Latitude','Longitude']
+
+ X = ufos[Selected_features]
+ y = ufos['Country']
+
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
+ ```
+
+1. আপনার মডেলটি লজিস্টিক রিগ্রেশন ব্যবহার করে প্রশিক্ষণ দিন:
+
+ ```python
+ from sklearn.metrics import accuracy_score, classification_report
+ from sklearn.linear_model import LogisticRegression
+ model = LogisticRegression()
+ model.fit(X_train, y_train)
+ predictions = model.predict(X_test)
+
+ print(classification_report(y_test, predictions))
+ print('Predicted labels: ', predictions)
+ print('Accuracy: ', accuracy_score(y_test, predictions))
+ ```
+
+সঠিকতা খারাপ নয় **(প্রায় ৯৫%)**, যা আশ্চর্যজনক নয়, কারণ `Country` এবং `Latitude/Longitude` সম্পর্কিত।
+
+আপনার তৈরি মডেলটি খুব বিপ্লবী নয় কারণ আপনি `Latitude` এবং `Longitude` থেকে একটি `Country` অনুমান করতে সক্ষম হওয়া উচিত, তবে এটি একটি ভাল অনুশীলন কাঁচা ডেটা থেকে প্রশিক্ষণ দেওয়ার চেষ্টা করার জন্য যা আপনি পরিষ্কার করেছেন, রপ্তানি করেছেন এবং তারপর এই মডেলটি একটি ওয়েব অ্যাপে ব্যবহার করেছেন।
+
+## অনুশীলন - আপনার মডেল 'পিকল' করুন
+
+এখন, আপনার মডেলটি _পিকল_ করার সময়! আপনি এটি কয়েকটি কোড লাইনে করতে পারেন। একবার এটি _পিকল_ হয়ে গেলে, আপনার পিকল করা মডেলটি লোড করুন এবং সেকেন্ড, latitude এবং longitude এর মান সহ একটি নমুনা ডেটা অ্যারের বিরুদ্ধে এটি পরীক্ষা করুন।
+
+```python
+import pickle
+model_filename = 'ufo-model.pkl'
+pickle.dump(model, open(model_filename,'wb'))
+
+model = pickle.load(open('ufo-model.pkl','rb'))
+print(model.predict([[50,44,-12]]))
+```
+
+মডেলটি **'3'** ফেরত দেয়, যা UK-এর country code। আশ্চর্যজনক! 👽
+
+## অনুশীলন - একটি Flask অ্যাপ তৈরি করুন
+
+এখন আপনি একটি Flask অ্যাপ তৈরি করতে পারেন যা আপনার মডেলকে কল করবে এবং অনুরূপ ফলাফল ফেরত দেবে, তবে আরও চিত্তাকর্ষকভাবে।
+
+1. **web-app** নামে একটি ফোল্ডার তৈরি করুন _notebook.ipynb_ ফাইলের পাশে যেখানে আপনার _ufo-model.pkl_ ফাইল রয়েছে।
+
+1. সেই ফোল্ডারে আরও তিনটি ফোল্ডার তৈরি করুন: **static**, যার ভিতরে একটি **css** ফোল্ডার থাকবে, এবং **templates**। এখন আপনার নিম্নলিখিত ফাইল এবং ডিরেক্টরি থাকা উচিত:
+
+ ```output
+ web-app/
+ static/
+ css/
+ templates/
+ notebook.ipynb
+ ufo-model.pkl
+ ```
+
+ ✅ সমাধান ফোল্ডারটি সম্পূর্ণ অ্যাপের একটি দৃশ্যের জন্য দেখুন
+
+1. প্রথম ফাইলটি তৈরি করুন _web-app_ ফোল্ডারে, এটি **requirements.txt**। একটি JavaScript অ্যাপের _package.json_-এর মতো, এই ফাইলটি অ্যাপের প্রয়োজনীয় ডিপেন্ডেন্সিগুলি তালিকাভুক্ত করে। **requirements.txt**-এ নিম্নলিখিত লাইনগুলি যোগ করুন:
+
+ ```text
+ scikit-learn
+ pandas
+ numpy
+ flask
+ ```
+
+1. এখন, এই ফাইলটি চালান _web-app_ এ নেভিগেট করে:
+
+ ```bash
+ cd web-app
+ ```
+
+1. আপনার টার্মিনালে `pip install` টাইপ করুন, _requirements.txt_ এ তালিকাভুক্ত লাইব্রেরিগুলি ইনস্টল করতে:
+
+ ```bash
+ pip install -r requirements.txt
+ ```
+
+1. এখন, আপনি অ্যাপটি শেষ করতে আরও তিনটি ফাইল তৈরি করতে প্রস্তুত:
+
+ 1. **app.py** তৈরি করুন রুটে।
+ 2. **index.html** তৈরি করুন _templates_ ডিরেক্টরিতে।
+ 3. **styles.css** তৈরি করুন _static/css_ ডিরেক্টরিতে।
+
+1. _styles.css_ ফাইলটি কয়েকটি স্টাইল দিয়ে তৈরি করুন:
+
+ ```css
+ body {
+ width: 100%;
+ height: 100%;
+ font-family: 'Helvetica';
+ background: black;
+ color: #fff;
+ text-align: center;
+ letter-spacing: 1.4px;
+ font-size: 30px;
+ }
+
+ input {
+ min-width: 150px;
+ }
+
+ .grid {
+ width: 300px;
+ border: 1px solid #2d2d2d;
+ display: grid;
+ justify-content: center;
+ margin: 20px auto;
+ }
+
+ .box {
+ color: #fff;
+ background: #2d2d2d;
+ padding: 12px;
+ display: inline-block;
+ }
+ ```
+
+1. পরবর্তী, _index.html_ ফাইলটি তৈরি করুন:
+
+ ```html
+
+
+
+
+ 🛸 UFO Appearance Prediction! 👽
+
+
+
+
+
+
+
+
+
According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?
+
+
+
+
{{ prediction_text }}
+
+
+
+
+
+
+
+ ```
+
+ এই ফাইলের টেমপ্লেটিংটি দেখুন। লক্ষ্য করুন যে এখানে 'mustache' সিনট্যাক্স ব্যবহার করা হয়েছে ভেরিয়েবলগুলির জন্য যা অ্যাপ দ্বারা সরবরাহ করা হবে, যেমন prediction টেক্সট: `{{}}`। এখানে একটি ফর্মও রয়েছে যা `/predict` রুটে একটি prediction পোস্ট করে।
+
+ অবশেষে, আপনি Python ফাইলটি তৈরি করতে প্রস্তুত যা মডেল ব্যবহার এবং prediction প্রদর্শনের জন্য অ্যাপটি চালাবে:
+
+1. `app.py`-এ যোগ করুন:
+
+ ```python
+ import numpy as np
+ from flask import Flask, request, render_template
+ import pickle
+
+ app = Flask(__name__)
+
+ model = pickle.load(open("./ufo-model.pkl", "rb"))
+
+
+ @app.route("/")
+ def home():
+ return render_template("index.html")
+
+
+ @app.route("/predict", methods=["POST"])
+ def predict():
+
+ int_features = [int(x) for x in request.form.values()]
+ final_features = [np.array(int_features)]
+ prediction = model.predict(final_features)
+
+ output = prediction[0]
+
+ countries = ["Australia", "Canada", "Germany", "UK", "US"]
+
+ return render_template(
+ "index.html", prediction_text="Likely country: {}".format(countries[output])
+ )
+
+
+ if __name__ == "__main__":
+ app.run(debug=True)
+ ```
+
+ > 💡 টিপ: যখন আপনি Flask ব্যবহার করে ওয়েব অ্যাপ চালানোর সময় [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) যোগ করেন, তখন আপনার অ্যাপ্লিকেশনে করা যেকোনো পরিবর্তন অবিলম্বে প্রতিফলিত হবে সার্ভার পুনরায় চালু করার প্রয়োজন ছাড়াই। সতর্ক থাকুন! প্রোডাকশন অ্যাপে এই মোডটি সক্রিয় করবেন না।
+
+যদি আপনি `python app.py` বা `python3 app.py` চালান - আপনার ওয়েব সার্ভার স্থানীয়ভাবে চালু হবে এবং আপনি একটি ছোট ফর্ম পূরণ করতে পারবেন UFO দর্শনের অবস্থান সম্পর্কে আপনার প্রশ্নের উত্তর পেতে!
+
+এর আগে, `app.py`-এর অংশগুলি দেখুন:
+
+1. প্রথমে, ডিপেন্ডেন্সিগুলি লোড হয় এবং অ্যাপটি শুরু হয়।
+1. তারপর, মডেলটি আমদানি করা হয়।
+1. তারপর, হোম রুটে index.html রেন্ডার করা হয়।
+
+`/predict` রুটে, ফর্ম পোস্ট করার সময় কয়েকটি জিনিস ঘটে:
+
+1. ফর্ম ভেরিয়েবলগুলি সংগ্রহ করা হয় এবং একটি numpy অ্যারেতে রূপান্তরিত হয়। তারপর সেগুলি মডেলে পাঠানো হয় এবং একটি prediction ফেরত দেওয়া হয়।
+2. প্রদর্শিত দেশগুলি তাদের পূর্বাভাসিত country code থেকে পাঠযোগ্য টেক্সটে পুনরায় রেন্ডার করা হয় এবং সেই মানটি index.html-এ টেমপ্লেটে রেন্ডার করার জন্য ফেরত পাঠানো হয়।
+
+Flask এবং একটি পিকল করা মডেল ব্যবহার করে একটি মডেল ব্যবহার করা তুলনামূলকভাবে সহজ। সবচেয়ে কঠিন বিষয়টি বুঝতে হবে যে মডেলে prediction পেতে কোন আকারের ডেটা পাঠানো উচিত। এটি সম্পূর্ণভাবে নির্ভর করে মডেলটি কীভাবে প্রশিক্ষণ দেওয়া হয়েছিল। এই মডেলটিতে prediction পেতে তিনটি ডেটা পয়েন্ট ইনপুট করতে হবে।
+
+একটি পেশাদার পরিবেশে, আপনি দেখতে পারেন যে মডেল প্রশিক্ষণকারী এবং যারা এটি ওয়েব বা মোবাইল অ্যাপে ব্যবহার করেন তাদের মধ্যে ভাল যোগাযোগ কতটা গুরুত্বপূর্ণ। আমাদের ক্ষেত্রে, এটি শুধুমাত্র একজন ব্যক্তি, আপনি!
+
+---
+
+## 🚀 চ্যালেঞ্জ
+
+নোটবুকে কাজ করার এবং Flask অ্যাপে মডেল আমদানি করার পরিবর্তে, আপনি Flask অ্যাপের মধ্যেই মডেলটি প্রশিক্ষণ দিতে পারেন! আপনার নোটবুকের Python কোডটি রূপান্তর করার চেষ্টা করুন, সম্ভবত আপনার ডেটা পরিষ্কার হওয়ার পরে, অ্যাপের মধ্যে একটি `train` রুটে মডেলটি প্রশিক্ষণ দিতে। এই পদ্ধতি অনুসরণ করার সুবিধা এবং অসুবিধাগুলি কী?
+
+## [পাঠের পরবর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/18/)
+
+## পর্যালোচনা এবং স্ব-অধ্যয়ন
+
+মেশিন লার্নিং মডেল ব্যবহার করার জন্য একটি ওয়েব অ্যাপ তৈরি করার অনেক উপায় রয়েছে। JavaScript বা Python ব্যবহার করে মেশিন লার্নিং লিভারেজ করার জন্য একটি ওয়েব অ্যাপ তৈরি করার উপায়গুলির একটি তালিকা তৈরি করুন। আর্কিটেকচার বিবেচনা করুন: মডেলটি কি অ্যাপের মধ্যে থাকা উচিত নাকি ক্লাউডে থাকা উচিত? যদি ক্লাউডে থাকে, তাহলে কীভাবে এটি অ্যাক্সেস করবেন? একটি প্রয়োগকৃত ML ওয়েব সমাধানের জন্য একটি আর্কিটেকচারাল মডেল আঁকুন।
+
+## অ্যাসাইনমেন্ট
+
+[একটি ভিন্ন মডেল চেষ্টা করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/3-Web-App/1-Web-App/assignment.md b/translations/bn/3-Web-App/1-Web-App/assignment.md
new file mode 100644
index 000000000..4c2025c4f
--- /dev/null
+++ b/translations/bn/3-Web-App/1-Web-App/assignment.md
@@ -0,0 +1,25 @@
+
+# একটি ভিন্ন মডেল চেষ্টা করুন
+
+## নির্দেশাবলী
+
+আপনি যখন একটি প্রশিক্ষিত রিগ্রেশন মডেল ব্যবহার করে একটি ওয়েব অ্যাপ তৈরি করেছেন, তখন আগের রিগ্রেশন পাঠের একটি মডেল ব্যবহার করে এই ওয়েব অ্যাপটি পুনরায় তৈরি করুন। আপনি স্টাইল একই রাখতে পারেন বা কুমড়ার ডেটা প্রতিফলিত করার জন্য এটি ভিন্নভাবে ডিজাইন করতে পারেন। আপনার মডেলের প্রশিক্ষণ পদ্ধতির সাথে সামঞ্জস্য রেখে ইনপুট পরিবর্তন করতে সতর্ক থাকুন।
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------- |
+| | ওয়েব অ্যাপটি প্রত্যাশিতভাবে কাজ করে এবং ক্লাউডে ডিপ্লয় করা হয়েছে | ওয়েব অ্যাপে ত্রুটি রয়েছে বা অপ্রত্যাশিত ফলাফল প্রদর্শন করে | ওয়েব অ্যাপটি সঠিকভাবে কাজ করে না |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/3-Web-App/1-Web-App/notebook.ipynb b/translations/bn/3-Web-App/1-Web-App/notebook.ipynb
new file mode 100644
index 000000000..e69de29bb
diff --git a/translations/bn/3-Web-App/1-Web-App/solution/notebook.ipynb b/translations/bn/3-Web-App/1-Web-App/solution/notebook.ipynb
new file mode 100644
index 000000000..66efa013f
--- /dev/null
+++ b/translations/bn/3-Web-App/1-Web-App/solution/notebook.ipynb
@@ -0,0 +1,269 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "5fa2e8f4584c78250ca9729b46562ceb",
+ "translation_date": "2025-08-29T23:40:33+00:00",
+ "source_file": "3-Web-App/1-Web-App/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [
+ "## রিগ্রেশন মডেল ব্যবহার করে একটি ওয়েব অ্যাপ তৈরি করুন যা ইউএফও দর্শন সম্পর্কে শেখাবে\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " datetime city state country shape \\\n",
+ "0 10/10/1949 20:30 san marcos tx us cylinder \n",
+ "1 10/10/1949 21:00 lackland afb tx NaN light \n",
+ "2 10/10/1955 17:00 chester (uk/england) NaN gb circle \n",
+ "3 10/10/1956 21:00 edna tx us circle \n",
+ "4 10/10/1960 20:00 kaneohe hi us light \n",
+ "\n",
+ " duration (seconds) duration (hours/min) \\\n",
+ "0 2700.0 45 minutes \n",
+ "1 7200.0 1-2 hrs \n",
+ "2 20.0 20 seconds \n",
+ "3 20.0 1/2 hour \n",
+ "4 900.0 15 minutes \n",
+ "\n",
+ " comments date posted latitude \\\n",
+ "0 This event took place in early fall around 194... 4/27/2004 29.883056 \n",
+ "1 1949 Lackland AFB, TX. Lights racing acros... 12/16/2005 29.384210 \n",
+ "2 Green/Orange circular disc over Chester, En... 1/21/2008 53.200000 \n",
+ "3 My older brother and twin sister were leaving ... 1/17/2004 28.978333 \n",
+ "4 AS a Marine 1st Lt. flying an FJ4B fighter/att... 1/22/2004 21.418056 \n",
+ "\n",
+ " longitude \n",
+ "0 -97.941111 \n",
+ "1 -98.581082 \n",
+ "2 -2.916667 \n",
+ "3 -96.645833 \n",
+ "4 -157.803611 "
+ ],
+ "text/html": "
"
+ },
+ "metadata": {},
+ "execution_count": 26
+ }
+ ],
+ "source": [
+ "from sklearn.preprocessing import LabelEncoder\n",
+ "\n",
+ "ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])\n",
+ "\n",
+ "ufos.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "Selected_features = ['Seconds','Latitude','Longitude']\n",
+ "\n",
+ "X = ufos[Selected_features]\n",
+ "y = ufos['Country']\n",
+ "\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
+ " FutureWarning)\n",
+ "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
+ " \"this warning.\", FutureWarning)\n",
+ " precision recall f1-score support\n",
+ "\n",
+ " 0 1.00 1.00 1.00 41\n",
+ " 1 1.00 0.02 0.05 250\n",
+ " 2 0.00 0.00 0.00 8\n",
+ " 3 0.94 1.00 0.97 131\n",
+ " 4 0.95 1.00 0.97 4743\n",
+ "\n",
+ " accuracy 0.95 5173\n",
+ " macro avg 0.78 0.60 0.60 5173\n",
+ "weighted avg 0.95 0.95 0.93 5173\n",
+ "\n",
+ "Predicted labels: [4 4 4 ... 3 4 4]\n",
+ "Accuracy: 0.9512855209742895\n",
+ "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/metrics/classification.py:1437: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.\n",
+ " 'precision', 'predicted', average, warn_for)\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.metrics import accuracy_score, classification_report \n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "model = LogisticRegression()\n",
+ "model.fit(X_train, y_train)\n",
+ "predictions = model.predict(X_test)\n",
+ "\n",
+ "print(classification_report(y_test, predictions))\n",
+ "print('Predicted labels: ', predictions)\n",
+ "print('Accuracy: ', accuracy_score(y_test, predictions))\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[3]\n"
+ ]
+ }
+ ],
+ "source": [
+ "import pickle\n",
+ "model_filename = 'ufo-model.pkl'\n",
+ "pickle.dump(model, open(model_filename,'wb'))\n",
+ "\n",
+ "model = pickle.load(open('ufo-model.pkl','rb'))\n",
+ "print(model.predict([[50,44,-12]]))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/3-Web-App/README.md b/translations/bn/3-Web-App/README.md
new file mode 100644
index 000000000..9455e5391
--- /dev/null
+++ b/translations/bn/3-Web-App/README.md
@@ -0,0 +1,35 @@
+
+# আপনার মডেল ব্যবহার করার জন্য একটি ওয়েব অ্যাপ তৈরি করুন
+
+এই পাঠ্যক্রমের এই অংশে, আপনি একটি প্রয়োগকৃত মেশিন লার্নিং বিষয়ের সাথে পরিচিত হবেন: কীভাবে আপনার Scikit-learn মডেলকে একটি ফাইলে সংরক্ষণ করবেন যা একটি ওয়েব অ্যাপ্লিকেশনের মধ্যে পূর্বাভাস দেওয়ার জন্য ব্যবহার করা যেতে পারে। মডেলটি সংরক্ষণ করার পরে, আপনি শিখবেন কীভাবে এটি Flask-এ তৈরি একটি ওয়েব অ্যাপে ব্যবহার করবেন। প্রথমে, আপনি কিছু ডেটা ব্যবহার করে একটি মডেল তৈরি করবেন যা UFO দেখার ঘটনার উপর ভিত্তি করে! এরপর, আপনি একটি ওয়েব অ্যাপ তৈরি করবেন যা আপনাকে সেকেন্ডের একটি সংখ্যা, একটি অক্ষাংশ এবং দ্রাঘিমাংশের মান ইনপুট দিয়ে পূর্বাভাস করতে দেবে কোন দেশ UFO দেখার রিপোর্ট করেছে।
+
+
+
+ছবি তুলেছেন মাইকেল হেরেনআনস্প্ল্যাশ-এ
+
+## পাঠসমূহ
+
+1. [একটি ওয়েব অ্যাপ তৈরি করুন](1-Web-App/README.md)
+
+## কৃতজ্ঞতা
+
+"একটি ওয়েব অ্যাপ তৈরি করুন" ♥️ দিয়ে লিখেছেন [জেন লুপার](https://twitter.com/jenlooper)।
+
+♥️ কুইজগুলো লিখেছেন রোহান রাজ।
+
+ডেটাসেটটি নেওয়া হয়েছে [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings) থেকে।
+
+ওয়েব অ্যাপ আর্কিটেকচার আংশিকভাবে প্রস্তাবিত হয়েছে [এই প্রবন্ধে](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) এবং [এই রিপোতে](https://github.com/abhinavsagar/machine-learning-deployment) অভিনব সাগরের দ্বারা।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/4-Classification/1-Introduction/README.md b/translations/bn/4-Classification/1-Introduction/README.md
new file mode 100644
index 000000000..e95d822c5
--- /dev/null
+++ b/translations/bn/4-Classification/1-Introduction/README.md
@@ -0,0 +1,313 @@
+
+# শ্রেণীবিভাগের পরিচিতি
+
+এই চারটি পাঠে, আপনি ক্লাসিক মেশিন লার্নিং-এর একটি মৌলিক দিক - _শ্রেণীবিভাগ_ অন্বেষণ করবেন। আমরা এশিয়া এবং ভারতের অসাধারণ রান্নার একটি ডেটাসেট ব্যবহার করে বিভিন্ন শ্রেণীবিভাগ অ্যালগরিদমের সাথে কাজ করব। আশা করি আপনি ক্ষুধার্ত!
+
+
+
+> এই পাঠে প্যান-এশিয়ান রান্নার উদযাপন করুন! ছবি: [Jen Looper](https://twitter.com/jenlooper)
+
+শ্রেণীবিভাগ [supervised learning](https://wikipedia.org/wiki/Supervised_learning)-এর একটি রূপ, যা রিগ্রেশন কৌশলের সাথে অনেক মিল রাখে। যদি মেশিন লার্নিং ডেটাসেট ব্যবহার করে মান বা নাম পূর্বাভাস দেওয়ার বিষয়ে হয়, তবে শ্রেণীবিভাগ সাধারণত দুটি গ্রুপে বিভক্ত হয়: _বাইনারি শ্রেণীবিভাগ_ এবং _মাল্টিক্লাস শ্রেণীবিভাগ_।
+
+[](https://youtu.be/eg8DJYwdMyg "শ্রেণীবিভাগের পরিচিতি")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিওর জন্য: MIT-এর John Guttag শ্রেণীবিভাগের পরিচিতি দিচ্ছেন
+
+মনে রাখুন:
+
+- **লিনিয়ার রিগ্রেশন** আপনাকে ভেরিয়েবলের মধ্যে সম্পর্ক পূর্বাভাস দিতে এবং একটি নতুন ডেটাপয়েন্ট সেই লাইনের সাথে সম্পর্কিত কোথায় পড়বে তা সঠিকভাবে পূর্বাভাস দিতে সাহায্য করেছিল। উদাহরণস্বরূপ, আপনি পূর্বাভাস দিতে পারতেন _সেপ্টেম্বর বনাম ডিসেম্বর মাসে একটি কুমড়ার দাম কত হবে_।
+- **লজিস্টিক রিগ্রেশন** আপনাকে "বাইনারি ক্যাটাগরি" আবিষ্কার করতে সাহায্য করেছিল: এই দামের পয়েন্টে, _এই কুমড়া কমলা রঙের নাকি কমলা নয়_?
+
+শ্রেণীবিভাগ বিভিন্ন অ্যালগরিদম ব্যবহার করে একটি ডেটাপয়েন্টের লেবেল বা শ্রেণী নির্ধারণের অন্যান্য উপায় নির্ধারণ করে। আসুন এই রান্নার ডেটা নিয়ে কাজ করি এবং দেখি, উপাদানগুলোর একটি গ্রুপ পর্যবেক্ষণ করে, আমরা এর উৎসের রান্না নির্ধারণ করতে পারি কিনা।
+
+## [পাঠ-পূর্ব কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)
+
+> ### [এই পাঠটি R-এ উপলব্ধ!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
+
+### পরিচিতি
+
+শ্রেণীবিভাগ মেশিন লার্নিং গবেষক এবং ডেটা বিজ্ঞানীদের একটি মৌলিক কার্যকলাপ। একটি বাইনারি মানের মৌলিক শ্রেণীবিভাগ থেকে ("এই ইমেলটি স্প্যাম কিনা?"), জটিল ইমেজ শ্রেণীবিভাগ এবং কম্পিউটার ভিশন ব্যবহার করে সেগমেন্টেশন পর্যন্ত, ডেটাকে শ্রেণীতে সাজানো এবং এর উপর প্রশ্ন করা সবসময়ই উপকারী।
+
+বৈজ্ঞানিকভাবে প্রক্রিয়াটি ব্যাখ্যা করতে গেলে, আপনার শ্রেণীবিভাগ পদ্ধতি একটি প্রেডিক্টিভ মডেল তৈরি করে যা ইনপুট ভেরিয়েবলের সাথে আউটপুট ভেরিয়েবলের সম্পর্ক ম্যাপ করতে সক্ষম করে।
+
+
+
+> শ্রেণীবিভাগ অ্যালগরিদমের জন্য বাইনারি বনাম মাল্টিক্লাস সমস্যা। ইনফোগ্রাফিক: [Jen Looper](https://twitter.com/jenlooper)
+
+আমাদের ডেটা পরিষ্কার করা, ভিজ্যুয়ালাইজ করা এবং মেশিন লার্নিং কাজের জন্য প্রস্তুত করার প্রক্রিয়া শুরু করার আগে, আসুন শিখি কীভাবে মেশিন লার্নিং ডেটা শ্রেণীবদ্ধ করতে ব্যবহার করা যায়।
+
+[পরিসংখ্যান](https://wikipedia.org/wiki/Statistical_classification) থেকে উদ্ভূত, ক্লাসিক মেশিন লার্নিং ব্যবহার করে শ্রেণীবিভাগ বৈশিষ্ট্য ব্যবহার করে, যেমন `smoker`, `weight`, এবং `age` _কোনো রোগ হওয়ার সম্ভাবনা_ নির্ধারণ করতে। এটি একটি সুপারভাইজড লার্নিং কৌশল যা আপনি পূর্বে সম্পাদিত রিগ্রেশন অনুশীলনের অনুরূপ। আপনার ডেটা লেবেলযুক্ত এবং মেশিন লার্নিং অ্যালগরিদম সেই লেবেলগুলি ব্যবহার করে ডেটাসেটের শ্রেণী (বা 'ফিচার') শ্রেণীবদ্ধ এবং পূর্বাভাস দেয় এবং সেগুলিকে একটি গ্রুপ বা ফলাফলে বরাদ্দ করে।
+
+✅ একটি রান্নার ডেটাসেট কল্পনা করার জন্য এক মুহূর্ত সময় নিন। একটি মাল্টিক্লাস মডেল কী উত্তর দিতে পারবে? একটি বাইনারি মডেল কী উত্তর দিতে পারবে? যদি আপনি নির্ধারণ করতে চান যে একটি নির্দিষ্ট রান্নায় মেথি ব্যবহার করার সম্ভাবনা আছে কিনা? যদি আপনি দেখতে চান যে, একটি মুদির ব্যাগে তারকা মৌরি, আর্টিচোক, ফুলকপি এবং হর্সর্যাডিশ থাকলে, আপনি একটি সাধারণ ভারতীয় খাবার তৈরি করতে পারবেন কিনা?
+
+[](https://youtu.be/GuTeDbaNoEU "পাগল রহস্যের ঝুড়ি")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিওর জন্য। 'Chopped' শো-এর পুরো ভিত্তি হলো 'মিস্ট্রি বাস্কেট', যেখানে শেফদের একটি এলোমেলো উপাদান দিয়ে একটি খাবার তৈরি করতে হয়। নিশ্চিতভাবেই একটি মেশিন লার্নিং মডেল সাহায্য করত!
+
+## হ্যালো 'ক্লাসিফায়ার'
+
+আমরা এই রান্নার ডেটাসেট থেকে যে প্রশ্নটি করতে চাই তা আসলে একটি **মাল্টিক্লাস প্রশ্ন**, কারণ আমাদের কাজ করার জন্য বেশ কয়েকটি সম্ভাব্য জাতীয় রান্না রয়েছে। একটি উপাদানের ব্যাচ দেওয়া হলে, এই অনেক শ্রেণীর মধ্যে কোনটিতে ডেটা ফিট করবে?
+
+Scikit-learn বিভিন্ন ধরনের অ্যালগরিদম অফার করে যা আপনি ডেটা শ্রেণীবদ্ধ করতে ব্যবহার করতে পারেন, এটি নির্ভর করে আপনি কী ধরনের সমস্যা সমাধান করতে চান তার উপর। পরবর্তী দুটি পাঠে, আপনি এই অ্যালগরিদমগুলোর কয়েকটি সম্পর্কে শিখবেন।
+
+## অনুশীলন - আপনার ডেটা পরিষ্কার এবং ভারসাম্যপূর্ণ করুন
+
+প্রকল্পটি শুরু করার আগে প্রথম কাজটি হলো আপনার ডেটা পরিষ্কার এবং **ভারসাম্যপূর্ণ** করা যাতে আরও ভালো ফলাফল পাওয়া যায়। এই ফোল্ডারের মূল অংশে থাকা _notebook.ipynb_ ফাইল দিয়ে শুরু করুন।
+
+প্রথমে ইনস্টল করুন [imblearn](https://imbalanced-learn.org/stable/)। এটি একটি Scikit-learn প্যাকেজ যা আপনাকে ডেটা আরও ভালোভাবে ভারসাম্যপূর্ণ করতে সাহায্য করবে (আপনি এই কাজ সম্পর্কে একটু পরে আরও শিখবেন)।
+
+1. `imblearn` ইনস্টল করতে, `pip install` চালান, যেমন:
+
+ ```python
+ pip install imblearn
+ ```
+
+1. আপনার ডেটা আমদানি এবং ভিজ্যুয়ালাইজ করার জন্য প্রয়োজনীয় প্যাকেজ আমদানি করুন, এছাড়াও `imblearn` থেকে `SMOTE` আমদানি করুন।
+
+ ```python
+ import pandas as pd
+ import matplotlib.pyplot as plt
+ import matplotlib as mpl
+ import numpy as np
+ from imblearn.over_sampling import SMOTE
+ ```
+
+ এখন আপনি ডেটা আমদানি করার জন্য প্রস্তুত।
+
+1. পরবর্তী কাজটি হলো ডেটা আমদানি করা:
+
+ ```python
+ df = pd.read_csv('../data/cuisines.csv')
+ ```
+
+ `read_csv()` ব্যবহার করে _cusines.csv_ ফাইলের বিষয়বস্তু পড়ুন এবং এটি `df` ভেরিয়েবলে রাখুন।
+
+1. ডেটার আকার পরীক্ষা করুন:
+
+ ```python
+ df.head()
+ ```
+
+ প্রথম পাঁচটি সারি দেখতে এরকম:
+
+ ```output
+ | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
+ | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
+ | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+ | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+ | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+ | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+ | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
+ ```
+
+1. `info()` কল করে এই ডেটা সম্পর্কে তথ্য পান:
+
+ ```python
+ df.info()
+ ```
+
+ আপনার আউটপুট এরকম দেখাবে:
+
+ ```output
+
+ RangeIndex: 2448 entries, 0 to 2447
+ Columns: 385 entries, Unnamed: 0 to zucchini
+ dtypes: int64(384), object(1)
+ memory usage: 7.2+ MB
+ ```
+
+## অনুশীলন - রান্না সম্পর্কে শেখা
+
+এখন কাজ আরও আকর্ষণীয় হয়ে উঠছে। আসুন ডেটার বণ্টন আবিষ্কার করি, রান্না অনুযায়ী।
+
+1. `barh()` কল করে ডেটা বার আকারে প্লট করুন:
+
+ ```python
+ df.cuisine.value_counts().plot.barh()
+ ```
+
+ 
+
+ রান্নার সংখ্যা সীমিত, কিন্তু ডেটার বণ্টন অসম। আপনি এটি ঠিক করতে পারেন! তবে তার আগে আরও একটু অন্বেষণ করুন।
+
+1. রান্না অনুযায়ী কত ডেটা উপলব্ধ তা খুঁজে বের করুন এবং এটি প্রিন্ট করুন:
+
+ ```python
+ thai_df = df[(df.cuisine == "thai")]
+ japanese_df = df[(df.cuisine == "japanese")]
+ chinese_df = df[(df.cuisine == "chinese")]
+ indian_df = df[(df.cuisine == "indian")]
+ korean_df = df[(df.cuisine == "korean")]
+
+ print(f'thai df: {thai_df.shape}')
+ print(f'japanese df: {japanese_df.shape}')
+ print(f'chinese df: {chinese_df.shape}')
+ print(f'indian df: {indian_df.shape}')
+ print(f'korean df: {korean_df.shape}')
+ ```
+
+ আউটপুট এরকম দেখাবে:
+
+ ```output
+ thai df: (289, 385)
+ japanese df: (320, 385)
+ chinese df: (442, 385)
+ indian df: (598, 385)
+ korean df: (799, 385)
+ ```
+
+## উপাদান আবিষ্কার
+
+এখন আপনি ডেটার গভীরে যেতে পারেন এবং জানতে পারেন প্রতিটি রান্নার জন্য সাধারণ উপাদান কী। বিভ্রান্তি তৈরি করে এমন পুনরাবৃত্ত উপাদানগুলো পরিষ্কার করুন, তাই আসুন এই সমস্যাটি সম্পর্কে শিখি।
+
+1. একটি ফাংশন `create_ingredient()` তৈরি করুন যা একটি উপাদান ডেটাফ্রেম তৈরি করবে। এই ফাংশনটি একটি অপ্রয়োজনীয় কলাম বাদ দিয়ে উপাদানগুলো তাদের গণনা অনুযায়ী সাজাবে:
+
+ ```python
+ def create_ingredient_df(df):
+ ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
+ ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
+ ingredient_df = ingredient_df.sort_values(by='value', ascending=False,
+ inplace=False)
+ return ingredient_df
+ ```
+
+ এখন আপনি এই ফাংশনটি ব্যবহার করে রান্না অনুযায়ী শীর্ষ দশটি জনপ্রিয় উপাদানের ধারণা পেতে পারেন।
+
+1. `create_ingredient()` কল করুন এবং `barh()` কল করে এটি প্লট করুন:
+
+ ```python
+ thai_ingredient_df = create_ingredient_df(thai_df)
+ thai_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. জাপানি ডেটার জন্য একই কাজ করুন:
+
+ ```python
+ japanese_ingredient_df = create_ingredient_df(japanese_df)
+ japanese_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. এবার চীনা উপাদানগুলো প্লট করুন:
+
+ ```python
+ chinese_ingredient_df = create_ingredient_df(chinese_df)
+ chinese_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. ভারতীয় উপাদানগুলো প্লট করুন:
+
+ ```python
+ indian_ingredient_df = create_ingredient_df(indian_df)
+ indian_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. অবশেষে, কোরিয়ান উপাদানগুলো প্লট করুন:
+
+ ```python
+ korean_ingredient_df = create_ingredient_df(korean_df)
+ korean_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. এখন, `drop()` কল করে বিভিন্ন রান্নার মধ্যে বিভ্রান্তি তৈরি করে এমন সবচেয়ে সাধারণ উপাদানগুলো বাদ দিন:
+
+ সবাই ভাত, রসুন এবং আদা পছন্দ করে!
+
+ ```python
+ feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
+ labels_df = df.cuisine #.unique()
+ feature_df.head()
+ ```
+
+## ডেটাসেট ভারসাম্যপূর্ণ করুন
+
+এখন যেহেতু আপনি ডেটা পরিষ্কার করেছেন, [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Synthetic Minority Over-sampling Technique" ব্যবহার করে এটি ভারসাম্যপূর্ণ করুন।
+
+1. `fit_resample()` কল করুন, এই কৌশলটি ইন্টারপোলেশনের মাধ্যমে নতুন নমুনা তৈরি করে।
+
+ ```python
+ oversample = SMOTE()
+ transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
+ ```
+
+ ডেটা ভারসাম্যপূর্ণ করার মাধ্যমে, আপনি এটি শ্রেণীবিভাগ করার সময় আরও ভালো ফলাফল পাবেন। একটি বাইনারি শ্রেণীবিভাগের কথা ভাবুন। যদি আপনার বেশিরভাগ ডেটা একটি শ্রেণীর হয়, একটি মেশিন লার্নিং মডেল সেই শ্রেণীটি আরও ঘন ঘন পূর্বাভাস দেবে, শুধুমাত্র কারণ এর জন্য আরও ডেটা রয়েছে। ডেটা ভারসাম্যপূর্ণ করা যেকোনো পক্ষপাত দূর করতে সাহায্য করে।
+
+1. এখন আপনি উপাদান অনুযায়ী লেবেলের সংখ্যা পরীক্ষা করতে পারেন:
+
+ ```python
+ print(f'new label count: {transformed_label_df.value_counts()}')
+ print(f'old label count: {df.cuisine.value_counts()}')
+ ```
+
+ আপনার আউটপুট এরকম দেখাবে:
+
+ ```output
+ new label count: korean 799
+ chinese 799
+ indian 799
+ japanese 799
+ thai 799
+ Name: cuisine, dtype: int64
+ old label count: korean 799
+ indian 598
+ chinese 442
+ japanese 320
+ thai 289
+ Name: cuisine, dtype: int64
+ ```
+
+ ডেটা সুন্দর এবং পরিষ্কার, ভারসাম্যপূর্ণ এবং খুবই সুস্বাদু!
+
+1. শেষ ধাপ হলো আপনার ভারসাম্যপূর্ণ ডেটা, লেবেল এবং বৈশিষ্ট্যসহ, একটি নতুন ডেটাফ্রেমে সংরক্ষণ করা যা একটি ফাইলে রপ্তানি করা যেতে পারে:
+
+ ```python
+ transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
+ ```
+
+1. `transformed_df.head()` এবং `transformed_df.info()` ব্যবহার করে ডেটার দিকে একবার তাকান। ভবিষ্যতের পাঠে ব্যবহারের জন্য এই ডেটার একটি কপি সংরক্ষণ করুন:
+
+ ```python
+ transformed_df.head()
+ transformed_df.info()
+ transformed_df.to_csv("../data/cleaned_cuisines.csv")
+ ```
+
+ এই নতুন CSV এখন মূল ডেটা ফোল্ডারে পাওয়া যাবে।
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+এই কারিকুলামে বেশ কয়েকটি আকর্ষণীয় ডেটাসেট রয়েছে। `data` ফোল্ডারগুলো ঘেঁটে দেখুন, কোনো ডেটাসেট কি বাইনারি বা মাল্টিক্লাস শ্রেণীবিভাগের জন্য উপযুক্ত? আপনি এই ডেটাসেট থেকে কী প্রশ্ন করবেন?
+
+## [পাঠ-পরবর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+SMOTE-এর API অন্বেষণ করুন। এটি কোন ব্যবহার ক্ষেত্রে সবচেয়ে ভালোভাবে ব্যবহৃত হয়? এটি কোন সমস্যাগুলো সমাধান করে?
+
+## অ্যাসাইনমেন্ট
+
+[শ্রেণীবিভাগ পদ্ধতি অন্বেষণ করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/4-Classification/1-Introduction/assignment.md b/translations/bn/4-Classification/1-Introduction/assignment.md
new file mode 100644
index 000000000..63346d241
--- /dev/null
+++ b/translations/bn/4-Classification/1-Introduction/assignment.md
@@ -0,0 +1,25 @@
+
+# শ্রেণীবিভাজন পদ্ধতি অন্বেষণ করুন
+
+## নির্দেশাবলী
+
+[Scikit-learn ডকুমেন্টেশন](https://scikit-learn.org/stable/supervised_learning.html)-এ আপনি ডেটা শ্রেণীবিভাজনের জন্য অনেক পদ্ধতির একটি বড় তালিকা পাবেন। এই ডকুমেন্টেশনে একটি ছোট অনুসন্ধান করুন: আপনার লক্ষ্য হল শ্রেণীবিভাজন পদ্ধতিগুলি খুঁজে বের করা এবং এই পাঠক্রমে ব্যবহৃত একটি ডেটাসেট, এর উপর করা যেতে পারে এমন একটি প্রশ্ন এবং একটি শ্রেণীবিভাজন কৌশলের সাথে মিল খুঁজে বের করা। একটি স্প্রেডশিট বা .doc ফাইলে একটি টেবিল তৈরি করুন এবং ব্যাখ্যা করুন কীভাবে ডেটাসেটটি শ্রেণীবিভাজন অ্যালগরিদমের সাথে কাজ করবে।
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | যথেষ্ট | উন্নতির প্রয়োজন |
+| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| | একটি ডকুমেন্ট উপস্থাপন করা হয়েছে যেখানে ৫টি অ্যালগরিদম এবং একটি শ্রেণীবিভাজন কৌশলের ওভারভিউ রয়েছে। ওভারভিউটি ভালোভাবে ব্যাখ্যা করা হয়েছে এবং বিস্তারিত। | একটি ডকুমেন্ট উপস্থাপন করা হয়েছে যেখানে ৩টি অ্যালগরিদম এবং একটি শ্রেণীবিভাজন কৌশলের ওভারভিউ রয়েছে। ওভারভিউটি ভালোভাবে ব্যাখ্যা করা হয়েছে এবং বিস্তারিত। | একটি ডকুমেন্ট উপস্থাপন করা হয়েছে যেখানে ৩টির কম অ্যালগরিদম এবং একটি শ্রেণীবিভাজন কৌশলের ওভারভিউ রয়েছে এবং ওভারভিউটি ভালোভাবে ব্যাখ্যা করা হয়নি বা বিস্তারিত নয়। |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় রচিত সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/4-Classification/1-Introduction/notebook.ipynb b/translations/bn/4-Classification/1-Introduction/notebook.ipynb
new file mode 100644
index 000000000..5900d4867
--- /dev/null
+++ b/translations/bn/4-Classification/1-Introduction/notebook.ipynb
@@ -0,0 +1,39 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": 3
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "d544ef384b7ba73757d830a72372a7f2",
+ "translation_date": "2025-08-29T23:52:48+00:00",
+ "source_file": "4-Classification/1-Introduction/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/4-Classification/1-Introduction/solution/Julia/README.md b/translations/bn/4-Classification/1-Introduction/solution/Julia/README.md
new file mode 100644
index 000000000..e0d871a30
--- /dev/null
+++ b/translations/bn/4-Classification/1-Introduction/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb b/translations/bn/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb
new file mode 100644
index 000000000..cd2a465b8
--- /dev/null
+++ b/translations/bn/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb
@@ -0,0 +1,729 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "metadata": {
+ "colab": {
+ "name": "lesson_10-R.ipynb",
+ "provenance": [],
+ "collapsed_sections": []
+ },
+ "kernelspec": {
+ "name": "ir",
+ "display_name": "R"
+ },
+ "language_info": {
+ "name": "R"
+ },
+ "coopTranslator": {
+ "original_hash": "2621e24705e8100893c9bf84e0fc8aef",
+ "translation_date": "2025-08-29T23:55:58+00:00",
+ "source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# একটি শ্রেণীবিন্যাস মডেল তৈরি করুন: সুস্বাদু এশিয়ান এবং ভারতীয় খাবার\n"
+ ],
+ "metadata": {
+ "id": "ItETB4tSFprR"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## শ্রেণীবিভাগে পরিচিতি: আপনার ডেটা পরিষ্কার করুন, প্রস্তুত করুন এবং ভিজুয়ালাইজ করুন\n",
+ "\n",
+ "এই চারটি পাঠে, আপনি ক্লাসিক মেশিন লার্নিং-এর একটি মৌলিক দিক - *শ্রেণীবিভাগ* - অন্বেষণ করবেন। আমরা এশিয়া এবং ভারতের বিভিন্ন অসাধারণ রান্নার ডেটাসেট ব্যবহার করে বিভিন্ন শ্রেণীবিভাগ অ্যালগরিদম নিয়ে কাজ করব। আশা করি আপনি ক্ষুধার্ত!\n",
+ "\n",
+ "
\n",
+ " \n",
+ " এই পাঠগুলোতে প্যান-এশিয়ান রান্নার উদযাপন করুন! ছবি: জেন লুপার\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "শ্রেণীবিভাগ [supervised learning](https://wikipedia.org/wiki/Supervised_learning)-এর একটি রূপ, যা রিগ্রেশন কৌশলের সাথে অনেক মিল রাখে। শ্রেণীবিভাগে, আপনি একটি মডেল প্রশিক্ষণ দেন যাতে এটি পূর্বানুমান করতে পারে যে একটি আইটেম কোন `শ্রেণী`তে অন্তর্ভুক্ত। যদি মেশিন লার্নিং ডেটাসেট ব্যবহার করে মান বা নাম পূর্বানুমান করার উপর ভিত্তি করে হয়, তবে শ্রেণীবিভাগ সাধারণত দুটি গোষ্ঠীতে বিভক্ত হয়: *বাইনারি শ্রেণীবিভাগ* এবং *মাল্টিক্লাস শ্রেণীবিভাগ*।\n",
+ "\n",
+ "মনে রাখবেন:\n",
+ "\n",
+ "- **লিনিয়ার রিগ্রেশন** আপনাকে ভেরিয়েবলের মধ্যে সম্পর্ক পূর্বানুমান করতে এবং একটি নতুন ডেটাপয়েন্ট সেই লাইনের সাথে সম্পর্কিত কোথায় পড়বে তা সঠিকভাবে পূর্বানুমান করতে সাহায্য করেছিল। উদাহরণস্বরূপ, আপনি পূর্বানুমান করতে পারতেন যে *সেপ্টেম্বর বনাম ডিসেম্বর মাসে একটি কুমড়ার দাম কত হবে*।\n",
+ "\n",
+ "- **লজিস্টিক রিগ্রেশন** আপনাকে \"বাইনারি ক্যাটাগরি\" আবিষ্কার করতে সাহায্য করেছিল: এই দামের পয়েন্টে, *এই কুমড়া কমলা রঙের হবে নাকি কমলা রঙের হবে না*?\n",
+ "\n",
+ "শ্রেণীবিভাগ বিভিন্ন অ্যালগরিদম ব্যবহার করে একটি ডেটাপয়েন্টের লেবেল বা শ্রেণী নির্ধারণের অন্যান্য উপায় নির্ধারণ করে। আসুন এই রান্নার ডেটা নিয়ে কাজ করি এবং দেখি, উপাদানগুলোর একটি গোষ্ঠী পর্যবেক্ষণ করে, আমরা এর উৎসের রান্না নির্ধারণ করতে পারি কিনা।\n",
+ "\n",
+ "### [**পাঠ-পূর্ব কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
+ "\n",
+ "### **পরিচিতি**\n",
+ "\n",
+ "শ্রেণীবিভাগ মেশিন লার্নিং গবেষক এবং ডেটা বিজ্ঞানীর একটি মৌলিক কার্যকলাপ। একটি বাইনারি মানের মৌলিক শ্রেণীবিভাগ থেকে (\"এই ইমেইলটি স্প্যাম কিনা?\"), জটিল ইমেজ শ্রেণীবিভাগ এবং কম্পিউটার ভিশন ব্যবহার করে সেগমেন্টেশন পর্যন্ত, ডেটাকে শ্রেণীতে সাজানো এবং এর উপর প্রশ্ন করা সবসময়ই কার্যকর।\n",
+ "\n",
+ "বিষয়টিকে আরও বৈজ্ঞানিকভাবে বললে, আপনার শ্রেণীবিভাগ পদ্ধতি একটি পূর্বানুমানমূলক মডেল তৈরি করে যা ইনপুট ভেরিয়েবলের সাথে আউটপুট ভেরিয়েবলের সম্পর্ক ম্যাপ করতে সক্ষম করে।\n",
+ "\n",
+ "
\n",
+ " \n",
+ " শ্রেণীবিভাগ অ্যালগরিদমের জন্য বাইনারি বনাম মাল্টিক্লাস সমস্যা। ইনফোগ্রাফিক: জেন লুপার\n",
+ "\n",
+ "\n",
+ "\n",
+ "আমাদের ডেটা পরিষ্কার করা, ভিজুয়ালাইজ করা এবং মেশিন লার্নিং কাজের জন্য প্রস্তুত করার প্রক্রিয়া শুরু করার আগে, আসুন শিখি কীভাবে মেশিন লার্নিং বিভিন্ন উপায়ে ডেটা শ্রেণীবদ্ধ করতে ব্যবহার করা যায়।\n",
+ "\n",
+ "[পরিসংখ্যান](https://wikipedia.org/wiki/Statistical_classification) থেকে উদ্ভূত, ক্লাসিক মেশিন লার্নিং ব্যবহার করে শ্রেণীবিভাগ এমন বৈশিষ্ট্য ব্যবহার করে, যেমন `smoker`, `weight`, এবং `age`, *কোনো নির্দিষ্ট রোগের সম্ভাবনা নির্ধারণ করতে*। এটি একটি সুপারভাইজড লার্নিং কৌশল, যা আপনি পূর্বে রিগ্রেশন অনুশীলনে সম্পাদন করেছিলেন। আপনার ডেটা লেবেলযুক্ত এবং মেশিন লার্নিং অ্যালগরিদম সেই লেবেল ব্যবহার করে ডেটাসেটের শ্রেণী (বা 'বৈশিষ্ট্য') পূর্বানুমান করে এবং তাদের একটি গোষ্ঠী বা ফলাফলে বরাদ্দ করে।\n",
+ "\n",
+ "✅ একটি মুহূর্ত নিন এবং একটি রান্নার ডেটাসেট কল্পনা করুন। একটি মাল্টিক্লাস মডেল কী উত্তর দিতে পারবে? একটি বাইনারি মডেল কী উত্তর দিতে পারবে? যদি আপনি নির্ধারণ করতে চান যে একটি নির্দিষ্ট রান্নায় মেথি ব্যবহার করার সম্ভাবনা আছে কিনা? যদি আপনি দেখতে চান যে, একটি ব্যাগ ভর্তি তারকা মৌরি, আর্টিচোক, ফুলকপি এবং হর্সর্যাডিশ দিয়ে আপনি একটি সাধারণ ভারতীয় খাবার তৈরি করতে পারবেন কিনা?\n",
+ "\n",
+ "### **'ক্লাসিফায়ার'কে হ্যালো বলুন**\n",
+ "\n",
+ "আমরা এই রান্নার ডেটাসেট থেকে যে প্রশ্নটি করতে চাই তা আসলে একটি **মাল্টিক্লাস প্রশ্ন**, কারণ আমাদের কাছে কাজ করার জন্য একাধিক সম্ভাব্য জাতীয় রান্না রয়েছে। উপাদানগুলোর একটি ব্যাচ দেওয়া হলে, এই অনেক শ্রেণীর মধ্যে কোনটিতে ডেটা ফিট করবে?\n",
+ "\n",
+ "Tidymodels বিভিন্ন ধরনের অ্যালগরিদম অফার করে ডেটা শ্রেণীবদ্ধ করার জন্য, আপনি যে ধরনের সমস্যা সমাধান করতে চান তার উপর নির্ভর করে। পরবর্তী দুটি পাঠে, আপনি এই অ্যালগরিদমগুলোর কয়েকটি সম্পর্কে শিখবেন।\n",
+ "\n",
+ "#### **প্রয়োজনীয়তা**\n",
+ "\n",
+ "এই পাঠের জন্য, আমরা আমাদের ডেটা পরিষ্কার, প্রস্তুত এবং ভিজুয়ালাইজ করার জন্য নিম্নলিখিত প্যাকেজগুলোর প্রয়োজন হবে:\n",
+ "\n",
+ "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) হলো একটি [R প্যাকেজের সংগ্রহ](https://www.tidyverse.org/packages), যা ডেটা সায়েন্সকে দ্রুত, সহজ এবং আরও মজাদার করে তোলে!\n",
+ "\n",
+ "- `tidymodels`: [tidymodels](https://www.tidymodels.org/) ফ্রেমওয়ার্ক হলো মডেলিং এবং মেশিন লার্নিংয়ের জন্য একটি [প্যাকেজের সংগ্রহ](https://www.tidymodels.org/packages/)।\n",
+ "\n",
+ "- `DataExplorer`: [DataExplorer প্যাকেজ](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) EDA প্রক্রিয়া এবং রিপোর্ট তৈরির কাজকে সহজ এবং স্বয়ংক্রিয় করার জন্য তৈরি।\n",
+ "\n",
+ "- `themis`: [themis প্যাকেজ](https://themis.tidymodels.org/) অসমতল ডেটার জন্য অতিরিক্ত রেসিপি ধাপ সরবরাহ করে।\n",
+ "\n",
+ "আপনি এগুলো নিম্নলিখিতভাবে ইনস্টল করতে পারেন:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
+ "\n",
+ "অথবা, নিচের স্ক্রিপ্টটি চেক করবে যে এই মডিউলটি সম্পূর্ণ করতে আপনার প্রয়োজনীয় প্যাকেজগুলো আছে কিনা এবং যদি না থাকে তবে সেগুলো ইনস্টল করবে।\n"
+ ],
+ "metadata": {
+ "id": "ri5bQxZ-Fz_0"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
+ "\r\n",
+ "pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "KIPxa4elGAPI"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আমরা পরে এই চমৎকার প্যাকেজগুলি লোড করব এবং সেগুলিকে আমাদের বর্তমান R সেশনে উপলব্ধ করব। (এটি শুধুমাত্র উদাহরণের জন্য, `pacman::p_load()` ইতিমধ্যেই আপনার জন্য এটি করেছে)\n"
+ ],
+ "metadata": {
+ "id": "YkKAxOJvGD4C"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## অনুশীলন - আপনার ডেটা পরিষ্কার এবং ভারসাম্যপূর্ণ করুন\n",
+ "\n",
+ "এই প্রকল্প শুরু করার আগে প্রথম কাজ হলো আপনার ডেটা পরিষ্কার এবং **ভারসাম্যপূর্ণ** করা যাতে আরও ভালো ফলাফল পাওয়া যায়।\n",
+ "\n",
+ "চলুন ডেটার সাথে পরিচিত হই!🕵️\n"
+ ],
+ "metadata": {
+ "id": "PFkQDlk0GN5O"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Import data\r\n",
+ "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
+ "\r\n",
+ "# View the first 5 rows\r\n",
+ "df %>% \r\n",
+ " slice_head(n = 5)\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "Qccw7okxGT0S"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "মজার ব্যাপার! দেখেই মনে হচ্ছে প্রথম কলামটি একটি ধরনের `id` কলাম। চলুন ডেটা সম্পর্কে আরও কিছু তথ্য জানি।\n"
+ ],
+ "metadata": {
+ "id": "XrWnlgSrGVmR"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Basic information about the data\r\n",
+ "df %>%\r\n",
+ " introduce()\r\n",
+ "\r\n",
+ "# Visualize basic information above\r\n",
+ "df %>% \r\n",
+ " plot_intro(ggtheme = theme_light())"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "4UcGmxRxGieA"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আউটপুট থেকে আমরা দেখতে পাচ্ছি যে আমাদের কাছে `2448`টি সারি এবং `385`টি কলাম রয়েছে এবং `0`টি অনুপস্থিত মান রয়েছে। এছাড়াও, আমাদের কাছে ১টি বিচ্ছিন্ন কলাম রয়েছে, *cuisine*।\n",
+ "\n",
+ "## অনুশীলন - রান্নার ধরন সম্পর্কে শেখা\n",
+ "\n",
+ "এখন কাজ আরও আকর্ষণীয় হতে শুরু করেছে। চলুন রান্নার ধরন অনুযায়ী ডেটার বণ্টন আবিষ্কার করি।\n"
+ ],
+ "metadata": {
+ "id": "AaPubl__GmH5"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Count observations per cuisine\r\n",
+ "df %>% \r\n",
+ " count(cuisine) %>% \r\n",
+ " arrange(n)\r\n",
+ "\r\n",
+ "# Plot the distribution\r\n",
+ "theme_set(theme_light())\r\n",
+ "df %>% \r\n",
+ " count(cuisine) %>% \r\n",
+ " ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
+ " geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
+ " ylab(\"cuisine\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "FRsBVy5eGrrv"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "রান্নার ধরন সীমিত সংখ্যক হলেও, ডেটার বণ্টন অসম। আপনি এটি ঠিক করতে পারেন! তবে তার আগে, আরও একটু অনুসন্ধান করুন।\n",
+ "\n",
+ "এরপর, প্রতিটি রান্নার ধরনকে আলাদা টিবলে ভাগ করুন এবং দেখুন প্রতিটি রান্নার ধরনে কতটা ডেটা (সারি, কলাম) রয়েছে।\n",
+ "\n",
+ "> একটি [tibble](https://tibble.tidyverse.org/) হলো আধুনিক ডেটা ফ্রেম।\n",
+ "\n",
+ "
\n",
+ " \n",
+ " চিত্রকর্ম: @allison_horst\n"
+ ],
+ "metadata": {
+ "id": "vVvyDb1kG2in"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Create individual tibble for the cuisines\r\n",
+ "thai_df <- df %>% \r\n",
+ " filter(cuisine == \"thai\")\r\n",
+ "japanese_df <- df %>% \r\n",
+ " filter(cuisine == \"japanese\")\r\n",
+ "chinese_df <- df %>% \r\n",
+ " filter(cuisine == \"chinese\")\r\n",
+ "indian_df <- df %>% \r\n",
+ " filter(cuisine == \"indian\")\r\n",
+ "korean_df <- df %>% \r\n",
+ " filter(cuisine == \"korean\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Find out how much data is available per cuisine\r\n",
+ "cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
+ " \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
+ " \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
+ " \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
+ " \"korean_df:\", dim(korean_df))"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "0TvXUxD3G8Bk"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## **অনুশীলন - dplyr ব্যবহার করে রান্নার ধরন অনুযায়ী শীর্ষ উপাদানগুলি আবিষ্কার করা**\n",
+ "\n",
+ "এখন আপনি ডেটা নিয়ে আরও গভীরে যেতে পারেন এবং জানতে পারেন প্রতিটি রান্নার ধরন অনুযায়ী সাধারণ উপাদানগুলি কী। আপনাকে এমন পুনরাবৃত্ত ডেটা পরিষ্কার করতে হবে যা রান্নার ধরনগুলির মধ্যে বিভ্রান্তি সৃষ্টি করে, তাই চলুন এই সমস্যাটি সম্পর্কে শিখি।\n",
+ "\n",
+ "R-এ একটি `create_ingredient()` ফাংশন তৈরি করুন যা একটি উপাদান ডেটাফ্রেম ফেরত দেয়। এই ফাংশনটি একটি অপ্রয়োজনীয় কলাম বাদ দিয়ে শুরু করবে এবং উপাদানগুলিকে তাদের গণনার ভিত্তিতে সাজাবে।\n",
+ "\n",
+ "R-এ একটি ফাংশনের মৌলিক কাঠামো হলো:\n",
+ "\n",
+ "`myFunction <- function(arglist){`\n",
+ "\n",
+ "**`...`**\n",
+ "\n",
+ "**`return`**`(value)`\n",
+ "\n",
+ "`}`\n",
+ "\n",
+ "R ফাংশন সম্পর্কে একটি পরিচ্ছন্ন পরিচিতি [এখানে](https://skirmer.github.io/presentations/functions_with_r.html#1) পাওয়া যাবে।\n",
+ "\n",
+ "চলুন সরাসরি শুরু করি! আমরা [dplyr verbs](https://dplyr.tidyverse.org/) ব্যবহার করব যা আমরা আমাদের আগের পাঠে শিখেছি। সংক্ষেপে:\n",
+ "\n",
+ "- `dplyr::select()`: আপনাকে কোন **কলাম** রাখতে বা বাদ দিতে হবে তা বেছে নিতে সাহায্য করে।\n",
+ "\n",
+ "- `dplyr::pivot_longer()`: আপনাকে ডেটা \"লম্বা\" করতে সাহায্য করে, যা সারির সংখ্যা বাড়ায় এবং কলামের সংখ্যা কমায়।\n",
+ "\n",
+ "- `dplyr::group_by()` এবং `dplyr::summarise()`: আপনাকে বিভিন্ন গোষ্ঠীর জন্য সারাংশ পরিসংখ্যান খুঁজে বের করতে এবং সেগুলিকে একটি সুন্দর টেবিলে রাখতে সাহায্য করে।\n",
+ "\n",
+ "- `dplyr::filter()`: ডেটার একটি উপসেট তৈরি করে যা শুধুমাত্র আপনার শর্তগুলি পূরণ করে এমন সারি ধারণ করে।\n",
+ "\n",
+ "- `dplyr::mutate()`: আপনাকে কলাম তৈরি বা সংশোধন করতে সাহায্য করে।\n",
+ "\n",
+ "এই [*শিল্প*-ভরা learnr টিউটোরিয়াল](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) দেখুন, যা Allison Horst দ্বারা তৈরি এবং dplyr *(Tidyverse-এর অংশ)*-এ কিছু দরকারী ডেটা প্রক্রিয়াকরণ ফাংশন পরিচয় করিয়ে দেয়।\n"
+ ],
+ "metadata": {
+ "id": "K3RF5bSCHC76"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Creates a functions that returns the top ingredients by class\r\n",
+ "\r\n",
+ "create_ingredient <- function(df){\r\n",
+ " \r\n",
+ " # Drop the id column which is the first colum\r\n",
+ " ingredient_df = df %>% select(-1) %>% \r\n",
+ " # Transpose data to a long format\r\n",
+ " pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
+ " # Find the top most ingredients for a particular cuisine\r\n",
+ " group_by(ingredients) %>% \r\n",
+ " summarise(n_instances = sum(count)) %>% \r\n",
+ " filter(n_instances != 0) %>% \r\n",
+ " # Arrange by descending order\r\n",
+ " arrange(desc(n_instances)) %>% \r\n",
+ " mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
+ " \r\n",
+ " \r\n",
+ " return(ingredient_df)\r\n",
+ "} # End of function"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "uB_0JR82HTPa"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এখন আমরা এই ফাংশনটি ব্যবহার করে বিভিন্ন রান্নার ধরন অনুযায়ী শীর্ষ দশটি জনপ্রিয় উপাদানের ধারণা পেতে পারি। চলুন `thai_df` দিয়ে এটি পরীক্ষা করে দেখি।\n"
+ ],
+ "metadata": {
+ "id": "h9794WF8HWmc"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Call create_ingredient and display popular ingredients\r\n",
+ "thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
+ "\r\n",
+ "thai_ingredient_df %>% \r\n",
+ " slice_head(n = 10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "agQ-1HrcHaEA"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "পূর্ববর্তী অংশে, আমরা `geom_col()` ব্যবহার করেছি, চলুন দেখি কীভাবে আপনি `geom_bar` ব্যবহার করতে পারেন বার চার্ট তৈরি করার জন্য। আরও জানার জন্য `?geom_bar` ব্যবহার করুন।\n"
+ ],
+ "metadata": {
+ "id": "kHu9ffGjHdcX"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make a bar chart for popular thai cuisines\r\n",
+ "thai_ingredient_df %>% \r\n",
+ " slice_head(n = 10) %>% \r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
+ " xlab(\"\") + ylab(\"\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "fb3Bx_3DHj6e"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "জাপানি ডেটার জন্য একই কাজ করি\n"
+ ],
+ "metadata": {
+ "id": "RHP_xgdkHnvM"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
+ "create_ingredient(df = japanese_df) %>% \r\n",
+ " slice_head(n = 10) %>%\r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
+ " xlab(\"\") + ylab(\"\")\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "019v8F0XHrRU"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "চীনা খাবারের বিষয়ে কী বলা যায়?\n"
+ ],
+ "metadata": {
+ "id": "iIGM7vO8Hu3v"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
+ "create_ingredient(df = chinese_df) %>% \r\n",
+ " slice_head(n = 10) %>%\r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
+ " xlab(\"\") + ylab(\"\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "lHd9_gd2HyzU"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "চলুন ভারতীয় খাবারের দিকে এক নজর দিই 🌶️।\n"
+ ],
+ "metadata": {
+ "id": "ir8qyQbNH1c7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Get popular ingredients for Indian cuisines and make bar chart\r\n",
+ "create_ingredient(df = indian_df) %>% \r\n",
+ " slice_head(n = 10) %>%\r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
+ " xlab(\"\") + ylab(\"\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "ApukQtKjH5FO"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "অবশেষে কোরিয়ান উপাদানগুলি চিত্রিত করুন।\n"
+ ],
+ "metadata": {
+ "id": "qv30cwY1H-FM"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Get popular ingredients for Korean cuisines and make bar chart\r\n",
+ "create_ingredient(df = korean_df) %>% \r\n",
+ " slice_head(n = 10) %>%\r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
+ " xlab(\"\") + ylab(\"\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "lumgk9cHIBie"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ডেটা ভিজুয়ালাইজেশন থেকে, আমরা এখন সবচেয়ে সাধারণ উপাদানগুলো বাদ দিতে পারি যা বিভিন্ন রান্নার মধ্যে বিভ্রান্তি সৃষ্টি করে, `dplyr::select()` ব্যবহার করে।\n",
+ "\n",
+ "সবাই ভাত, রসুন এবং আদা পছন্দ করে!\n"
+ ],
+ "metadata": {
+ "id": "iO4veMXuIEta"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Drop id column, rice, garlic and ginger from our original data set\r\n",
+ "df_select <- df %>% \r\n",
+ " select(-c(1, rice, garlic, ginger))\r\n",
+ "\r\n",
+ "# Display new data set\r\n",
+ "df_select %>% \r\n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "iHJPiG6rIUcK"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## রেসিপি ব্যবহার করে ডেটা প্রি-প্রসেসিং 👩🍳👨🍳 - ভারসাম্যহীন ডেটা মোকাবিলা ⚖️\n",
+ "\n",
+ "
\n",
+ " \n",
+ " চিত্রকর্ম: @allison_horst\n",
+ "\n",
+ "যেহেতু এই পাঠটি রান্নার বিষয়ে, আমাদের `recipes` প্রসঙ্গ অনুযায়ী রাখতে হবে।\n",
+ "\n",
+ "Tidymodels একটি আরেকটি চমৎকার প্যাকেজ সরবরাহ করে: `recipes`- ডেটা প্রি-প্রসেসিংয়ের জন্য একটি প্যাকেজ।\n"
+ ],
+ "metadata": {
+ "id": "kkFd-JxdIaL6"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আসুন আবার আমাদের রান্নার ধরনগুলোর বণ্টন দেখে নিই।\n"
+ ],
+ "metadata": {
+ "id": "6l2ubtTPJAhY"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Distribution of cuisines\r\n",
+ "old_label_count <- df_select %>% \r\n",
+ " count(cuisine) %>% \r\n",
+ " arrange(desc(n))\r\n",
+ "\r\n",
+ "old_label_count"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "1e-E9cb7JDVi"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "যেমনটি দেখা যাচ্ছে, রান্নার ধরনগুলোর সংখ্যায় বেশ অসম বণ্টন রয়েছে। কোরিয়ান রান্নার সংখ্যা থাই রান্নার সংখ্যার প্রায় তিনগুণ। অসমতল ডেটা প্রায়ই মডেলের কার্যকারিতার উপর নেতিবাচক প্রভাব ফেলে। একটি বাইনারি শ্রেণীবিভাজনের কথা চিন্তা করুন। যদি আপনার ডেটার বেশিরভাগই একটি শ্রেণীর হয়, তাহলে একটি মেশিন লার্নিং মডেল সেই শ্রেণীটি বেশি বার ভবিষ্যদ্বাণী করবে, শুধুমাত্র কারণ সেই শ্রেণীর জন্য বেশি ডেটা রয়েছে। ডেটা ভারসাম্যপূর্ণ করা যেকোনো অসমতল ডেটাকে ঠিক করে এবং এই অসমতা দূর করতে সাহায্য করে। অনেক মডেল তখনই সেরা পারফর্ম করে যখন পর্যবেক্ষণের সংখ্যা সমান হয় এবং তাই অসমতল ডেটার সাথে কাজ করতে গিয়ে সমস্যায় পড়ে।\n",
+ "\n",
+ "অসমতল ডেটা সেটের সাথে কাজ করার দুটি প্রধান পদ্ধতি রয়েছে:\n",
+ "\n",
+ "- সংখ্যালঘু শ্রেণীতে পর্যবেক্ষণ যোগ করা: `ওভার-স্যাম্পলিং`, যেমন SMOTE অ্যালগরিদম ব্যবহার করা\n",
+ "\n",
+ "- সংখ্যাগুরু শ্রেণী থেকে পর্যবেক্ষণ সরানো: `আন্ডার-স্যাম্পলিং`\n",
+ "\n",
+ "এখন আমরা একটি `রেসিপি` ব্যবহার করে অসমতল ডেটা সেটের সাথে কীভাবে কাজ করতে হয় তা প্রদর্শন করব। একটি রেসিপিকে একটি নকশা হিসেবে ভাবা যেতে পারে যা বর্ণনা করে ডেটা সেটের উপর কী ধাপগুলো প্রয়োগ করা উচিত যাতে এটি ডেটা বিশ্লেষণের জন্য প্রস্তুত হয়।\n"
+ ],
+ "metadata": {
+ "id": "soAw6826JKx9"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load themis package for dealing with imbalanced data\r\n",
+ "library(themis)\r\n",
+ "\r\n",
+ "# Create a recipe for preprocessing data\r\n",
+ "cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
+ " step_smote(cuisine)\r\n",
+ "\r\n",
+ "cuisines_recipe"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "HS41brUIJVJy"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আমাদের প্রিপ্রসেসিং ধাপগুলো বিশ্লেষণ করি।\n",
+ "\n",
+ "- `recipe()`-এ একটি ফর্মুলা কল করার মাধ্যমে রেসিপিকে *ভেরিয়েবলগুলোর ভূমিকা* নির্ধারণ করতে বলা হয়, যেখানে `df_select` ডেটা রেফারেন্স হিসেবে ব্যবহৃত হয়। উদাহরণস্বরূপ, `cuisine` কলামটি `outcome` ভূমিকা পেয়েছে, আর বাকি কলামগুলোকে `predictor` ভূমিকা দেওয়া হয়েছে।\n",
+ "\n",
+ "- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) একটি রেসিপি ধাপের *স্পেসিফিকেশন* তৈরি করে, যা সংখ্যালঘু শ্রেণির নতুন উদাহরণ কৃত্রিমভাবে তৈরি করে এই কেসগুলোর নিকটতম প্রতিবেশীদের ব্যবহার করে।\n",
+ "\n",
+ "এখন, যদি আমরা প্রিপ্রসেসড ডেটা দেখতে চাই, তাহলে আমাদের [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) এবং [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) ব্যবহার করতে হবে।\n",
+ "\n",
+ "`prep()`: একটি প্রশিক্ষণ সেট থেকে প্রয়োজনীয় প্যারামিটার অনুমান করে, যা পরে অন্য ডেটা সেটে প্রয়োগ করা যেতে পারে।\n",
+ "\n",
+ "`bake()`: একটি প্রিপ করা রেসিপি নিয়ে সেটি যেকোনো ডেটা সেটে প্রয়োগ করে।\n"
+ ],
+ "metadata": {
+ "id": "Yb-7t7XcJaC8"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Prep and bake the recipe\r\n",
+ "preprocessed_df <- cuisines_recipe %>% \r\n",
+ " prep() %>% \r\n",
+ " bake(new_data = NULL) %>% \r\n",
+ " relocate(cuisine)\r\n",
+ "\r\n",
+ "# Display data\r\n",
+ "preprocessed_df %>% \r\n",
+ " slice_head(n = 5)\r\n",
+ "\r\n",
+ "# Quick summary stats\r\n",
+ "preprocessed_df %>% \r\n",
+ " introduce()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "9QhSgdpxJl44"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এবার চলুন আমাদের রান্নার বিতরণ পরীক্ষা করি এবং সেগুলিকে অসমতল ডেটার সাথে তুলনা করি।\n"
+ ],
+ "metadata": {
+ "id": "dmidELh_LdV7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Distribution of cuisines\r\n",
+ "new_label_count <- preprocessed_df %>% \r\n",
+ " count(cuisine) %>% \r\n",
+ " arrange(desc(n))\r\n",
+ "\r\n",
+ "list(new_label_count = new_label_count,\r\n",
+ " old_label_count = old_label_count)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "aSh23klBLwDz"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ইয়াম! ডেটা সুন্দর এবং পরিষ্কার, ভারসাম্যপূর্ণ, এবং খুবই সুস্বাদু 😋!\n",
+ "\n",
+ "> সাধারণত, একটি রেসিপি মডেলিংয়ের জন্য প্রিপ্রসেসর হিসেবে ব্যবহৃত হয় যেখানে এটি নির্ধারণ করে ডেটাসেটে কোন ধাপগুলো প্রয়োগ করা উচিত যাতে এটি মডেলিংয়ের জন্য প্রস্তুত হয়। সেই ক্ষেত্রে, একটি `workflow()` সাধারণত ব্যবহৃত হয় (যেমন আমরা আগের পাঠে দেখেছি) রেসিপি ম্যানুয়ালি অনুমান করার পরিবর্তে।\n",
+ ">\n",
+ "> তাই, আপনি সাধারণত **`prep()`** এবং **`bake()`** রেসিপি ব্যবহার করতে হয় না যখন আপনি tidymodels ব্যবহার করেন, তবে এগুলো আপনার টুলকিটে থাকা দরকার কারণ এগুলো নিশ্চিত করতে সাহায্য করে যে রেসিপিগুলো আপনার প্রত্যাশা অনুযায়ী কাজ করছে, যেমন আমাদের ক্ষেত্রে।\n",
+ ">\n",
+ "> যখন আপনি **`bake()`** করেন একটি প্রিপ করা রেসিপি দিয়ে **`new_data = NULL`**, তখন আপনি সেই ডেটা ফিরে পান যা আপনি রেসিপি সংজ্ঞায়িত করার সময় দিয়েছিলেন, তবে এটি প্রিপ্রসেসিং ধাপগুলো অতিক্রম করেছে।\n",
+ "\n",
+ "এখন চলুন এই ডেটার একটি কপি ভবিষ্যতের পাঠে ব্যবহারের জন্য সংরক্ষণ করি:\n"
+ ],
+ "metadata": {
+ "id": "HEu80HZ8L7ae"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Save preprocessed data\r\n",
+ "write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "cBmCbIgrMOI6"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এই নতুন CSV এখন রুট ডেটা ফোল্ডারে পাওয়া যাবে।\n",
+ "\n",
+ "**🚀চ্যালেঞ্জ**\n",
+ "\n",
+ "এই পাঠ্যক্রমে বেশ কিছু আকর্ষণীয় ডেটাসেট রয়েছে। `data` ফোল্ডারগুলো ঘেঁটে দেখুন, কোনো ডেটাসেট কি বাইনারি বা মাল্টি-ক্লাস ক্লাসিফিকেশনের জন্য উপযুক্ত হতে পারে? এই ডেটাসেট নিয়ে আপনি কী প্রশ্ন করবেন?\n",
+ "\n",
+ "## [**পোস্ট-লেকচার কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
+ "\n",
+ "## **পুনরালোচনা ও স্ব-অধ্যয়ন**\n",
+ "\n",
+ "- [প্যাকেজ themis](https://github.com/tidymodels/themis) দেখুন। ভারসাম্যহীন ডেটা মোকাবিলার জন্য আমরা আর কী কী কৌশল ব্যবহার করতে পারি?\n",
+ "\n",
+ "- Tidy models-এর [রেফারেন্স ওয়েবসাইট](https://www.tidymodels.org/start/)।\n",
+ "\n",
+ "- এইচ. উইকহ্যাম এবং জি. গ্রোলেমুন্ড, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/)।\n",
+ "\n",
+ "#### ধন্যবাদ জানাই:\n",
+ "\n",
+ "[`অ্যালিসন হর্স্ট`](https://twitter.com/allison_horst/) কে, যিনি অসাধারণ ইলাস্ট্রেশন তৈরি করেছেন যা R-কে আরও আকর্ষণীয় এবং সহজলভ্য করে তুলেছে। তার আরও ইলাস্ট্রেশন খুঁজে পেতে পারেন এই [গ্যালারিতে](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM)।\n",
+ "\n",
+ "[Cassie Breviu](https://www.twitter.com/cassieview) এবং [Jen Looper](https://www.twitter.com/jenlooper) কে, যারা এই মডিউলের মূল Python সংস্করণ তৈরি করেছেন ♥️\n",
+ "\n",
+ "
\n",
+ " \n",
+ " @allison_horst এর শিল্পকর্ম\n"
+ ],
+ "metadata": {
+ "id": "WQs5621pMGwf"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/4-Classification/1-Introduction/solution/notebook.ipynb b/translations/bn/4-Classification/1-Introduction/solution/notebook.ipynb
new file mode 100644
index 000000000..796080c04
--- /dev/null
+++ b/translations/bn/4-Classification/1-Introduction/solution/notebook.ipynb
@@ -0,0 +1,698 @@
+{
+ "cells": [
+ {
+ "source": [
+ "# সুস্বাদু এশিয়ান এবং ভারতীয় খাবার\n",
+ "\n",
+ "## ভূমিকা\n",
+ "এশিয়ান এবং ভারতীয় খাবার তাদের বৈচিত্র্যময় স্বাদ এবং উপাদানের জন্য বিশ্বজুড়ে জনপ্রিয়। এই রান্নাগুলি প্রায়শই তাজা উপাদান, সুগন্ধি মশলা এবং অনন্য রান্নার কৌশল ব্যবহার করে তৈরি করা হয়।\n",
+ "\n",
+ "## জনপ্রিয় এশিয়ান খাবার\n",
+ "### সুশি\n",
+ "সুশি একটি জাপানি খাবার যা সাধারণত ভিনেগারযুক্ত চাল, কাঁচা মাছ এবং সবজি দিয়ে তৈরি হয়। এটি বিভিন্ন ধরণের এবং শৈলীতে আসে, যেমন:\n",
+ "- **নিগিরি**: চালের উপর মাছের টুকরো।\n",
+ "- **মাকি**: চাল এবং উপাদান সমূহ সমুদ্র শৈবাল দিয়ে মোড়ানো।\n",
+ "- **সাশিমি**: শুধুমাত্র কাঁচা মাছ।\n",
+ "\n",
+ "### প্যাড থাই\n",
+ "প্যাড থাই একটি থাই নুডল খাবার যা ট্যামারিন্ড সস, চিংড়ি বা মুরগি, ডিম এবং পিনাট দিয়ে তৈরি হয়। এটি মিষ্টি, টক এবং মশলাদার স্বাদের একটি নিখুঁত মিশ্রণ।\n",
+ "\n",
+ "## জনপ্রিয় ভারতীয় খাবার\n",
+ "### চিকেন টিক্কা মাসালা\n",
+ "চিকেন টিক্কা মাসালা একটি ক্রিমি এবং মশলাদার খাবার যা গ্রিল করা মুরগি এবং টমেটো-ভিত্তিক সস দিয়ে তৈরি হয়। এটি সাধারণত নান বা ভাতের সাথে পরিবেশন করা হয়।\n",
+ "\n",
+ "### বিরিয়ানি\n",
+ "বিরিয়ানি একটি সুগন্ধি মশলাদার চালের খাবার যা মাংস, মাছ বা সবজি দিয়ে তৈরি হয়। এটি বিভিন্ন অঞ্চলে বিভিন্ন ধরণের পাওয়া যায়, যেমন:\n",
+ "- **হায়দ্রাবাদি বিরিয়ানি**: মশলাদার এবং সুগন্ধি।\n",
+ "- **লখনউ বিরিয়ানি**: হালকা এবং সুস্বাদু।\n",
+ "\n",
+ "## উপসংহার\n",
+ "এশিয়ান এবং ভারতীয় খাবার তাদের স্বাদ এবং বৈচিত্র্যের জন্য অনন্য। এই খাবারগুলি শুধুমাত্র খাওয়ার জন্য নয়, বরং সংস্কৃতি এবং ঐতিহ্যের একটি অংশ।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "Imblearn ইনস্টল করুন যা SMOTE সক্ষম করবে। এটি একটি Scikit-learn প্যাকেজ যা শ্রেণীবিভাজন করার সময় অসমতল ডেটা পরিচালনা করতে সহায়তা করে। (https://imbalanced-learn.org/stable/)\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Requirement already satisfied: imblearn in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (0.0)\n",
+ "Requirement already satisfied: imbalanced-learn in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imblearn) (0.8.0)\n",
+ "Requirement already satisfied: numpy>=1.13.3 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (1.19.2)\n",
+ "Requirement already satisfied: scipy>=0.19.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (1.4.1)\n",
+ "Requirement already satisfied: scikit-learn>=0.24 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (0.24.2)\n",
+ "Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (0.16.0)\n",
+ "Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.24->imbalanced-learn->imblearn) (2.1.0)\n",
+ "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
+ "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "pip install imblearn"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib as mpl\n",
+ "import numpy as np\n",
+ "from imblearn.over_sampling import SMOTE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.read_csv('../../data/cuisines.csv')"
+ ]
+ },
+ {
+ "source": [
+ "এই ডেটাসেটে ৩৮৫টি কলাম অন্তর্ভুক্ত রয়েছে যা একটি নির্দিষ্ট সেটের বিভিন্ন রান্নার উপাদানগুলির সমস্ত প্রকার নির্দেশ করে।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
+ "0 65 indian 0 0 0 0 0 \n",
+ "1 66 indian 1 0 0 0 0 \n",
+ "2 67 indian 0 0 0 0 0 \n",
+ "3 68 indian 0 0 0 0 0 \n",
+ "4 69 indian 0 0 0 0 0 \n",
+ "\n",
+ " apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
+ "0 0 0 0 ... 0 0 0 \n",
+ "1 0 0 0 ... 0 0 0 \n",
+ "2 0 0 0 ... 0 0 0 \n",
+ "3 0 0 0 ... 0 0 0 \n",
+ "4 0 0 0 ... 0 0 0 \n",
+ "\n",
+ " whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
+ "0 0 0 0 0 0 0 0 \n",
+ "1 0 0 0 0 0 0 0 \n",
+ "2 0 0 0 0 0 0 0 \n",
+ "3 0 0 0 0 0 0 0 \n",
+ "4 0 0 0 0 0 1 0 \n",
+ "\n",
+ "[5 rows x 385 columns]"
+ ],
+ "text/html": "
\n"
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 535
+ },
+ "id": "w5FWIkEiIjdN",
+ "outputId": "2e195fd9-1a8f-4b91-9573-cce5582242df"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 2. ভারসাম্যহীন ডেটার সাথে কাজ করা\n",
+ "\n",
+ "আপনি হয়তো লক্ষ্য করেছেন যে মূল ডেটাসেট এবং আমাদের প্রশিক্ষণ সেটে রান্নার ধরনগুলোর সংখ্যায় বেশ অসম বণ্টন রয়েছে। কোরিয়ান রান্নার সংখ্যা *প্রায়* থাই রান্নার সংখ্যার তিন গুণ। ভারসাম্যহীন ডেটা প্রায়শই মডেলের কার্যকারিতার উপর নেতিবাচক প্রভাব ফেলে। অনেক মডেল তখনই সবচেয়ে ভালো কাজ করে যখন পর্যবেক্ষণের সংখ্যা সমান হয় এবং তাই ভারসাম্যহীন ডেটার সাথে কাজ করতে গিয়ে সমস্যায় পড়ে।\n",
+ "\n",
+ "ভারসাম্যহীন ডেটাসেটের সাথে কাজ করার দুটি প্রধান উপায় রয়েছে:\n",
+ "\n",
+ "- সংখ্যালঘু শ্রেণিতে পর্যবেক্ষণ যোগ করা: `Over-sampling`, যেমন SMOTE অ্যালগরিদম ব্যবহার করা, যা সংখ্যালঘু শ্রেণির নতুন উদাহরণ কৃত্রিমভাবে তৈরি করে এই কেসগুলোর নিকটতম প্রতিবেশীদের ব্যবহার করে।\n",
+ "\n",
+ "- সংখ্যাগরিষ্ঠ শ্রেণি থেকে পর্যবেক্ষণ সরিয়ে ফেলা: `Under-sampling`\n",
+ "\n",
+ "আমাদের আগের পাঠে, আমরা একটি `recipe` ব্যবহার করে কীভাবে ভারসাম্যহীন ডেটাসেটের সাথে কাজ করতে হয় তা দেখিয়েছি। একটি রেসিপিকে এমন একটি নকশা হিসেবে ভাবা যেতে পারে যা বর্ণনা করে যে ডেটাসেটকে ডেটা বিশ্লেষণের জন্য প্রস্তুত করতে কী কী ধাপ প্রয়োগ করা উচিত। আমাদের ক্ষেত্রে, আমরা চাই আমাদের `training set`-এ রান্নার ধরনগুলোর সংখ্যায় সমান বণ্টন থাকুক। চলুন, সরাসরি কাজ শুরু করি।\n"
+ ],
+ "metadata": {
+ "id": "daBi9qJNIwqW"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "source": [
+ "# Load themis package for dealing with imbalanced data\r\n",
+ "library(themis)\r\n",
+ "\r\n",
+ "# Create a recipe for preprocessing training data\r\n",
+ "cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>% \r\n",
+ " step_smote(cuisine)\r\n",
+ "\r\n",
+ "# Print recipe\r\n",
+ "cuisines_recipe"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "Data Recipe\n",
+ "\n",
+ "Inputs:\n",
+ "\n",
+ " role #variables\n",
+ " outcome 1\n",
+ " predictor 380\n",
+ "\n",
+ "Operations:\n",
+ "\n",
+ "SMOTE based on cuisine"
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 200
+ },
+ "id": "Az6LFBGxI1X0",
+ "outputId": "29d71d85-64b0-4e62-871e-bcd5398573b6"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আপনি অবশ্যই নিশ্চিত করতে পারেন (prep + bake ব্যবহার করে) যে রেসিপিটি আপনার প্রত্যাশা অনুযায়ী কাজ করবে - সব কুইজিন লেবেলে `559`টি পর্যবেক্ষণ রয়েছে।\n",
+ "\n",
+ "যেহেতু আমরা এই রেসিপিটিকে মডেলিংয়ের জন্য একটি প্রিপ্রসেসর হিসেবে ব্যবহার করব, একটি `workflow()` আমাদের জন্য সমস্ত prep এবং bake সম্পন্ন করবে, তাই আমাদের রেসিপিটি ম্যানুয়ালি অনুমান করতে হবে না।\n",
+ "\n",
+ "এখন আমরা একটি মডেল প্রশিক্ষণের জন্য প্রস্তুত 👩💻👨💻!\n",
+ "\n",
+ "## ৩. আপনার ক্লাসিফায়ার নির্বাচন করা\n",
+ "\n",
+ "
\n",
+ " \n",
+ " @allison_horst এর শিল্পকর্ম\n"
+ ],
+ "metadata": {
+ "id": "NBL3PqIWJBBB"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এখন আমাদের সিদ্ধান্ত নিতে হবে কোন অ্যালগরিদমটি এই কাজের জন্য ব্যবহার করা হবে 🤔।\n",
+ "\n",
+ "Tidymodels-এ, [`parsnip প্যাকেজ`](https://parsnip.tidymodels.org/index.html) বিভিন্ন ইঞ্জিন (প্যাকেজ) জুড়ে মডেলের সাথে কাজ করার জন্য একটি সঙ্গতিপূর্ণ ইন্টারফেস প্রদান করে। দয়া করে parsnip ডকুমেন্টেশনটি দেখুন [মডেলের ধরন ও ইঞ্জিন](https://www.tidymodels.org/find/parsnip/#models) এবং তাদের সংশ্লিষ্ট [মডেল আর্গুমেন্ট](https://www.tidymodels.org/find/parsnip/#model-args) অন্বেষণ করার জন্য। প্রথম দেখায় বৈচিত্র্যটি বেশ বিভ্রান্তিকর মনে হতে পারে। উদাহরণস্বরূপ, নিম্নলিখিত পদ্ধতিগুলি সবই শ্রেণীবিন্যাস কৌশল অন্তর্ভুক্ত করে:\n",
+ "\n",
+ "- C5.0 রুল-ভিত্তিক শ্রেণীবিন্যাস মডেল\n",
+ "\n",
+ "- ফ্লেক্সিবল ডিসক্রিমিন্যান্ট মডেল\n",
+ "\n",
+ "- লিনিয়ার ডিসক্রিমিন্যান্ট মডেল\n",
+ "\n",
+ "- রেগুলারাইজড ডিসক্রিমিন্যান্ট মডেল\n",
+ "\n",
+ "- লজিস্টিক রিগ্রেশন মডেল\n",
+ "\n",
+ "- মাল্টিনোমিয়াল রিগ্রেশন মডেল\n",
+ "\n",
+ "- নেভ বেইজ মডেল\n",
+ "\n",
+ "- সাপোর্ট ভেক্টর মেশিন\n",
+ "\n",
+ "- নিকটতম প্রতিবেশী\n",
+ "\n",
+ "- ডিসিশন ট্রি\n",
+ "\n",
+ "- এনসেম্বল পদ্ধতি\n",
+ "\n",
+ "- নিউরাল নেটওয়ার্ক\n",
+ "\n",
+ "তালিকাটি চলতেই থাকে!\n",
+ "\n",
+ "### **কোন শ্রেণীবিন্যাসকারী বেছে নেবেন?**\n",
+ "\n",
+ "তাহলে, কোন শ্রেণীবিন্যাসকারীটি আপনি বেছে নেবেন? প্রায়শই, কয়েকটি চালিয়ে দেখা এবং একটি ভালো ফলাফলের জন্য পরীক্ষা করা একটি উপায়।\n",
+ "\n",
+ "> AutoML এই সমস্যাটি চমৎকারভাবে সমাধান করে ক্লাউডে এই তুলনাগুলি চালিয়ে, আপনার ডেটার জন্য সেরা অ্যালগরিদমটি বেছে নেওয়ার সুযোগ দেয়। এটি [এখানে](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott) চেষ্টা করুন।\n",
+ "\n",
+ "এছাড়াও শ্রেণীবিন্যাসকারীর পছন্দ আমাদের সমস্যার উপর নির্ভর করে। উদাহরণস্বরূপ, যখন ফলাফলটি `দুইটির বেশি শ্রেণীতে` শ্রেণীবদ্ধ করা যায়, যেমন আমাদের ক্ষেত্রে, আপনাকে `মাল্টিক্লাস শ্রেণীবিন্যাস অ্যালগরিদম` ব্যবহার করতে হবে `বাইনারি শ্রেণীবিন্যাস` এর পরিবর্তে।\n",
+ "\n",
+ "### **একটি ভালো পদ্ধতি**\n",
+ "\n",
+ "তবে, এলোমেলোভাবে অনুমান করার চেয়ে একটি ভালো উপায় হল এই ডাউনলোডযোগ্য [ML চিট শিট](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott)-এর ধারণাগুলি অনুসরণ করা। এখানে, আমরা আবিষ্কার করি যে, আমাদের মাল্টিক্লাস সমস্যার জন্য, আমাদের কিছু বিকল্প রয়েছে:\n",
+ "\n",
+ "
\n",
+ " \n",
+ " মাইক্রোসফটের অ্যালগরিদম চিট শিটের একটি অংশ, যেখানে মাল্টিক্লাস শ্রেণীবিন্যাসের বিকল্পগুলি দেখানো হয়েছে\n"
+ ],
+ "metadata": {
+ "id": "a6DLAZ3vJZ14"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### **যুক্তি**\n",
+ "\n",
+ "চলুন আমরা বিভিন্ন পদ্ধতির মাধ্যমে সমস্যার সমাধান করার চেষ্টা করি, আমাদের সীমাবদ্ধতাগুলো মাথায় রেখে:\n",
+ "\n",
+ "- **ডিপ নিউরাল নেটওয়ার্ক খুব ভারী।** আমাদের ডেটাসেট পরিষ্কার কিন্তু সীমিত, এবং আমরা লোকাল নোটবুকে ট্রেনিং চালাচ্ছি, তাই ডিপ নিউরাল নেটওয়ার্ক এই কাজের জন্য খুব ভারী।\n",
+ "\n",
+ "- **দুই-শ্রেণীর ক্লাসিফায়ার নয়।** আমরা দুই-শ্রেণীর ক্লাসিফায়ার ব্যবহার করছি না, তাই এটি এক-ভি-অল পদ্ধতিকে বাদ দেয়।\n",
+ "\n",
+ "- **ডিসিশন ট্রি বা লজিস্টিক রিগ্রেশন কাজ করতে পারে।** ডিসিশন ট্রি কাজ করতে পারে, অথবা মাল্টিনোমিয়াল রিগ্রেশন/মাল্টিক্লাস লজিস্টিক রিগ্রেশন মাল্টিক্লাস ডেটার জন্য কার্যকর হতে পারে।\n",
+ "\n",
+ "- **মাল্টিক্লাস বুস্টেড ডিসিশন ট্রি ভিন্ন সমস্যা সমাধান করে।** মাল্টিক্লাস বুস্টেড ডিসিশন ট্রি সাধারণত নন-প্যারামেট্রিক কাজের জন্য উপযুক্ত, যেমন র্যাঙ্কিং তৈরি করার কাজ, তাই এটি আমাদের জন্য কার্যকর নয়।\n",
+ "\n",
+ "সাধারণত, জটিল মেশিন লার্নিং মডেল যেমন এনসেম্বল পদ্ধতি শুরু করার আগে, সবচেয়ে সহজ মডেল তৈরি করা ভালো, যাতে বোঝা যায় কী ঘটছে। তাই এই পাঠে আমরা `মাল্টিনোমিয়াল রিগ্রেশন` মডেল দিয়ে শুরু করব।\n",
+ "\n",
+ "> লজিস্টিক রিগ্রেশন একটি পদ্ধতি যা ব্যবহার করা হয় যখন আউটকাম ভ্যারিয়েবল ক্যাটেগরিক্যাল (বা নামমাত্র) হয়। বাইনারি লজিস্টিক রিগ্রেশনের ক্ষেত্রে আউটকাম ভ্যারিয়েবল দুইটি হয়, যেখানে মাল্টিনোমিয়াল লজিস্টিক রিগ্রেশনের ক্ষেত্রে আউটকাম ভ্যারিয়েবল দুইটির বেশি হয়। আরও জানতে [Advanced Regression Methods](https://bookdown.org/chua/ber642_advanced_regression/multinomial-logistic-regression.html) দেখুন।\n",
+ "\n",
+ "## ৪. মাল্টিনোমিয়াল লজিস্টিক রিগ্রেশন মডেল ট্রেন এবং মূল্যায়ন করুন।\n",
+ "\n",
+ "Tidymodels-এ, `parsnip::multinom_reg()` একটি মডেল সংজ্ঞায়িত করে যা লিনিয়ার প্রেডিক্টর ব্যবহার করে মাল্টিক্লাস ডেটা মাল্টিনোমিয়াল ডিস্ট্রিবিউশন দিয়ে প্রেডিক্ট করে। এই মডেল ফিট করার বিভিন্ন উপায়/ইঞ্জিন দেখতে `?multinom_reg()` দেখুন।\n",
+ "\n",
+ "এই উদাহরণে, আমরা ডিফল্ট [nnet](https://cran.r-project.org/web/packages/nnet/nnet.pdf) ইঞ্জিন ব্যবহার করে একটি মাল্টিনোমিয়াল রিগ্রেশন মডেল ফিট করব।\n",
+ "\n",
+ "> আমি `penalty` এর একটি মান এলোমেলোভাবে বেছে নিয়েছি। এই মান বেছে নেওয়ার আরও ভালো উপায় আছে, যেমন `resampling` এবং মডেল `tuning` করা, যা আমরা পরে আলোচনা করব।\n",
+ ">\n",
+ "> মডেল হাইপারপ্যারামিটার টিউনিং সম্পর্কে আরও জানতে [Tidymodels: Get Started](https://www.tidymodels.org/start/tuning/) দেখুন।\n"
+ ],
+ "metadata": {
+ "id": "gWMsVcbBJemu"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "source": [
+ "# Create a multinomial regression model specification\r\n",
+ "mr_spec <- multinom_reg(penalty = 1) %>% \r\n",
+ " set_engine(\"nnet\", MaxNWts = 2086) %>% \r\n",
+ " set_mode(\"classification\")\r\n",
+ "\r\n",
+ "# Print model specification\r\n",
+ "mr_spec"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "Multinomial Regression Model Specification (classification)\n",
+ "\n",
+ "Main Arguments:\n",
+ " penalty = 1\n",
+ "\n",
+ "Engine-Specific Arguments:\n",
+ " MaxNWts = 2086\n",
+ "\n",
+ "Computational engine: nnet \n"
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 166
+ },
+ "id": "Wq_fcyQiJvfG",
+ "outputId": "c30449c7-3864-4be7-f810-72a003743e2d"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "দারুণ কাজ 🥳! এখন যেহেতু আমাদের কাছে একটি রেসিপি এবং একটি মডেল স্পেসিফিকেশন রয়েছে, আমাদের সেগুলো একসাথে একটি অবজেক্টে সংযুক্ত করার উপায় খুঁজতে হবে যা প্রথমে ডেটা প্রিপ্রসেস করবে, তারপর প্রিপ্রসেসড ডেটার উপর মডেল ফিট করবে এবং সম্ভাব্য পোস্ট-প্রসেসিং কার্যক্রমের জন্যও সুযোগ দেবে। Tidymodels-এ, এই সুবিধাজনক অবজেক্টটিকে [`workflow`](https://workflows.tidymodels.org/) বলা হয় এবং এটি আপনার মডেলিং কম্পোনেন্টগুলোকে সহজভাবে ধরে রাখে! এটিকে আমরা *Python*-এ *pipelines* বলি।\n",
+ "\n",
+ "তাহলে চলুন সবকিছু একটি workflow-এ সংযুক্ত করি!📦\n"
+ ],
+ "metadata": {
+ "id": "NlSbzDfgJ0zh"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "source": [
+ "# Bundle recipe and model specification\r\n",
+ "mr_wf <- workflow() %>% \r\n",
+ " add_recipe(cuisines_recipe) %>% \r\n",
+ " add_model(mr_spec)\r\n",
+ "\r\n",
+ "# Print out workflow\r\n",
+ "mr_wf"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "══ Workflow ════════════════════════════════════════════════════════════════════\n",
+ "\u001b[3mPreprocessor:\u001b[23m Recipe\n",
+ "\u001b[3mModel:\u001b[23m multinom_reg()\n",
+ "\n",
+ "── Preprocessor ────────────────────────────────────────────────────────────────\n",
+ "1 Recipe Step\n",
+ "\n",
+ "• step_smote()\n",
+ "\n",
+ "── Model ───────────────────────────────────────────────────────────────────────\n",
+ "Multinomial Regression Model Specification (classification)\n",
+ "\n",
+ "Main Arguments:\n",
+ " penalty = 1\n",
+ "\n",
+ "Engine-Specific Arguments:\n",
+ " MaxNWts = 2086\n",
+ "\n",
+ "Computational engine: nnet \n"
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 333
+ },
+ "id": "Sc1TfPA4Ke3_",
+ "outputId": "82c70013-e431-4e7e-cef6-9fcf8aad4a6c"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ওয়ার্কফ্লো 👌👌! একটি **`workflow()`** প্রায় একইভাবে ফিট করা যায় যেভাবে একটি মডেল ফিট করা যায়। তাহলে, মডেল প্রশিক্ষণের সময়!\n"
+ ],
+ "metadata": {
+ "id": "TNQ8i85aKf9L"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "source": [
+ "# Train a multinomial regression model\n",
+ "mr_fit <- fit(object = mr_wf, data = cuisines_train)\n",
+ "\n",
+ "mr_fit"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "══ Workflow [trained] ══════════════════════════════════════════════════════════\n",
+ "\u001b[3mPreprocessor:\u001b[23m Recipe\n",
+ "\u001b[3mModel:\u001b[23m multinom_reg()\n",
+ "\n",
+ "── Preprocessor ────────────────────────────────────────────────────────────────\n",
+ "1 Recipe Step\n",
+ "\n",
+ "• step_smote()\n",
+ "\n",
+ "── Model ───────────────────────────────────────────────────────────────────────\n",
+ "Call:\n",
+ "nnet::multinom(formula = ..y ~ ., data = data, decay = ~1, MaxNWts = ~2086, \n",
+ " trace = FALSE)\n",
+ "\n",
+ "Coefficients:\n",
+ " (Intercept) almond angelica anise anise_seed apple\n",
+ "indian 0.19723325 0.2409661 0 -5.004955e-05 -0.1657635 -0.05769734\n",
+ "japanese 0.13961959 -0.6262400 0 -1.169155e-04 -0.4893596 -0.08585717\n",
+ "korean 0.22377347 -0.1833485 0 -5.560395e-05 -0.2489401 -0.15657804\n",
+ "thai -0.04336577 -0.6106258 0 4.903828e-04 -0.5782866 0.63451105\n",
+ " apple_brandy apricot armagnac artemisia artichoke asparagus\n",
+ "indian 0 0.37042636 0 -0.09122797 0 -0.27181970\n",
+ "japanese 0 0.28895643 0 -0.12651100 0 0.14054037\n",
+ "korean 0 -0.07981259 0 0.55756709 0 -0.66979948\n",
+ "thai 0 -0.33160904 0 -0.10725182 0 -0.02602152\n",
+ " avocado bacon baked_potato balm banana barley\n",
+ "indian -0.46624197 0.16008055 0 0 -0.2838796 0.2230625\n",
+ "japanese 0.90341344 0.02932727 0 0 -0.4142787 2.0953906\n",
+ "korean -0.06925382 -0.35804134 0 0 -0.2686963 -0.7233404\n",
+ "thai -0.21473955 -0.75594439 0 0 0.6784880 -0.4363320\n",
+ " bartlett_pear basil bay bean beech\n",
+ "indian 0 -0.7128756 0.1011587 -0.8777275 -0.0004380795\n",
+ "japanese 0 0.1288697 0.9425626 -0.2380748 0.3373437611\n",
+ "korean 0 -0.2445193 -0.4744318 -0.8957870 -0.0048784496\n",
+ "thai 0 1.5365848 0.1333256 0.2196970 -0.0113078024\n",
+ " beef beef_broth beef_liver beer beet\n",
+ "indian -0.7985278 0.2430186 -0.035598065 -0.002173738 0.01005813\n",
+ "japanese 0.2241875 -0.3653020 -0.139551027 0.128905553 0.04923911\n",
+ "korean 0.5366515 -0.6153237 0.213455197 -0.010828645 0.27325423\n",
+ "thai 0.1570012 -0.9364154 -0.008032213 -0.035063746 -0.28279823\n",
+ " bell_pepper bergamot berry bitter_orange black_bean\n",
+ "indian 0.49074330 0 0.58947607 0.191256164 -0.1945233\n",
+ "japanese 0.09074167 0 -0.25917977 -0.118915977 -0.3442400\n",
+ "korean -0.57876763 0 -0.07874180 -0.007729435 -0.5220672\n",
+ "thai 0.92554006 0 -0.07210196 -0.002983296 -0.4614426\n",
+ " black_currant black_mustard_seed_oil black_pepper black_raspberry\n",
+ "indian 0 0.38935801 -0.4453495 0\n",
+ "japanese 0 -0.05452887 -0.5440869 0\n",
+ "korean 0 -0.03929970 0.8025454 0\n",
+ "thai 0 -0.21498372 -0.9854806 0\n",
+ " black_sesame_seed black_tea blackberry blackberry_brandy\n",
+ "indian -0.2759246 0.3079977 0.191256164 0\n",
+ "japanese -0.6101687 -0.1671913 -0.118915977 0\n",
+ "korean 1.5197674 -0.3036261 -0.007729435 0\n",
+ "thai -0.1755656 -0.1487033 -0.002983296 0\n",
+ " blue_cheese blueberry bone_oil bourbon_whiskey brandy\n",
+ "indian 0 0.216164294 -0.2276744 0 0.22427587\n",
+ "japanese 0 -0.119186087 0.3913019 0 -0.15595599\n",
+ "korean 0 -0.007821986 0.2854487 0 -0.02562342\n",
+ "thai 0 -0.004947048 -0.0253658 0 -0.05715244\n",
+ "\n",
+ "...\n",
+ "and 308 more lines."
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
+ },
+ "id": "GMbdfVmTKkJI",
+ "outputId": "adf9ebdf-d69d-4a64-e9fd-e06e5322292e"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "মডেল প্রশিক্ষণের সময় যে সহগগুলো শিখেছে, সেগুলো আউটপুটে প্রদর্শিত হয়।\n",
+ "\n",
+ "### প্রশিক্ষিত মডেল মূল্যায়ন করুন\n",
+ "\n",
+ "এখন সময় এসেছে মডেলটি কেমন কাজ করেছে তা মূল্যায়ন করার 📏, একটি টেস্ট সেটের উপর পরীক্ষা করে! চলুন শুরু করি টেস্ট সেটের উপর পূর্বাভাস তৈরি করে।\n"
+ ],
+ "metadata": {
+ "id": "tt2BfOxrKmcJ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "source": [
+ "# Make predictions on the test set\n",
+ "results <- cuisines_test %>% select(cuisine) %>% \n",
+ " bind_cols(mr_fit %>% predict(new_data = cuisines_test))\n",
+ "\n",
+ "# Print out results\n",
+ "results %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " cuisine .pred_class\n",
+ "1 indian thai \n",
+ "2 indian indian \n",
+ "3 indian indian \n",
+ "4 indian indian \n",
+ "5 indian indian "
+ ],
+ "text/markdown": [
+ "\n",
+ "A tibble: 5 × 2\n",
+ "\n",
+ "| cuisine <fct> | .pred_class <fct> |\n",
+ "|---|---|\n",
+ "| indian | thai |\n",
+ "| indian | indian |\n",
+ "| indian | indian |\n",
+ "| indian | indian |\n",
+ "| indian | indian |\n",
+ "\n"
+ ],
+ "text/latex": [
+ "A tibble: 5 × 2\n",
+ "\\begin{tabular}{ll}\n",
+ " cuisine & .pred\\_class\\\\\n",
+ " & \\\\\n",
+ "\\hline\n",
+ "\t indian & thai \\\\\n",
+ "\t indian & indian\\\\\n",
+ "\t indian & indian\\\\\n",
+ "\t indian & indian\\\\\n",
+ "\t indian & indian\\\\\n",
+ "\\end{tabular}\n"
+ ],
+ "text/html": [
+ "
"
+ },
+ "metadata": {},
+ "execution_count": 8
+ }
+ ],
+ "source": [
+ "#rehsape to 2d array and transpose\n",
+ "test= X_test.iloc[50].values.reshape(-1, 1).T\n",
+ "# predict with score\n",
+ "proba = model.predict_proba(test)\n",
+ "classes = model.classes_\n",
+ "# create df with classes and scores\n",
+ "resultdf = pd.DataFrame(data=proba, columns=classes)\n",
+ "\n",
+ "# create df to show results\n",
+ "topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])\n",
+ "topPrediction.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ " precision recall f1-score support\n\n chinese 0.75 0.73 0.74 223\n indian 0.93 0.88 0.90 255\n japanese 0.78 0.78 0.78 253\n korean 0.87 0.86 0.86 236\n thai 0.76 0.84 0.80 232\n\n accuracy 0.82 1199\n macro avg 0.82 0.82 0.82 1199\nweighted avg 0.82 0.82 0.82 1199\n\n"
+ ]
+ }
+ ],
+ "source": [
+ "y_pred = model.predict(X_test)\r\n",
+ "print(classification_report(y_test,y_pred))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "9408506dd864f2b6e334c62f80c0cfcc",
+ "translation_date": "2025-08-29T23:41:07+00:00",
+ "source_file": "4-Classification/2-Classifiers-1/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
\ No newline at end of file
diff --git a/translations/bn/4-Classification/3-Classifiers-2/README.md b/translations/bn/4-Classification/3-Classifiers-2/README.md
new file mode 100644
index 000000000..8ae29acb9
--- /dev/null
+++ b/translations/bn/4-Classification/3-Classifiers-2/README.md
@@ -0,0 +1,249 @@
+
+# কুইজিন শ্রেণীবিভাজক ২
+
+এই দ্বিতীয় শ্রেণীবিভাজন পাঠে, আপনি সংখ্যাসূচক ডেটা শ্রেণীবিভাজনের আরও পদ্ধতি অন্বেষণ করবেন। এছাড়াও, আপনি একটি শ্রেণীবিভাজক নির্বাচন করার প্রভাব সম্পর্কে শিখবেন।
+
+## [পূর্ব-পাঠ কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)
+
+### পূর্বশর্ত
+
+আমরা ধরে নিচ্ছি যে আপনি পূর্ববর্তী পাঠগুলি সম্পন্ন করেছেন এবং আপনার `data` ফোল্ডারে একটি পরিষ্কার ডেটাসেট রয়েছে যার নাম _cleaned_cuisines.csv_, যা এই ৪-পাঠের ফোল্ডারের মূল অংশে রয়েছে।
+
+### প্রস্তুতি
+
+আমরা আপনার _notebook.ipynb_ ফাইলটি পরিষ্কার ডেটাসেট দিয়ে লোড করেছি এবং এটি X এবং y ডেটাফ্রেমে ভাগ করেছি, যা মডেল তৈরির প্রক্রিয়ার জন্য প্রস্তুত।
+
+## একটি শ্রেণীবিভাজন মানচিত্র
+
+পূর্বে, আপনি মাইক্রোসফটের চিট শিট ব্যবহার করে ডেটা শ্রেণীবিভাজনের বিভিন্ন বিকল্প সম্পর্কে শিখেছেন। Scikit-learn একটি অনুরূপ কিন্তু আরও বিস্তারিত চিট শিট অফার করে যা আপনার শ্রেণীবিভাজক (অন্য শব্দে, এস্টিমেটর) সংকুচিত করতে সাহায্য করতে পারে:
+
+
+> টিপ: [এই মানচিত্রটি অনলাইনে দেখুন](https://scikit-learn.org/stable/tutorial/machine_learning_map/) এবং পথ ধরে ক্লিক করে ডকুমেন্টেশন পড়ুন।
+
+### পরিকল্পনা
+
+এই মানচিত্রটি আপনার ডেটা সম্পর্কে পরিষ্কার ধারণা থাকলে খুবই সহায়ক, কারণ আপনি এর পথ ধরে একটি সিদ্ধান্তে পৌঁছাতে পারেন:
+
+- আমাদের কাছে >৫০ নমুনা রয়েছে
+- আমরা একটি বিভাগ পূর্বাভাস দিতে চাই
+- আমাদের লেবেলযুক্ত ডেটা রয়েছে
+- আমাদের কাছে ১০০K-এর কম নমুনা রয়েছে
+- ✨ আমরা একটি Linear SVC বেছে নিতে পারি
+- যদি এটি কাজ না করে, যেহেতু আমাদের সংখ্যাসূচক ডেটা রয়েছে
+ - আমরা ✨ KNeighbors Classifier চেষ্টা করতে পারি
+ - যদি এটি কাজ না করে, ✨ SVC এবং ✨ Ensemble Classifiers চেষ্টা করুন
+
+এটি অনুসরণ করার জন্য একটি খুব সহায়ক পথ।
+
+## অনুশীলন - ডেটা ভাগ করুন
+
+এই পথ অনুসরণ করে, আমাদের প্রয়োজনীয় লাইব্রেরি আমদানি করে শুরু করা উচিত।
+
+1. প্রয়োজনীয় লাইব্রেরি আমদানি করুন:
+
+ ```python
+ from sklearn.neighbors import KNeighborsClassifier
+ from sklearn.linear_model import LogisticRegression
+ from sklearn.svm import SVC
+ from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
+ from sklearn.model_selection import train_test_split, cross_val_score
+ from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
+ import numpy as np
+ ```
+
+1. আপনার প্রশিক্ষণ এবং পরীক্ষার ডেটা ভাগ করুন:
+
+ ```python
+ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
+ ```
+
+## লিনিয়ার SVC শ্রেণীবিভাজক
+
+সাপোর্ট-ভেক্টর ক্লাস্টারিং (SVC) হল সাপোর্ট-ভেক্টর মেশিন পরিবারের একটি অংশ, যা মেশিন লার্নিংয়ের কৌশলগুলির অন্তর্গত (নিচে এ সম্পর্কে আরও জানুন)। এই পদ্ধতিতে, আপনি লেবেল ক্লাস্টার করার জন্য একটি 'কর্নেল' নির্বাচন করতে পারেন। 'C' প্যারামিটারটি 'নিয়ন্ত্রণ' নির্দেশ করে, যা প্যারামিটারগুলির প্রভাব নিয়ন্ত্রণ করে। কর্নেল [বিভিন্ন](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC) হতে পারে; এখানে আমরা এটি 'লিনিয়ার' সেট করেছি যাতে আমরা লিনিয়ার SVC ব্যবহার করতে পারি। Probability ডিফল্টভাবে 'false'; এখানে আমরা এটি 'true' সেট করেছি যাতে সম্ভাবনার অনুমান সংগ্রহ করা যায়। আমরা random state '0' সেট করেছি যাতে ডেটা এলোমেলোভাবে সাজানো হয় এবং সম্ভাবনা পাওয়া যায়।
+
+### অনুশীলন - একটি লিনিয়ার SVC প্রয়োগ করুন
+
+একটি শ্রেণীবিভাজকের অ্যারে তৈরি করে শুরু করুন। আমরা পরীক্ষা করার সময় এই অ্যারেতে ক্রমাগত যোগ করব।
+
+1. একটি লিনিয়ার SVC দিয়ে শুরু করুন:
+
+ ```python
+ C = 10
+ # Create different classifiers.
+ classifiers = {
+ 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
+ }
+ ```
+
+2. লিনিয়ার SVC ব্যবহার করে আপনার মডেল প্রশিক্ষণ দিন এবং একটি রিপোর্ট প্রিন্ট করুন:
+
+ ```python
+ n_classifiers = len(classifiers)
+
+ for index, (name, classifier) in enumerate(classifiers.items()):
+ classifier.fit(X_train, np.ravel(y_train))
+
+ y_pred = classifier.predict(X_test)
+ accuracy = accuracy_score(y_test, y_pred)
+ print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
+ print(classification_report(y_test,y_pred))
+ ```
+
+ ফলাফল বেশ ভালো:
+
+ ```output
+ Accuracy (train) for Linear SVC: 78.6%
+ precision recall f1-score support
+
+ chinese 0.71 0.67 0.69 242
+ indian 0.88 0.86 0.87 234
+ japanese 0.79 0.74 0.76 254
+ korean 0.85 0.81 0.83 242
+ thai 0.71 0.86 0.78 227
+
+ accuracy 0.79 1199
+ macro avg 0.79 0.79 0.79 1199
+ weighted avg 0.79 0.79 0.79 1199
+ ```
+
+## K-Neighbors শ্রেণীবিভাজক
+
+K-Neighbors হল "পড়শি" পরিবারের অংশ, যা মেশিন লার্নিংয়ের পদ্ধতি এবং এটি তত্ত্বাবধানে এবং অ-তত্ত্বাবধানে শেখার জন্য ব্যবহার করা যেতে পারে। এই পদ্ধতিতে, একটি পূর্বনির্ধারিত সংখ্যক পয়েন্ট তৈরি করা হয় এবং ডেটা এই পয়েন্টগুলির চারপাশে সংগ্রহ করা হয় যাতে ডেটার জন্য সাধারণ লেবেল পূর্বাভাস দেওয়া যায়।
+
+### অনুশীলন - K-Neighbors শ্রেণীবিভাজক প্রয়োগ করুন
+
+পূর্ববর্তী শ্রেণীবিভাজক ভালো ছিল এবং ডেটার সাথে ভালো কাজ করেছে, তবে হয়তো আমরা আরও ভালো নির্ভুলতা পেতে পারি। একটি K-Neighbors শ্রেণীবিভাজক চেষ্টা করুন।
+
+1. আপনার শ্রেণীবিভাজক অ্যারেতে একটি লাইন যোগ করুন (লিনিয়ার SVC আইটেমের পরে একটি কমা যোগ করুন):
+
+ ```python
+ 'KNN classifier': KNeighborsClassifier(C),
+ ```
+
+ ফলাফল একটু খারাপ:
+
+ ```output
+ Accuracy (train) for KNN classifier: 73.8%
+ precision recall f1-score support
+
+ chinese 0.64 0.67 0.66 242
+ indian 0.86 0.78 0.82 234
+ japanese 0.66 0.83 0.74 254
+ korean 0.94 0.58 0.72 242
+ thai 0.71 0.82 0.76 227
+
+ accuracy 0.74 1199
+ macro avg 0.76 0.74 0.74 1199
+ weighted avg 0.76 0.74 0.74 1199
+ ```
+
+ ✅ [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors) সম্পর্কে জানুন
+
+## সাপোর্ট ভেক্টর শ্রেণীবিভাজক
+
+সাপোর্ট-ভেক্টর শ্রেণীবিভাজক [সাপোর্ট-ভেক্টর মেশিন](https://wikipedia.org/wiki/Support-vector_machine) পরিবারের অংশ, যা শ্রেণীবিভাজন এবং রিগ্রেশন কাজের জন্য ব্যবহৃত হয়। SVMs "প্রশিক্ষণের উদাহরণগুলিকে স্থানগুলিতে পয়েন্টে ম্যাপ করে" যাতে দুটি বিভাগের মধ্যে দূরত্ব সর্বাধিক করা যায়। পরবর্তী ডেটা এই স্থানে ম্যাপ করা হয় যাতে তাদের বিভাগ পূর্বাভাস দেওয়া যায়।
+
+### অনুশীলন - সাপোর্ট ভেক্টর শ্রেণীবিভাজক প্রয়োগ করুন
+
+আরও ভালো নির্ভুলতার জন্য একটি সাপোর্ট ভেক্টর শ্রেণীবিভাজক চেষ্টা করুন।
+
+1. K-Neighbors আইটেমের পরে একটি কমা যোগ করুন এবং তারপর এই লাইনটি যোগ করুন:
+
+ ```python
+ 'SVC': SVC(),
+ ```
+
+ ফলাফল বেশ ভালো!
+
+ ```output
+ Accuracy (train) for SVC: 83.2%
+ precision recall f1-score support
+
+ chinese 0.79 0.74 0.76 242
+ indian 0.88 0.90 0.89 234
+ japanese 0.87 0.81 0.84 254
+ korean 0.91 0.82 0.86 242
+ thai 0.74 0.90 0.81 227
+
+ accuracy 0.83 1199
+ macro avg 0.84 0.83 0.83 1199
+ weighted avg 0.84 0.83 0.83 1199
+ ```
+
+ ✅ [সাপোর্ট-ভেক্টর](https://scikit-learn.org/stable/modules/svm.html#svm) সম্পর্কে জানুন
+
+## Ensemble শ্রেণীবিভাজক
+
+পথের একেবারে শেষ পর্যন্ত অনুসরণ করুন, যদিও পূর্ববর্তী পরীক্ষা বেশ ভালো ছিল। আসুন কিছু 'Ensemble শ্রেণীবিভাজক' চেষ্টা করি, বিশেষ করে Random Forest এবং AdaBoost:
+
+```python
+ 'RFST': RandomForestClassifier(n_estimators=100),
+ 'ADA': AdaBoostClassifier(n_estimators=100)
+```
+
+ফলাফল খুবই ভালো, বিশেষ করে Random Forest-এর জন্য:
+
+```output
+Accuracy (train) for RFST: 84.5%
+ precision recall f1-score support
+
+ chinese 0.80 0.77 0.78 242
+ indian 0.89 0.92 0.90 234
+ japanese 0.86 0.84 0.85 254
+ korean 0.88 0.83 0.85 242
+ thai 0.80 0.87 0.83 227
+
+ accuracy 0.84 1199
+ macro avg 0.85 0.85 0.84 1199
+weighted avg 0.85 0.84 0.84 1199
+
+Accuracy (train) for ADA: 72.4%
+ precision recall f1-score support
+
+ chinese 0.64 0.49 0.56 242
+ indian 0.91 0.83 0.87 234
+ japanese 0.68 0.69 0.69 254
+ korean 0.73 0.79 0.76 242
+ thai 0.67 0.83 0.74 227
+
+ accuracy 0.72 1199
+ macro avg 0.73 0.73 0.72 1199
+weighted avg 0.73 0.72 0.72 1199
+```
+
+✅ [Ensemble শ্রেণীবিভাজক](https://scikit-learn.org/stable/modules/ensemble.html) সম্পর্কে জানুন
+
+এই মেশিন লার্নিং পদ্ধতি "কয়েকটি বেস এস্টিমেটরের পূর্বাভাসকে একত্রিত করে" মডেলের গুণমান উন্নত করে। আমাদের উদাহরণে, আমরা Random Trees এবং AdaBoost ব্যবহার করেছি।
+
+- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), একটি গড় পদ্ধতি, 'ডিসিশন ট্রি' এর একটি 'ফরেস্ট' তৈরি করে যা অতিরিক্ত ফিটিং এড়াতে এলোমেলোতা যুক্ত করে। n_estimators প্যারামিটারটি ট্রির সংখ্যা সেট করে।
+
+- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) একটি ডেটাসেটে একটি শ্রেণীবিভাজক ফিট করে এবং তারপর সেই শ্রেণীবিভাজকের কপি একই ডেটাসেটে ফিট করে। এটি ভুলভাবে শ্রেণীবিভাজিত আইটেমগুলির ওজনের উপর ফোকাস করে এবং পরবর্তী শ্রেণীবিভাজকের ফিট সামঞ্জস্য করে সেগুলি সংশোধন করে।
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+এই পদ্ধতিগুলির প্রতিটির অনেক প্যারামিটার রয়েছে যা আপনি পরিবর্তন করতে পারেন। প্রতিটির ডিফল্ট প্যারামিটারগুলি গবেষণা করুন এবং ভাবুন এই প্যারামিটারগুলি পরিবর্তন করলে মডেলের গুণমানের জন্য কী অর্থ হতে পারে।
+
+## [পাঠ-পরবর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+এই পাঠগুলিতে অনেক জটিল শব্দ রয়েছে, তাই [এই তালিকা](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) পর্যালোচনা করতে এক মিনিট সময় নিন, যেখানে দরকারী পরিভাষা রয়েছে!
+
+## অ্যাসাইনমেন্ট
+
+[প্যারামিটার নিয়ে খেলা](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/4-Classification/3-Classifiers-2/assignment.md b/translations/bn/4-Classification/3-Classifiers-2/assignment.md
new file mode 100644
index 000000000..79496076d
--- /dev/null
+++ b/translations/bn/4-Classification/3-Classifiers-2/assignment.md
@@ -0,0 +1,25 @@
+
+# প্যারামিটার প্লে
+
+## নির্দেশনা
+
+এই ক্লাসিফায়ারগুলোর সাথে কাজ করার সময় অনেক প্যারামিটার ডিফল্টভাবে সেট করা থাকে। VS Code-এর ইন্টেলিসেন্স আপনাকে এগুলো গভীরভাবে বুঝতে সাহায্য করতে পারে। এই পাঠে একটি মেশিন লার্নিং ক্লাসিফিকেশন টেকনিক গ্রহণ করুন এবং বিভিন্ন প্যারামিটার মান পরিবর্তন করে মডেল পুনরায় প্রশিক্ষণ দিন। একটি নোটবুক তৈরি করুন যেখানে ব্যাখ্যা করা হবে কেন কিছু পরিবর্তন মডেলের গুণমান উন্নত করে এবং কেন কিছু পরিবর্তন তা ক্ষতিগ্রস্ত করে। আপনার উত্তরে বিস্তারিত থাকুক।
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ----------------------------- |
+| | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে একটি ক্লাসিফায়ার সম্পূর্ণভাবে তৈরি এবং তার প্যারামিটার পরিবর্তন করা হয়েছে এবং টেক্সটবক্সে পরিবর্তনগুলো ব্যাখ্যা করা হয়েছে | একটি নোটবুক আংশিকভাবে উপস্থাপন করা হয়েছে বা দুর্বলভাবে ব্যাখ্যা করা হয়েছে | একটি নোটবুক ত্রুটিপূর্ণ বা ত্রুটিযুক্ত |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/4-Classification/3-Classifiers-2/notebook.ipynb b/translations/bn/4-Classification/3-Classifiers-2/notebook.ipynb
new file mode 100644
index 000000000..42426d6d7
--- /dev/null
+++ b/translations/bn/4-Classification/3-Classifiers-2/notebook.ipynb
@@ -0,0 +1,165 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# শ্রেণীবিন্যাস মডেল তৈরি করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
+ "0 0 indian 0 0 0 0 0 \n",
+ "1 1 indian 1 0 0 0 0 \n",
+ "2 2 indian 0 0 0 0 0 \n",
+ "3 3 indian 0 0 0 0 0 \n",
+ "4 4 indian 0 0 0 0 0 \n",
+ "\n",
+ " apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
+ "0 0 0 0 ... 0 0 0 \n",
+ "1 0 0 0 ... 0 0 0 \n",
+ "2 0 0 0 ... 0 0 0 \n",
+ "3 0 0 0 ... 0 0 0 \n",
+ "4 0 0 0 ... 0 0 0 \n",
+ "\n",
+ " whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
+ "0 0 0 0 0 0 0 0 \n",
+ "1 0 0 0 0 0 0 0 \n",
+ "2 0 0 0 0 0 0 0 \n",
+ "3 0 0 0 0 0 0 0 \n",
+ "4 0 0 0 0 0 1 0 \n",
+ "\n",
+ "[5 rows x 382 columns]"
+ ],
+ "text/html": "
"
+ },
+ "metadata": {},
+ "execution_count": 11
+ }
+ ],
+ "source": [
+ "cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
+ "cuisines_feature_df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়ী থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "15a83277036572e0773229b5f21c1e12",
+ "translation_date": "2025-08-29T23:47:18+00:00",
+ "source_file": "4-Classification/3-Classifiers-2/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
\ No newline at end of file
diff --git a/translations/bn/4-Classification/3-Classifiers-2/solution/Julia/README.md b/translations/bn/4-Classification/3-Classifiers-2/solution/Julia/README.md
new file mode 100644
index 000000000..e33e97030
--- /dev/null
+++ b/translations/bn/4-Classification/3-Classifiers-2/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb b/translations/bn/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb
new file mode 100644
index 000000000..d001cf179
--- /dev/null
+++ b/translations/bn/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb
@@ -0,0 +1,650 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "colab": {
+ "name": "lesson_12-R.ipynb",
+ "provenance": [],
+ "collapsed_sections": []
+ },
+ "kernelspec": {
+ "name": "ir",
+ "display_name": "R"
+ },
+ "language_info": {
+ "name": "R"
+ },
+ "coopTranslator": {
+ "original_hash": "fab50046ca413a38939d579f8432274f",
+ "translation_date": "2025-08-29T23:48:58+00:00",
+ "source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "jsFutf_ygqSx"
+ },
+ "source": [
+ "# একটি শ্রেণীবিন্যাস মডেল তৈরি করুন: সুস্বাদু এশিয়ান এবং ভারতীয় খাবার\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "HD54bEefgtNO"
+ },
+ "source": [
+ "## রান্নার শ্রেণীবিন্যাস ২\n",
+ "\n",
+ "এই দ্বিতীয় শ্রেণীবিন্যাস পাঠে, আমরা শ্রেণীবদ্ধ তথ্য বিশ্লেষণের `আরও উপায়` অন্বেষণ করব। আমরা একটি শ্রেণীবিন্যাসকারী বেছে নেওয়ার প্রভাব সম্পর্কেও শিখব।\n",
+ "\n",
+ "### [**পাঠের আগে কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
+ "\n",
+ "### **প্রয়োজনীয়তা**\n",
+ "\n",
+ "আমরা ধরে নিচ্ছি যে আপনি আগের পাঠগুলি সম্পন্ন করেছেন, কারণ আমরা পূর্বে শেখা কিছু ধারণা এখানে ব্যবহার করব।\n",
+ "\n",
+ "এই পাঠের জন্য, আমাদের নিম্নলিখিত প্যাকেজগুলোর প্রয়োজন হবে:\n",
+ "\n",
+ "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) হলো [R প্যাকেজগুলোর একটি সংগ্রহ](https://www.tidyverse.org/packages), যা ডেটা সায়েন্সকে দ্রুত, সহজ এবং আরও মজাদার করে তোলে!\n",
+ "\n",
+ "- `tidymodels`: [tidymodels](https://www.tidymodels.org/) ফ্রেমওয়ার্ক হলো মডেলিং এবং মেশিন লার্নিংয়ের জন্য [প্যাকেজগুলোর একটি সংগ্রহ](https://www.tidymodels.org/packages/)।\n",
+ "\n",
+ "- `themis`: [themis প্যাকেজ](https://themis.tidymodels.org/) ভারসাম্যহীন ডেটার সাথে কাজ করার জন্য অতিরিক্ত রেসিপি ধাপ সরবরাহ করে।\n",
+ "\n",
+ "আপনি এগুলো নিম্নলিখিতভাবে ইনস্টল করতে পারেন:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
+ "\n",
+ "অথবা, নিচের স্ক্রিপ্টটি পরীক্ষা করে দেখবে যে এই মডিউলটি সম্পন্ন করার জন্য প্রয়োজনীয় প্যাকেজগুলো আপনার কাছে আছে কিনা এবং যদি না থাকে তবে সেগুলো ইনস্টল করবে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "vZ57IuUxgyQt"
+ },
+ "source": [
+ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
+ "\n",
+ "pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "z22M-pj4g07x"
+ },
+ "source": [
+ "## **1. একটি শ্রেণীবিন্যাস মানচিত্র**\n",
+ "\n",
+ "আমাদের [পূর্ববর্তী পাঠে](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1), আমরা এই প্রশ্নের উত্তর খুঁজতে চেষ্টা করেছি: কীভাবে আমরা একাধিক মডেলের মধ্যে নির্বাচন করব? অনেকাংশে, এটি ডেটার বৈশিষ্ট্য এবং আমরা যে সমস্যাটি সমাধান করতে চাই তার ধরণ (যেমন শ্রেণীবিন্যাস বা রিগ্রেশন) এর উপর নির্ভর করে।\n",
+ "\n",
+ "আগে, আমরা Microsoft's চিট শিট ব্যবহার করে ডেটা শ্রেণীবিন্যাস করার বিভিন্ন বিকল্প সম্পর্কে শিখেছি। Python-এর Machine Learning ফ্রেমওয়ার্ক, Scikit-learn, একটি অনুরূপ কিন্তু আরও বিস্তারিত চিট শিট প্রদান করে যা আপনার শ্রেণীবিন্যাসকারীদের (যা \"এস্টিমেটর\" নামেও পরিচিত) আরও সংকুচিত করতে সাহায্য করতে পারে:\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "u1i3xRIVg7vG"
+ },
+ "source": [
+ "> টিপ: [এই মানচিত্রটি অনলাইনে দেখুন](https://scikit-learn.org/stable/tutorial/machine_learning_map/) এবং পথ ধরে ক্লিক করে ডকুমেন্টেশন পড়ুন। \n",
+ "> \n",
+ "> [Tidymodels রেফারেন্স সাইট](https://www.tidymodels.org/find/parsnip/#models) বিভিন্ন ধরনের মডেলের চমৎকার ডকুমেন্টেশন সরবরাহ করে। \n",
+ "\n",
+ "### **পরিকল্পনা** 🗺️ \n",
+ "\n",
+ "এই মানচিত্রটি আপনার ডেটা সম্পর্কে পরিষ্কার ধারণা থাকলে খুবই সহায়ক, কারণ আপনি এর পথ ধরে একটি সিদ্ধান্তে পৌঁছাতে পারেন: \n",
+ "\n",
+ "- আমাদের কাছে \\>৫০টি নমুনা রয়েছে \n",
+ "\n",
+ "- আমরা একটি শ্রেণী পূর্বানুমান করতে চাই \n",
+ "\n",
+ "- আমাদের কাছে লেবেলযুক্ত ডেটা রয়েছে \n",
+ "\n",
+ "- আমাদের কাছে ১ লক্ষের কম নমুনা রয়েছে \n",
+ "\n",
+ "- ✨ আমরা একটি Linear SVC বেছে নিতে পারি \n",
+ "\n",
+ "- যদি এটি কাজ না করে, যেহেতু আমাদের কাছে সংখ্যাসূচক ডেটা রয়েছে \n",
+ "\n",
+ " - আমরা ✨ KNeighbors Classifier চেষ্টা করতে পারি \n",
+ "\n",
+ " - যদি এটি কাজ না করে, ✨ SVC এবং ✨ Ensemble Classifiers চেষ্টা করুন \n",
+ "\n",
+ "এটি অনুসরণ করার জন্য একটি খুব সহায়ক পথ। এখন, চলুন [tidymodels](https://www.tidymodels.org/) মডেলিং ফ্রেমওয়ার্ক ব্যবহার করে সরাসরি কাজে নেমে পড়ি: এটি R প্যাকেজগুলির একটি সঙ্গতিপূর্ণ এবং নমনীয় সংগ্রহ যা ভালো পরিসংখ্যান চর্চাকে উৎসাহিত করার জন্য তৈরি করা হয়েছে 😊। \n",
+ "\n",
+ "## ২. ডেটা ভাগ করুন এবং অসম ডেটাসেট পরিচালনা করুন। \n",
+ "\n",
+ "আমাদের আগের পাঠ থেকে আমরা শিখেছি যে আমাদের রান্নার ধরনগুলির মধ্যে কিছু সাধারণ উপাদান ছিল। এছাড়াও, রান্নার ধরনগুলির সংখ্যায় বেশ অসম বণ্টন ছিল। \n",
+ "\n",
+ "আমরা এগুলো মোকাবিলা করব \n",
+ "\n",
+ "- `dplyr::select()` ব্যবহার করে এমন সবচেয়ে সাধারণ উপাদান বাদ দিয়ে, যা ভিন্ন রান্নার ধরনগুলির মধ্যে বিভ্রান্তি সৃষ্টি করে। \n",
+ "\n",
+ "- একটি `recipe` ব্যবহার করে, যা ডেটাকে প্রি-প্রসেস করে মডেলিংয়ের জন্য প্রস্তুত করে এবং একটি `over-sampling` অ্যালগরিদম প্রয়োগ করে। \n",
+ "\n",
+ "আমরা আগের পাঠে উপরোক্ত বিষয়গুলি ইতিমধ্যেই দেখেছি, তাই এটি সহজ হবে 🥳! \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "6tj_rN00hClA"
+ },
+ "source": [
+ "# Load the core Tidyverse and Tidymodels packages\n",
+ "library(tidyverse)\n",
+ "library(tidymodels)\n",
+ "\n",
+ "# Load the original cuisines data\n",
+ "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n",
+ "\n",
+ "# Drop id column, rice, garlic and ginger from our original data set\n",
+ "df_select <- df %>% \n",
+ " select(-c(1, rice, garlic, ginger)) %>%\n",
+ " # Encode cuisine column as categorical\n",
+ " mutate(cuisine = factor(cuisine))\n",
+ "\n",
+ "\n",
+ "# Create data split specification\n",
+ "set.seed(2056)\n",
+ "cuisines_split <- initial_split(data = df_select,\n",
+ " strata = cuisine,\n",
+ " prop = 0.7)\n",
+ "\n",
+ "# Extract the data in each split\n",
+ "cuisines_train <- training(cuisines_split)\n",
+ "cuisines_test <- testing(cuisines_split)\n",
+ "\n",
+ "# Display distribution of cuisines in the training set\n",
+ "cuisines_train %>% \n",
+ " count(cuisine) %>% \n",
+ " arrange(desc(n))"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "zFin5yw3hHb1"
+ },
+ "source": [
+ "### অসমতল ডেটা নিয়ে কাজ করা\n",
+ "\n",
+ "অসমতল ডেটা প্রায়ই মডেলের কার্যকারিতার উপর নেতিবাচক প্রভাব ফেলে। অনেক মডেল তখনই সেরা পারফর্ম করে যখন পর্যবেক্ষণের সংখ্যা সমান হয়, এবং তাই অসমতল ডেটার ক্ষেত্রে তারা প্রায়ই সমস্যায় পড়ে।\n",
+ "\n",
+ "অসমতল ডেটা সেটের সাথে কাজ করার দুটি প্রধান উপায় রয়েছে:\n",
+ "\n",
+ "- সংখ্যালঘু শ্রেণিতে পর্যবেক্ষণ যোগ করা: `ওভার-স্যাম্পলিং`, যেমন SMOTE অ্যালগরিদম ব্যবহার করে যা সংখ্যালঘু শ্রেণির নতুন উদাহরণ কৃত্রিমভাবে তৈরি করে এই কেসগুলোর নিকটতম প্রতিবেশীদের ব্যবহার করে।\n",
+ "\n",
+ "- সংখ্যাগরিষ্ঠ শ্রেণি থেকে পর্যবেক্ষণ সরিয়ে ফেলা: `আন্ডার-স্যাম্পলিং`\n",
+ "\n",
+ "আমাদের আগের পাঠে, আমরা দেখিয়েছিলাম কীভাবে একটি `রেসিপি` ব্যবহার করে অসমতল ডেটা সেটের সাথে কাজ করা যায়। একটি রেসিপিকে একটি নকশা হিসেবে ভাবা যেতে পারে যা বর্ণনা করে ডেটা সেটে কী ধাপগুলো প্রয়োগ করা উচিত যাতে এটি ডেটা বিশ্লেষণের জন্য প্রস্তুত হয়। আমাদের ক্ষেত্রে, আমরা আমাদের `ট্রেনিং সেট`-এর জন্য আমাদের রান্নার ধরনগুলোর মধ্যে সমান বণ্টন চাই। চলুন শুরু করা যাক।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "cRzTnHolhLWd"
+ },
+ "source": [
+ "# Load themis package for dealing with imbalanced data\n",
+ "library(themis)\n",
+ "\n",
+ "# Create a recipe for preprocessing training data\n",
+ "cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n",
+ " step_smote(cuisine) \n",
+ "\n",
+ "# Print recipe\n",
+ "cuisines_recipe"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "KxOQ2ORhhO81"
+ },
+ "source": [
+ "এখন আমরা মডেল প্রশিক্ষণের জন্য প্রস্তুত 👩💻👨💻!\n",
+ "\n",
+ "## ৩. বহুগুণিত রিগ্রেশন মডেলের বাইরে\n",
+ "\n",
+ "আমাদের আগের পাঠে, আমরা বহুগুণিত রিগ্রেশন মডেল নিয়ে আলোচনা করেছি। চলুন আরও কিছু নমনীয় শ্রেণীবিন্যাস মডেল অন্বেষণ করি।\n",
+ "\n",
+ "### সাপোর্ট ভেক্টর মেশিনস\n",
+ "\n",
+ "শ্রেণীবিন্যাসের ক্ষেত্রে, `সাপোর্ট ভেক্টর মেশিনস` একটি মেশিন লার্নিং পদ্ধতি যা শ্রেণীগুলিকে \"সেরা\"ভাবে আলাদা করার জন্য একটি *হাইপারপ্লেন* খুঁজে বের করার চেষ্টা করে। চলুন একটি সহজ উদাহরণ দেখি:\n",
+ "\n",
+ "
\n",
+ " \n",
+ " https://commons.wikimedia.org/w/index.php?curid=22877598\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "C4Wsd0vZhXYu"
+ },
+ "source": [
+ "H1~ ক্লাসগুলোকে আলাদা করে না। H2~ আলাদা করে, তবে খুব ছোট মার্জিন দিয়ে। H3~ সর্বাধিক মার্জিন দিয়ে ক্লাসগুলোকে আলাদা করে।\n",
+ "\n",
+ "#### লিনিয়ার সাপোর্ট ভেক্টর ক্লাসিফায়ার\n",
+ "\n",
+ "সাপোর্ট-ভেক্টর ক্লাস্টারিং (SVC) হলো সাপোর্ট-ভেক্টর মেশিনস পরিবারের একটি শাখা, যা মেশিন লার্নিং প্রযুক্তির অন্তর্ভুক্ত। SVC-তে হাইপারপ্লেন এমনভাবে নির্বাচন করা হয় যাতে `বেশিরভাগ` ট্রেনিং অবজারভেশন সঠিকভাবে আলাদা করা যায়, তবে কিছু অবজারভেশন `ভুলভাবে শ্রেণীবদ্ধ` হতে পারে। কিছু পয়েন্টকে ভুল দিকে থাকার অনুমতি দিয়ে, SVM আউটলায়ারগুলোর প্রতি আরও সহনশীল হয় এবং নতুন ডেটার ক্ষেত্রে আরও ভালো জেনারালাইজেশন প্রদান করে। এই ভায়োলেশন নিয়ন্ত্রণ করার প্যারামিটারকে `কস্ট` বলা হয়, যার ডিফল্ট মান ১ (দেখুন `help(\"svm_poly\")`)।\n",
+ "\n",
+ "চলুন একটি লিনিয়ার SVC তৈরি করি, যেখানে পলিনোমিয়াল SVM মডেলে `degree = 1` সেট করা হয়েছে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "vJpp6nuChlBz"
+ },
+ "source": [
+ "# Make a linear SVC specification\n",
+ "svc_linear_spec <- svm_poly(degree = 1) %>% \n",
+ " set_engine(\"kernlab\") %>% \n",
+ " set_mode(\"classification\")\n",
+ "\n",
+ "# Bundle specification and recipe into a worklow\n",
+ "svc_linear_wf <- workflow() %>% \n",
+ " add_recipe(cuisines_recipe) %>% \n",
+ " add_model(svc_linear_spec)\n",
+ "\n",
+ "# Print out workflow\n",
+ "svc_linear_wf"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "rDs8cWNkhoqu"
+ },
+ "source": [
+ "এখন যেহেতু আমরা প্রিপ্রসেসিং ধাপ এবং মডেল স্পেসিফিকেশনকে একটি *workflow*-এ সংযুক্ত করেছি, আমরা লিনিয়ার SVC প্রশিক্ষণ দিতে এবং এর ফলাফল মূল্যায়ন করতে এগিয়ে যেতে পারি। পারফরম্যান্স মেট্রিকের জন্য, চলুন একটি মেট্রিক সেট তৈরি করি যা মূল্যায়ন করবে: `accuracy`, `sensitivity`, `Positive Predicted Value` এবং `F Measure`।\n",
+ "\n",
+ "> `augment()` প্রদত্ত ডেটাতে পূর্বাভাসের জন্য কলাম(গুলো) যোগ করবে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "81wiqcwuhrnq"
+ },
+ "source": [
+ "# Train a linear SVC model\n",
+ "svc_linear_fit <- svc_linear_wf %>% \n",
+ " fit(data = cuisines_train)\n",
+ "\n",
+ "# Create a metric set\n",
+ "eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
+ "\n",
+ "\n",
+ "# Make predictions and Evaluate model performance\n",
+ "svc_linear_fit %>% \n",
+ " augment(new_data = cuisines_test) %>% \n",
+ " eval_metrics(truth = cuisine, estimate = .pred_class)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "0UFQvHf-huo3"
+ },
+ "source": [
+ "#### সাপোর্ট ভেক্টর মেশিন\n",
+ "\n",
+ "সাপোর্ট ভেক্টর মেশিন (SVM) হল সাপোর্ট ভেক্টর ক্লাসিফায়ারের একটি সম্প্রসারণ, যা শ্রেণিগুলোর মধ্যে একটি অ-রৈখিক সীমানা সামঞ্জস্য করার জন্য তৈরি করা হয়েছে। মূলত, SVMs *কর্নেল ট্রিক* ব্যবহার করে বৈশিষ্ট্য স্থানকে বড় করে তোলে, যাতে শ্রেণিগুলোর মধ্যে অ-রৈখিক সম্পর্কের সাথে মানিয়ে নেওয়া যায়। SVMs দ্বারা ব্যবহৃত একটি জনপ্রিয় এবং অত্যন্ত নমনীয় কর্নেল ফাংশন হল *রেডিয়াল বেসিস ফাংশন।* চলুন দেখি এটি আমাদের ডেটার উপর কীভাবে কাজ করে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "-KX4S8mzhzmp"
+ },
+ "source": [
+ "set.seed(2056)\n",
+ "\n",
+ "# Make an RBF SVM specification\n",
+ "svm_rbf_spec <- svm_rbf() %>% \n",
+ " set_engine(\"kernlab\") %>% \n",
+ " set_mode(\"classification\")\n",
+ "\n",
+ "# Bundle specification and recipe into a worklow\n",
+ "svm_rbf_wf <- workflow() %>% \n",
+ " add_recipe(cuisines_recipe) %>% \n",
+ " add_model(svm_rbf_spec)\n",
+ "\n",
+ "\n",
+ "# Train an RBF model\n",
+ "svm_rbf_fit <- svm_rbf_wf %>% \n",
+ " fit(data = cuisines_train)\n",
+ "\n",
+ "\n",
+ "# Make predictions and Evaluate model performance\n",
+ "svm_rbf_fit %>% \n",
+ " augment(new_data = cuisines_test) %>% \n",
+ " eval_metrics(truth = cuisine, estimate = .pred_class)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "QBFSa7WSh4HQ"
+ },
+ "source": [
+ "অনেক ভালো 🤩!\n",
+ "\n",
+ "> ✅ দয়া করে দেখুন:\n",
+ ">\n",
+ "> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), Hands-on Machine Learning with R\n",
+ ">\n",
+ "> - [*Support Vector Machines*](https://www.statlearning.com/), An Introduction to Statistical Learning with Applications in R\n",
+ ">\n",
+ "> আরও পড়ার জন্য।\n",
+ "\n",
+ "### নিকটতম প্রতিবেশী শ্রেণিবিন্যাসকারী\n",
+ "\n",
+ "*K*-নিকটতম প্রতিবেশী (KNN) একটি অ্যালগরিদম যেখানে প্রতিটি পর্যবেক্ষণকে অন্যান্য পর্যবেক্ষণের সাথে তার *সাদৃশ্য* এর উপর ভিত্তি করে পূর্বানুমান করা হয়।\n",
+ "\n",
+ "চলুন আমাদের ডেটার উপর এটি প্রয়োগ করি।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "k4BxxBcdh9Ka"
+ },
+ "source": [
+ "# Make a KNN specification\n",
+ "knn_spec <- nearest_neighbor() %>% \n",
+ " set_engine(\"kknn\") %>% \n",
+ " set_mode(\"classification\")\n",
+ "\n",
+ "# Bundle recipe and model specification into a workflow\n",
+ "knn_wf <- workflow() %>% \n",
+ " add_recipe(cuisines_recipe) %>% \n",
+ " add_model(knn_spec)\n",
+ "\n",
+ "# Train a boosted tree model\n",
+ "knn_wf_fit <- knn_wf %>% \n",
+ " fit(data = cuisines_train)\n",
+ "\n",
+ "\n",
+ "# Make predictions and Evaluate model performance\n",
+ "knn_wf_fit %>% \n",
+ " augment(new_data = cuisines_test) %>% \n",
+ " eval_metrics(truth = cuisine, estimate = .pred_class)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "HaegQseriAcj"
+ },
+ "source": [
+ "মডেলটি মনে হচ্ছে খুব ভালো কাজ করছে না। সম্ভবত মডেলের আর্গুমেন্ট পরিবর্তন করা (দেখুন `help(\"nearest_neighbor\")`) মডেলের কার্যকারিতা উন্নত করবে। অবশ্যই এটি চেষ্টা করে দেখুন।\n",
+ "\n",
+ "> ✅ দয়া করে দেখুন:\n",
+ ">\n",
+ "> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
+ ">\n",
+ "> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
+ ">\n",
+ "> আরও জানতে *K*-Nearest Neighbors ক্লাসিফায়ার সম্পর্কে।\n",
+ "\n",
+ "### এনসেম্বল ক্লাসিফায়ার\n",
+ "\n",
+ "এনসেম্বল অ্যালগরিদমগুলি একাধিক বেস এস্টিমেটরকে একত্রিত করে একটি অপ্টিমাল মডেল তৈরি করে, যা করা হয় নিম্নলিখিত পদ্ধতিতে:\n",
+ "\n",
+ "`bagging`: বেস মডেলগুলির একটি সংগ্রহে একটি *গড় ফাংশন* প্রয়োগ করা\n",
+ "\n",
+ "`boosting`: একের পর এক মডেল তৈরি করা যা একে অপরের উপর ভিত্তি করে ভবিষ্যদ্বাণী করার কার্যকারিতা উন্নত করে।\n",
+ "\n",
+ "চলুন শুরু করি একটি র্যান্ডম ফরেস্ট মডেল দিয়ে চেষ্টা করে, যা একটি বড় সংখ্যক ডিসিশন ট্রি তৈরি করে এবং তারপর একটি গড় ফাংশন প্রয়োগ করে একটি উন্নত সামগ্রিক মডেল তৈরি করে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "49DPoVs6iK1M"
+ },
+ "source": [
+ "# Make a random forest specification\n",
+ "rf_spec <- rand_forest() %>% \n",
+ " set_engine(\"ranger\") %>% \n",
+ " set_mode(\"classification\")\n",
+ "\n",
+ "# Bundle recipe and model specification into a workflow\n",
+ "rf_wf <- workflow() %>% \n",
+ " add_recipe(cuisines_recipe) %>% \n",
+ " add_model(rf_spec)\n",
+ "\n",
+ "# Train a random forest model\n",
+ "rf_wf_fit <- rf_wf %>% \n",
+ " fit(data = cuisines_train)\n",
+ "\n",
+ "\n",
+ "# Make predictions and Evaluate model performance\n",
+ "rf_wf_fit %>% \n",
+ " augment(new_data = cuisines_test) %>% \n",
+ " eval_metrics(truth = cuisine, estimate = .pred_class)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "RGVYwC_aiUWc"
+ },
+ "source": [
+ "ভালো কাজ 👏!\n",
+ "\n",
+ "চলুন একটি Boosted Tree মডেলের সাথেও পরীক্ষা-নিরীক্ষা করি।\n",
+ "\n",
+ "Boosted Tree একটি ensemble পদ্ধতি নির্ধারণ করে যা একটি ধারাবাহিক সিদ্ধান্ত গাছের সিরিজ তৈরি করে, যেখানে প্রতিটি গাছ পূর্ববর্তী গাছের ফলাফলের উপর নির্ভর করে এবং ধাপে ধাপে ত্রুটি কমানোর চেষ্টা করে। এটি ভুলভাবে শ্রেণীবদ্ধ আইটেমগুলোর ওজনের উপর মনোযোগ দেয় এবং পরবর্তী শ্রেণীবিন্যাসকারীর জন্য ফিট সামঞ্জস্য করে সেগুলো সংশোধন করে।\n",
+ "\n",
+ "এই মডেলটি ফিট করার বিভিন্ন উপায় রয়েছে (দেখুন `help(\"boost_tree\")`)। এই উদাহরণে, আমরা `xgboost` ইঞ্জিনের মাধ্যমে Boosted trees ফিট করব।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Py1YWo-micWs"
+ },
+ "source": [
+ "# Make a boosted tree specification\n",
+ "boost_spec <- boost_tree(trees = 200) %>% \n",
+ " set_engine(\"xgboost\") %>% \n",
+ " set_mode(\"classification\")\n",
+ "\n",
+ "# Bundle recipe and model specification into a workflow\n",
+ "boost_wf <- workflow() %>% \n",
+ " add_recipe(cuisines_recipe) %>% \n",
+ " add_model(boost_spec)\n",
+ "\n",
+ "# Train a boosted tree model\n",
+ "boost_wf_fit <- boost_wf %>% \n",
+ " fit(data = cuisines_train)\n",
+ "\n",
+ "\n",
+ "# Make predictions and Evaluate model performance\n",
+ "boost_wf_fit %>% \n",
+ " augment(new_data = cuisines_test) %>% \n",
+ " eval_metrics(truth = cuisine, estimate = .pred_class)"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "zNQnbuejigZM"
+ },
+ "source": [
+ "> ✅ দয়া করে দেখুন:\n",
+ ">\n",
+ "> - [Machine Learning for Social Scientists](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
+ ">\n",
+ "> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
+ ">\n",
+ "> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
+ ">\n",
+ "> - - AdaBoost মডেল নিয়ে আলোচনা করে, যা xgboost-এর একটি ভালো বিকল্প।\n",
+ ">\n",
+ "> Ensemble classifiers সম্পর্কে আরও জানতে।\n",
+ "\n",
+ "## ৪. অতিরিক্ত - একাধিক মডেলের তুলনা\n",
+ "\n",
+ "আমরা এই ল্যাবে বেশ কয়েকটি মডেল ফিট করেছি 🙌। বিভিন্ন সেটের প্রিপ্রসেসর এবং/অথবা মডেল স্পেসিফিকেশন থেকে অনেকগুলো ওয়ার্কফ্লো তৈরি করা এবং তারপর একে একে পারফরম্যান্স মেট্রিক গণনা করা বেশ ক্লান্তিকর বা সময়সাপেক্ষ হতে পারে।\n",
+ "\n",
+ "চলুন দেখি আমরা এটি কীভাবে সমাধান করতে পারি একটি ফাংশন তৈরি করে, যা ট্রেনিং সেটে একটি ওয়ার্কফ্লো তালিকা ফিট করে এবং তারপর টেস্ট সেটের উপর ভিত্তি করে পারফরম্যান্স মেট্রিক প্রদান করে। আমরা [purrr](https://purrr.tidyverse.org/) প্যাকেজ থেকে `map()` এবং `map_dfr()` ব্যবহার করব, যা তালিকার প্রতিটি উপাদানে ফাংশন প্রয়োগ করতে সাহায্য করে।\n",
+ "\n",
+ "> [`map()`](https://purrr.tidyverse.org/reference/map.html) ফাংশন আপনাকে অনেকগুলো for লুপের পরিবর্তে এমন কোড ব্যবহার করতে দেয়, যা সংক্ষিপ্ত এবং পড়তে সহজ। [`map()`](https://purrr.tidyverse.org/reference/map.html) ফাংশন সম্পর্কে শেখার সেরা জায়গা হলো R for data science-এর [iteration chapter](http://r4ds.had.co.nz/iteration.html)।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Qzb7LyZnimd2"
+ },
+ "source": [
+ "set.seed(2056)\n",
+ "\n",
+ "# Create a metric set\n",
+ "eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
+ "\n",
+ "# Define a function that returns performance metrics\n",
+ "compare_models <- function(workflow_list, train_set, test_set){\n",
+ " \n",
+ " suppressWarnings(\n",
+ " # Fit each model to the train_set\n",
+ " map(workflow_list, fit, data = train_set) %>% \n",
+ " # Make predictions on the test set\n",
+ " map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n",
+ " # Select desired columns\n",
+ " select(model, cuisine, .pred_class) %>% \n",
+ " # Evaluate model performance\n",
+ " group_by(model) %>% \n",
+ " eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n",
+ " ungroup()\n",
+ " )\n",
+ " \n",
+ "} # End of function"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Fwa712sNisDA"
+ },
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "3i4VJOi2iu-a"
+ },
+ "source": [
+ "# Make a list of workflows\n",
+ "workflow_list <- list(\n",
+ " \"svc\" = svc_linear_wf,\n",
+ " \"svm\" = svm_rbf_wf,\n",
+ " \"knn\" = knn_wf,\n",
+ " \"random_forest\" = rf_wf,\n",
+ " \"xgboost\" = boost_wf)\n",
+ "\n",
+ "# Call the function\n",
+ "set.seed(2056)\n",
+ "perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n",
+ "\n",
+ "# Print out performance metrics\n",
+ "perf_metrics %>% \n",
+ " group_by(.metric) %>% \n",
+ " arrange(desc(.estimate)) %>% \n",
+ " slice_head(n=7)\n",
+ "\n",
+ "# Compare accuracy\n",
+ "perf_metrics %>% \n",
+ " filter(.metric == \"accuracy\") %>% \n",
+ " arrange(desc(.estimate))\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "KuWK_lEli4nW"
+ },
+ "source": [
+ "[**workflowset**](https://workflowsets.tidymodels.org/) প্যাকেজটি ব্যবহারকারীদের অনেকগুলো মডেল তৈরি এবং সহজে ফিট করার সুযোগ দেয়, তবে এটি মূলত পুনরাবৃত্তি নমুনা গ্রহণের (resampling techniques) সাথে কাজ করার জন্য ডিজাইন করা হয়েছে, যেমন `cross-validation`, যা আমরা এখনো বিস্তারিত আলোচনা করিনি।\n",
+ "\n",
+ "## **🚀চ্যালেঞ্জ**\n",
+ "\n",
+ "প্রতিটি পদ্ধতির অনেকগুলো প্যারামিটার থাকে যা আপনি পরিবর্তন করতে পারেন, যেমন SVM-এ `cost`, KNN-এ `neighbors`, এবং র্যান্ডম ফরেস্টে `mtry` (Randomly Selected Predictors)।\n",
+ "\n",
+ "প্রতিটি মডেলের ডিফল্ট প্যারামিটারগুলো নিয়ে গবেষণা করুন এবং ভাবুন, এই প্যারামিটারগুলো পরিবর্তন করলে মডেলের গুণগত মানের উপর কী প্রভাব পড়তে পারে।\n",
+ "\n",
+ "কোনো নির্দিষ্ট মডেল এবং তার প্যারামিটার সম্পর্কে আরও জানতে ব্যবহার করুন: `help(\"model\")`, যেমন `help(\"rand_forest\")`\n",
+ "\n",
+ "> বাস্তবে, আমরা সাধারণত এই প্যারামিটারগুলোর *সেরা মান* *অনুমান* করি, যা অনেকগুলো মডেল একটি `সিমুলেটেড ডেটা সেট`-এ প্রশিক্ষণ দিয়ে এবং সেগুলোর কার্যকারিতা পরিমাপ করে করা হয়। এই প্রক্রিয়াটি **টিউনিং** নামে পরিচিত।\n",
+ "\n",
+ "### [**পোস্ট-লেকচার কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
+ "\n",
+ "### **পুনরালোচনা ও স্ব-অধ্যয়ন**\n",
+ "\n",
+ "এই পাঠগুলোতে অনেক নতুন শব্দ রয়েছে, তাই [এই তালিকা](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) থেকে প্রয়োজনীয় পরিভাষাগুলো একবার দেখে নিন!\n",
+ "\n",
+ "#### কৃতজ্ঞতা:\n",
+ "\n",
+ "[`অ্যালিসন হর্স্ট`](https://twitter.com/allison_horst/) কে ধন্যবাদ, যিনি চমৎকার ইলাস্ট্রেশন তৈরি করেছেন যা R-কে আরও আকর্ষণীয় এবং সহজবোধ্য করে তুলেছে। তার আরও ইলাস্ট্রেশন দেখতে পারেন এই [গ্যালারিতে](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM)।\n",
+ "\n",
+ "[Cassie Breviu](https://www.twitter.com/cassieview) এবং [Jen Looper](https://www.twitter.com/jenlooper) কে ধন্যবাদ, যারা এই মডিউলের মূল পাইথন সংস্করণ তৈরি করেছেন ♥️\n",
+ "\n",
+ "শুভ শিক্ষণ,\n",
+ "\n",
+ "[Eric](https://twitter.com/ericntay), গোল্ড মাইক্রোসফট লার্ন স্টুডেন্ট অ্যাম্বাসেডর।\n",
+ "\n",
+ "
\n",
+ " \n",
+ " ইলাস্ট্রেশন: @allison_horst\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/4-Classification/3-Classifiers-2/solution/notebook.ipynb b/translations/bn/4-Classification/3-Classifiers-2/solution/notebook.ipynb
new file mode 100644
index 000000000..0bc949d45
--- /dev/null
+++ b/translations/bn/4-Classification/3-Classifiers-2/solution/notebook.ipynb
@@ -0,0 +1,304 @@
+{
+ "cells": [
+ {
+ "source": [
+ "# আরও শ্রেণীবিন্যাস মডেল তৈরি করুন\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
+ "0 0 indian 0 0 0 0 0 \n",
+ "1 1 indian 1 0 0 0 0 \n",
+ "2 2 indian 0 0 0 0 0 \n",
+ "3 3 indian 0 0 0 0 0 \n",
+ "4 4 indian 0 0 0 0 0 \n",
+ "\n",
+ " apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
+ "0 0 0 0 ... 0 0 0 \n",
+ "1 0 0 0 ... 0 0 0 \n",
+ "2 0 0 0 ... 0 0 0 \n",
+ "3 0 0 0 ... 0 0 0 \n",
+ "4 0 0 0 ... 0 0 0 \n",
+ "\n",
+ " whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
+ "0 0 0 0 0 0 0 0 \n",
+ "1 0 0 0 0 0 0 0 \n",
+ "2 0 0 0 0 0 0 0 \n",
+ "3 0 0 0 0 0 0 0 \n",
+ "4 0 0 0 0 0 1 0 \n",
+ "\n",
+ "[5 rows x 382 columns]"
+ ],
+ "text/html": "
"
+ },
+ "metadata": {},
+ "execution_count": 3
+ }
+ ],
+ "source": [
+ "cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)\n",
+ "cuisines_feature_df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# বিভিন্ন শ্রেণীবিভাজক চেষ্টা করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.neighbors import KNeighborsClassifier\n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "from sklearn.svm import SVC\n",
+ "from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n",
+ "from sklearn.model_selection import train_test_split, cross_val_score\n",
+ "from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve\n",
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "C = 10\n",
+ "# Create different classifiers.\n",
+ "classifiers = {\n",
+ " 'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0),\n",
+ " 'KNN classifier': KNeighborsClassifier(C),\n",
+ " 'SVC': SVC(),\n",
+ " 'RFST': RandomForestClassifier(n_estimators=100),\n",
+ " 'ADA': AdaBoostClassifier(n_estimators=100)\n",
+ " \n",
+ "}\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Accuracy (train) for Linear SVC: 76.4% \n",
+ " precision recall f1-score support\n",
+ "\n",
+ " chinese 0.64 0.66 0.65 242\n",
+ " indian 0.91 0.86 0.89 236\n",
+ " japanese 0.72 0.73 0.73 245\n",
+ " korean 0.83 0.75 0.79 234\n",
+ " thai 0.75 0.82 0.78 242\n",
+ "\n",
+ " accuracy 0.76 1199\n",
+ " macro avg 0.77 0.76 0.77 1199\n",
+ "weighted avg 0.77 0.76 0.77 1199\n",
+ "\n",
+ "Accuracy (train) for KNN classifier: 70.7% \n",
+ " precision recall f1-score support\n",
+ "\n",
+ " chinese 0.65 0.63 0.64 242\n",
+ " indian 0.84 0.81 0.82 236\n",
+ " japanese 0.60 0.81 0.69 245\n",
+ " korean 0.89 0.53 0.67 234\n",
+ " thai 0.69 0.75 0.72 242\n",
+ "\n",
+ " accuracy 0.71 1199\n",
+ " macro avg 0.73 0.71 0.71 1199\n",
+ "weighted avg 0.73 0.71 0.71 1199\n",
+ "\n",
+ "Accuracy (train) for SVC: 80.1% \n",
+ " precision recall f1-score support\n",
+ "\n",
+ " chinese 0.71 0.69 0.70 242\n",
+ " indian 0.92 0.92 0.92 236\n",
+ " japanese 0.77 0.78 0.77 245\n",
+ " korean 0.87 0.77 0.82 234\n",
+ " thai 0.75 0.86 0.80 242\n",
+ "\n",
+ " accuracy 0.80 1199\n",
+ " macro avg 0.80 0.80 0.80 1199\n",
+ "weighted avg 0.80 0.80 0.80 1199\n",
+ "\n",
+ "Accuracy (train) for RFST: 82.8% \n",
+ " precision recall f1-score support\n",
+ "\n",
+ " chinese 0.80 0.75 0.77 242\n",
+ " indian 0.90 0.91 0.90 236\n",
+ " japanese 0.82 0.78 0.80 245\n",
+ " korean 0.85 0.82 0.83 234\n",
+ " thai 0.78 0.89 0.83 242\n",
+ "\n",
+ " accuracy 0.83 1199\n",
+ " macro avg 0.83 0.83 0.83 1199\n",
+ "weighted avg 0.83 0.83 0.83 1199\n",
+ "\n",
+ "Accuracy (train) for ADA: 71.1% \n",
+ " precision recall f1-score support\n",
+ "\n",
+ " chinese 0.60 0.57 0.58 242\n",
+ " indian 0.87 0.84 0.86 236\n",
+ " japanese 0.71 0.60 0.65 245\n",
+ " korean 0.68 0.78 0.72 234\n",
+ " thai 0.70 0.78 0.74 242\n",
+ "\n",
+ " accuracy 0.71 1199\n",
+ " macro avg 0.71 0.71 0.71 1199\n",
+ "weighted avg 0.71 0.71 0.71 1199\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "n_classifiers = len(classifiers)\n",
+ "\n",
+ "for index, (name, classifier) in enumerate(classifiers.items()):\n",
+ " classifier.fit(X_train, np.ravel(y_train))\n",
+ "\n",
+ " y_pred = classifier.predict(X_test)\n",
+ " accuracy = accuracy_score(y_test, y_pred)\n",
+ " print(\"Accuracy (train) for %s: %0.1f%% \" % (name, accuracy * 100))\n",
+ " print(classification_report(y_test,y_pred))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "7ea2b714669c823a596d986ba2d5739f",
+ "translation_date": "2025-08-29T23:47:35+00:00",
+ "source_file": "4-Classification/3-Classifiers-2/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
\ No newline at end of file
diff --git a/translations/bn/4-Classification/4-Applied/README.md b/translations/bn/4-Classification/4-Applied/README.md
new file mode 100644
index 000000000..1eb520168
--- /dev/null
+++ b/translations/bn/4-Classification/4-Applied/README.md
@@ -0,0 +1,329 @@
+
+# একটি কুইজিন রিকমেন্ডার ওয়েব অ্যাপ তৈরি করুন
+
+এই পাঠে, আপনি পূর্ববর্তী পাঠে শেখা কিছু কৌশল ব্যবহার করে একটি শ্রেণীবিন্যাস মডেল তৈরি করবেন এবং এই সিরিজে ব্যবহৃত সুস্বাদু কুইজিন ডেটাসেট ব্যবহার করবেন। এছাড়াও, আপনি একটি ছোট ওয়েব অ্যাপ তৈরি করবেন যা সংরক্ষিত মডেল ব্যবহার করবে, Onnx-এর ওয়েব রানটাইম ব্যবহার করে।
+
+মেশিন লার্নিংয়ের অন্যতম কার্যকর ব্যবহার হল রিকমেন্ডেশন সিস্টেম তৈরি করা, এবং আপনি আজ সেই দিকে প্রথম পদক্ষেপ নিতে পারেন!
+
+[](https://youtu.be/17wdM9AHMfg "Applied ML")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিওর জন্য: জেন লুপার শ্রেণীবিন্যাস করা কুইজিন ডেটা ব্যবহার করে একটি ওয়েব অ্যাপ তৈরি করছেন
+
+## [পাঠ-পূর্ব কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/25/)
+
+এই পাঠে আপনি শিখবেন:
+
+- কীভাবে একটি মডেল তৈরি এবং এটি Onnx মডেল হিসেবে সংরক্ষণ করবেন
+- কীভাবে Netron ব্যবহার করে মডেল পরিদর্শন করবেন
+- কীভাবে আপনার মডেল একটি ওয়েব অ্যাপে ইনফারেন্সের জন্য ব্যবহার করবেন
+
+## আপনার মডেল তৈরি করুন
+
+প্রয়োগকৃত মেশিন লার্নিং সিস্টেম তৈরি করা আপনার ব্যবসায়িক সিস্টেমের জন্য এই প্রযুক্তিগুলি ব্যবহার করার একটি গুরুত্বপূর্ণ অংশ। আপনি আপনার ওয়েব অ্যাপ্লিকেশনের মধ্যে মডেল ব্যবহার করতে পারেন (এবং প্রয়োজনে অফলাইন প্রসঙ্গে ব্যবহার করতে পারেন) Onnx ব্যবহার করে।
+
+একটি [পূর্ববর্তী পাঠে](../../3-Web-App/1-Web-App/README.md), আপনি UFO দর্শন সম্পর্কিত একটি রিগ্রেশন মডেল তৈরি করেছিলেন, এটি "পিকল" করেছিলেন এবং একটি Flask অ্যাপে ব্যবহার করেছিলেন। যদিও এই আর্কিটেকচারটি জানা খুবই উপকারী, এটি একটি ফুল-স্ট্যাক পাইথন অ্যাপ, এবং আপনার প্রয়োজনীয়তাগুলি একটি জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন অন্তর্ভুক্ত করতে পারে।
+
+এই পাঠে, আপনি ইনফারেন্সের জন্য একটি বেসিক জাভাস্ক্রিপ্ট-ভিত্তিক সিস্টেম তৈরি করতে পারেন। তবে প্রথমে, আপনাকে একটি মডেল প্রশিক্ষণ দিতে হবে এবং এটি Onnx-এ রূপান্তর করতে হবে।
+
+## অনুশীলন - শ্রেণীবিন্যাস মডেল প্রশিক্ষণ দিন
+
+প্রথমে, আমরা পূর্বে ব্যবহৃত পরিষ্কার করা কুইজিন ডেটাসেট ব্যবহার করে একটি শ্রেণীবিন্যাস মডেল প্রশিক্ষণ দেব।
+
+1. প্রথমে দরকারী লাইব্রেরি ইমপোর্ট করুন:
+
+ ```python
+ !pip install skl2onnx
+ import pandas as pd
+ ```
+
+ আপনাকে '[skl2onnx](https://onnx.ai/sklearn-onnx/)' প্রয়োজন যা আপনার Scikit-learn মডেলকে Onnx ফরম্যাটে রূপান্তর করতে সাহায্য করবে।
+
+1. তারপর, পূর্ববর্তী পাঠের মতো আপনার ডেটা নিয়ে কাজ করুন, একটি CSV ফাইল `read_csv()` ব্যবহার করে পড়ুন:
+
+ ```python
+ data = pd.read_csv('../data/cleaned_cuisines.csv')
+ data.head()
+ ```
+
+1. প্রথম দুটি অপ্রয়োজনীয় কলাম সরিয়ে ফেলুন এবং বাকি ডেটা 'X' হিসেবে সংরক্ষণ করুন:
+
+ ```python
+ X = data.iloc[:,2:]
+ X.head()
+ ```
+
+1. লেবেলগুলো 'y' হিসেবে সংরক্ষণ করুন:
+
+ ```python
+ y = data[['cuisine']]
+ y.head()
+
+ ```
+
+### প্রশিক্ষণ প্রক্রিয়া শুরু করুন
+
+আমরা 'SVC' লাইব্রেরি ব্যবহার করব যা ভালো নির্ভুলতা প্রদান করে।
+
+1. Scikit-learn থেকে প্রাসঙ্গিক লাইব্রেরি ইমপোর্ট করুন:
+
+ ```python
+ from sklearn.model_selection import train_test_split
+ from sklearn.svm import SVC
+ from sklearn.model_selection import cross_val_score
+ from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report
+ ```
+
+1. প্রশিক্ষণ এবং টেস্ট সেট আলাদা করুন:
+
+ ```python
+ X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
+ ```
+
+1. পূর্ববর্তী পাঠের মতো একটি SVC শ্রেণীবিন্যাস মডেল তৈরি করুন:
+
+ ```python
+ model = SVC(kernel='linear', C=10, probability=True,random_state=0)
+ model.fit(X_train,y_train.values.ravel())
+ ```
+
+1. এখন, আপনার মডেল পরীক্ষা করুন, `predict()` কল করে:
+
+ ```python
+ y_pred = model.predict(X_test)
+ ```
+
+1. মডেলের গুণমান পরীক্ষা করতে একটি শ্রেণীবিন্যাস রিপোর্ট প্রিন্ট করুন:
+
+ ```python
+ print(classification_report(y_test,y_pred))
+ ```
+
+ যেমন আমরা আগে দেখেছি, নির্ভুলতা ভালো:
+
+ ```output
+ precision recall f1-score support
+
+ chinese 0.72 0.69 0.70 257
+ indian 0.91 0.87 0.89 243
+ japanese 0.79 0.77 0.78 239
+ korean 0.83 0.79 0.81 236
+ thai 0.72 0.84 0.78 224
+
+ accuracy 0.79 1199
+ macro avg 0.79 0.79 0.79 1199
+ weighted avg 0.79 0.79 0.79 1199
+ ```
+
+### আপনার মডেল Onnx-এ রূপান্তর করুন
+
+সঠিক টেনসর সংখ্যা দিয়ে রূপান্তর নিশ্চিত করুন। এই ডেটাসেটে ৩৮০টি উপাদান তালিকাভুক্ত রয়েছে, তাই আপনাকে `FloatTensorType`-এ সেই সংখ্যা উল্লেখ করতে হবে:
+
+1. ৩৮০ টেনসর সংখ্যা ব্যবহার করে রূপান্তর করুন।
+
+ ```python
+ from skl2onnx import convert_sklearn
+ from skl2onnx.common.data_types import FloatTensorType
+
+ initial_type = [('float_input', FloatTensorType([None, 380]))]
+ options = {id(model): {'nocl': True, 'zipmap': False}}
+ ```
+
+1. একটি onx তৈরি করুন এবং **model.onnx** নামে একটি ফাইল হিসেবে সংরক্ষণ করুন:
+
+ ```python
+ onx = convert_sklearn(model, initial_types=initial_type, options=options)
+ with open("./model.onnx", "wb") as f:
+ f.write(onx.SerializeToString())
+ ```
+
+ > লক্ষ্য করুন, আপনি আপনার রূপান্তর স্ক্রিপ্টে [অপশন](https://onnx.ai/sklearn-onnx/parameterized.html) পাস করতে পারেন। এই ক্ষেত্রে, আমরা 'nocl' কে True এবং 'zipmap' কে False পাস করেছি। যেহেতু এটি একটি শ্রেণীবিন্যাস মডেল, আপনি ZipMap সরানোর অপশন পাবেন যা একটি ডিকশনারির তালিকা তৈরি করে (যা প্রয়োজনীয় নয়)। `nocl` মডেলে শ্রেণী তথ্য অন্তর্ভুক্ত হওয়ার বিষয়টি নির্দেশ করে। `nocl`-কে 'True' সেট করে আপনার মডেলের আকার কমান।
+
+পুরো নোটবুক চালালে এখন একটি Onnx মডেল তৈরি হবে এবং এটি এই ফোল্ডারে সংরক্ষণ হবে।
+
+## আপনার মডেল দেখুন
+
+Onnx মডেলগুলো Visual Studio Code-এ খুব বেশি দৃশ্যমান নয়, তবে একটি খুব ভালো ফ্রি সফটওয়্যার রয়েছে যা অনেক গবেষক মডেল ভিজ্যুয়ালাইজ করতে ব্যবহার করেন। [Netron](https://github.com/lutzroeder/Netron) ডাউনলোড করুন এবং আপনার model.onnx ফাইলটি খুলুন। আপনি আপনার সহজ মডেলটি ভিজ্যুয়ালাইজ করতে পারবেন, যেখানে এর ৩৮০টি ইনপুট এবং শ্রেণীবিন্যাসকারী তালিকাভুক্ত রয়েছে:
+
+
+
+Netron আপনার মডেলগুলো দেখার জন্য একটি সহায়ক টুল।
+
+এখন আপনি এই চমৎকার মডেলটি একটি ওয়েব অ্যাপে ব্যবহার করতে প্রস্তুত। চলুন একটি অ্যাপ তৈরি করি যা আপনার ফ্রিজে থাকা উপাদানগুলোর সংমিশ্রণ থেকে কোন কুইজিন রান্না করা যায় তা নির্ধারণ করতে সাহায্য করবে, আপনার মডেল অনুযায়ী।
+
+## একটি রিকমেন্ডার ওয়েব অ্যাপ্লিকেশন তৈরি করুন
+
+আপনার মডেল সরাসরি একটি ওয়েব অ্যাপে ব্যবহার করা যেতে পারে। এই আর্কিটেকচারটি আপনাকে এটি লোকাল এবং এমনকি প্রয়োজনে অফলাইনে চালানোর সুযোগ দেয়। যেখানে আপনি আপনার `model.onnx` ফাইল সংরক্ষণ করেছেন সেই একই ফোল্ডারে একটি `index.html` ফাইল তৈরি করে শুরু করুন।
+
+1. এই ফাইল _index.html_-এ, নিম্নলিখিত মার্কআপ যোগ করুন:
+
+ ```html
+
+
+
+ Cuisine Matcher
+
+
+ ...
+
+
+ ```
+
+1. এখন, `body` ট্যাগের মধ্যে কাজ করে, কিছু উপাদান দেখানোর জন্য একটি চেকবক্সের তালিকা যোগ করুন:
+
+ ```html
+
Check your refrigerator. What can you create?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+ লক্ষ্য করুন যে প্রতিটি চেকবক্সকে একটি মান দেওয়া হয়েছে। এটি ডেটাসেট অনুযায়ী উপাদানটি যেখানে পাওয়া যায় সেই ইনডেক্সকে প্রতিফলিত করে। উদাহরণস্বরূপ, আপেল এই বর্ণানুক্রমিক তালিকায় পঞ্চম কলামে রয়েছে, তাই এর মান '4', কারণ আমরা 0 থেকে গণনা শুরু করি। একটি নির্দিষ্ট উপাদানের ইনডেক্স জানতে [উপাদান স্প্রেডশিট](../../../../4-Classification/data/ingredient_indexes.csv) পরামর্শ করুন।
+
+ index.html ফাইলে আপনার কাজ চালিয়ে যান এবং একটি স্ক্রিপ্ট ব্লক যোগ করুন যেখানে মডেলটি চূড়ান্ত বন্ধ `` এর পরে কল করা হয়।
+
+1. প্রথমে, [Onnx Runtime](https://www.onnxruntime.ai/) ইমপোর্ট করুন:
+
+ ```html
+
+ ```
+
+ > Onnx Runtime ব্যবহার করা হয় আপনার Onnx মডেলগুলোকে বিভিন্ন হার্ডওয়্যার প্ল্যাটফর্মে চালানোর জন্য, অপ্টিমাইজেশন এবং একটি API সহ।
+
+1. একবার Runtime ইনপ্লেসে থাকলে, আপনি এটি কল করতে পারেন:
+
+ ```html
+
+ ```
+
+এই কোডে, কয়েকটি বিষয় ঘটছে:
+
+1. আপনি ৩৮০ সম্ভাব্য মানের (১ বা ০) একটি অ্যারে তৈরি করেছেন যা ইনফারেন্সের জন্য মডেলে পাঠানোর জন্য সেট করা হবে, নির্ভর করে একটি উপাদান চেকবক্স চেক করা হয়েছে কিনা।
+2. আপনি চেকবক্সের একটি অ্যারে এবং একটি `init` ফাংশন তৈরি করেছেন যা অ্যাপ্লিকেশন শুরু হলে কল করা হয়। যখন একটি চেকবক্স চেক করা হয়, তখন `ingredients` অ্যারে সংশোধিত হয় নির্বাচিত উপাদানটি প্রতিফলিত করতে।
+3. আপনি একটি `testCheckboxes` ফাংশন তৈরি করেছেন যা পরীক্ষা করে যে কোনো চেকবক্স চেক করা হয়েছে কিনা।
+4. আপনি `startInference` ফাংশন ব্যবহার করেন যখন বোতামটি চাপা হয় এবং যদি কোনো চেকবক্স চেক করা হয়, আপনি ইনফারেন্স শুরু করেন।
+5. ইনফারেন্স রুটিন অন্তর্ভুক্ত করে:
+ 1. মডেলটি অ্যাসিঙ্ক্রোনাস লোড সেটআপ করা
+ 2. মডেলে পাঠানোর জন্য একটি টেনসর স্ট্রাকচার তৈরি করা
+ 3. 'ফিডস' তৈরি করা যা আপনি মডেল প্রশিক্ষণ করার সময় তৈরি করা `float_input` ইনপুটকে প্রতিফলিত করে (আপনি Netron ব্যবহার করে সেই নামটি যাচাই করতে পারেন)
+ 4. এই 'ফিডস' মডেলে পাঠানো এবং একটি প্রতিক্রিয়ার জন্য অপেক্ষা করা
+
+## আপনার অ্যাপ্লিকেশন পরীক্ষা করুন
+
+Visual Studio Code-এ একটি টার্মিনাল সেশন খুলুন যেখানে আপনার index.html ফাইলটি রয়েছে। নিশ্চিত করুন যে আপনার [http-server](https://www.npmjs.com/package/http-server) গ্লোবালি ইনস্টল করা আছে এবং প্রম্পটে `http-server` টাইপ করুন। একটি লোকালহোস্ট খুলবে এবং আপনি আপনার ওয়েব অ্যাপ দেখতে পারবেন। বিভিন্ন উপাদানের উপর ভিত্তি করে কোন কুইজিন সুপারিশ করা হচ্ছে তা পরীক্ষা করুন:
+
+
+
+অভিনন্দন, আপনি কয়েকটি ফিল্ড সহ একটি 'রিকমেন্ডেশন' ওয়েব অ্যাপ তৈরি করেছেন। এই সিস্টেমটি তৈরি করতে কিছু সময় নিন!
+
+## 🚀চ্যালেঞ্জ
+
+আপনার ওয়েব অ্যাপটি খুবই সাধারণ, তাই [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv) ডেটা থেকে উপাদান এবং তাদের ইনডেক্স ব্যবহার করে এটি আরও তৈরি করুন। কোন স্বাদ সংমিশ্রণ একটি নির্দিষ্ট জাতীয় খাবার তৈরি করতে কাজ করে?
+
+## [পাঠ-পরবর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/26/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+যদিও এই পাঠটি খাদ্য উপাদানের জন্য একটি রিকমেন্ডেশন সিস্টেম তৈরির উপযোগিতার উপর শুধু স্পর্শ করেছে, মেশিন লার্নিং অ্যাপ্লিকেশনের এই ক্ষেত্রটি উদাহরণে খুব সমৃদ্ধ। এই সিস্টেমগুলো কীভাবে তৈরি হয় সে সম্পর্কে আরও পড়ুন:
+
+- https://www.sciencedirect.com/topics/computer-science/recommendation-engine
+- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/
+- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/
+
+## অ্যাসাইনমেন্ট
+
+[একটি নতুন রিকমেন্ডার তৈরি করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/4-Classification/4-Applied/assignment.md b/translations/bn/4-Classification/4-Applied/assignment.md
new file mode 100644
index 000000000..04ebfdb1b
--- /dev/null
+++ b/translations/bn/4-Classification/4-Applied/assignment.md
@@ -0,0 +1,25 @@
+
+# একটি রিকমেন্ডার তৈরি করুন
+
+## নির্দেশনা
+
+এই পাঠে আপনার অনুশীলনের মাধ্যমে, আপনি এখন জানেন কীভাবে Onnx Runtime এবং একটি রূপান্তরিত Onnx মডেল ব্যবহার করে জাভাস্ক্রিপ্ট-ভিত্তিক ওয়েব অ্যাপ তৈরি করতে হয়। এই পাঠের ডেটা বা অন্য কোথাও থেকে সংগৃহীত ডেটা ব্যবহার করে একটি নতুন রিকমেন্ডার তৈরি করার চেষ্টা করুন (অনুগ্রহ করে ক্রেডিট দিন)। আপনি বিভিন্ন ব্যক্তিত্বের বৈশিষ্ট্যের উপর ভিত্তি করে একটি পোষা প্রাণী রিকমেন্ডার তৈরি করতে পারেন, অথবা একজন ব্যক্তির মেজাজের উপর ভিত্তি করে একটি মিউজিক জেনার রিকমেন্ডার তৈরি করতে পারেন। সৃজনশীল হন!
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ---------------------------------------------------------------------- | ------------------------------------- | --------------------------------- |
+| | একটি ওয়েব অ্যাপ এবং নোটবুক উপস্থাপন করা হয়েছে, উভয়ই ভালোভাবে ডকুমেন্টেড এবং কার্যকর | এর মধ্যে একটি অনুপস্থিত বা ত্রুটিপূর্ণ | উভয়ই হয় অনুপস্থিত বা ত্রুটিপূর্ণ |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/4-Classification/4-Applied/notebook.ipynb b/translations/bn/4-Classification/4-Applied/notebook.ipynb
new file mode 100644
index 000000000..2dc74238b
--- /dev/null
+++ b/translations/bn/4-Classification/4-Applied/notebook.ipynb
@@ -0,0 +1,41 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": 3
+ },
+ "orig_nbformat": 4,
+ "coopTranslator": {
+ "original_hash": "2f3e0d9e9ac5c301558fb8bf733ac0cb",
+ "translation_date": "2025-08-29T23:46:46+00:00",
+ "source_file": "4-Classification/4-Applied/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [
+ "# একটি রান্না সুপারিশকারী তৈরি করুন\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/4-Classification/4-Applied/solution/notebook.ipynb b/translations/bn/4-Classification/4-Applied/solution/notebook.ipynb
new file mode 100644
index 000000000..caf7b6b3d
--- /dev/null
+++ b/translations/bn/4-Classification/4-Applied/solution/notebook.ipynb
@@ -0,0 +1,292 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "coopTranslator": {
+ "original_hash": "49325d6dd12a3628fc64fa7ccb1a80ff",
+ "translation_date": "2025-08-29T23:47:03+00:00",
+ "source_file": "4-Classification/4-Applied/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [
+ "# একটি রান্না সুপারিশকারী তৈরি করুন\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Requirement already satisfied: skl2onnx in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (1.8.0)\n",
+ "Requirement already satisfied: protobuf in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (3.8.0)\n",
+ "Requirement already satisfied: numpy>=1.15 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.19.2)\n",
+ "Requirement already satisfied: onnx>=1.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.9.0)\n",
+ "Requirement already satisfied: six in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from skl2onnx) (1.12.0)\n",
+ "Requirement already satisfied: onnxconverter-common<1.9,>=1.6.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.8.1)\n",
+ "Requirement already satisfied: scikit-learn>=0.19 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (0.24.2)\n",
+ "Requirement already satisfied: scipy>=1.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from skl2onnx) (1.4.1)\n",
+ "Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from protobuf->skl2onnx) (45.1.0)\n",
+ "Requirement already satisfied: typing-extensions>=3.6.2.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from onnx>=1.2.1->skl2onnx) (3.10.0.0)\n",
+ "Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (2.1.0)\n",
+ "Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.19->skl2onnx) (0.16.0)\n",
+ "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
+ "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install skl2onnx"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
+ "0 0 indian 0 0 0 0 0 \n",
+ "1 1 indian 1 0 0 0 0 \n",
+ "2 2 indian 0 0 0 0 0 \n",
+ "3 3 indian 0 0 0 0 0 \n",
+ "4 4 indian 0 0 0 0 0 \n",
+ "\n",
+ " apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
+ "0 0 0 0 ... 0 0 0 \n",
+ "1 0 0 0 ... 0 0 0 \n",
+ "2 0 0 0 ... 0 0 0 \n",
+ "3 0 0 0 ... 0 0 0 \n",
+ "4 0 0 0 ... 0 0 0 \n",
+ "\n",
+ " whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
+ "0 0 0 0 0 0 0 0 \n",
+ "1 0 0 0 0 0 0 0 \n",
+ "2 0 0 0 0 0 0 0 \n",
+ "3 0 0 0 0 0 0 0 \n",
+ "4 0 0 0 0 0 1 0 \n",
+ "\n",
+ "[5 rows x 382 columns]"
+ ],
+ "text/html": "
"
+ },
+ "metadata": {},
+ "execution_count": 62
+ }
+ ],
+ "source": [
+ "y = data[['cuisine']]\n",
+ "y.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.svm import SVC\n",
+ "from sklearn.model_selection import cross_val_score\n",
+ "from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "SVC(C=10, kernel='linear', probability=True, random_state=0)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 65
+ }
+ ],
+ "source": [
+ "model = SVC(kernel='linear', C=10, probability=True,random_state=0)\n",
+ "model.fit(X_train,y_train.values.ravel())\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "y_pred = model.predict(X_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ " precision recall f1-score support\n\n chinese 0.72 0.70 0.71 236\n indian 0.91 0.88 0.89 243\n japanese 0.80 0.75 0.77 240\n korean 0.80 0.81 0.81 230\n thai 0.76 0.85 0.80 250\n\n accuracy 0.80 1199\n macro avg 0.80 0.80 0.80 1199\nweighted avg 0.80 0.80 0.80 1199\n\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(classification_report(y_test,y_pred))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from skl2onnx import convert_sklearn\n",
+ "from skl2onnx.common.data_types import FloatTensorType\n",
+ "\n",
+ "initial_type = [('float_input', FloatTensorType([None, 380]))]\n",
+ "options = {id(model): {'nocl': True, 'zipmap': False}}\n",
+ "onx = convert_sklearn(model, initial_types=initial_type, options=options)\n",
+ "with open(\"./model.onnx\", \"wb\") as f:\n",
+ " f.write(onx.SerializeToString())\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/4-Classification/README.md b/translations/bn/4-Classification/README.md
new file mode 100644
index 000000000..f25c7d5dd
--- /dev/null
+++ b/translations/bn/4-Classification/README.md
@@ -0,0 +1,41 @@
+
+# শ্রেণীবিভাজন শুরু করা
+
+## আঞ্চলিক বিষয়: সুস্বাদু এশীয় এবং ভারতীয় খাবার 🍜
+
+এশিয়া এবং ভারতে খাবারের ঐতিহ্য অত্যন্ত বৈচিত্র্যময় এবং খুবই সুস্বাদু! চলুন আঞ্চলিক খাবারের উপাদান সম্পর্কে বোঝার জন্য ডেটা দেখি।
+
+
+> ছবি লিশেং চ্যাং এর তোলা আনস্প্ল্যাশ এ
+
+## আপনি কী শিখবেন
+
+এই অংশে, আপনি পূর্বে শেখা রিগ্রেশন এর উপর ভিত্তি করে আরও শিখবেন এবং অন্যান্য শ্রেণীবিভাজক সম্পর্কে জানবেন যা ডেটা আরও ভালোভাবে বোঝার জন্য ব্যবহার করা যেতে পারে।
+
+> এমন কিছু সহজ কোডিং টুল রয়েছে যা শ্রেণীবিভাজন মডেলের সাথে কাজ করার বিষয়ে শেখার জন্য সহায়ক হতে পারে। এই কাজের জন্য [Azure ML](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott) চেষ্টা করুন।
+
+## পাঠসমূহ
+
+1. [শ্রেণীবিভাজনের পরিচিতি](1-Introduction/README.md)
+2. [আরও শ্রেণীবিভাজক](2-Classifiers-1/README.md)
+3. [অন্য শ্রেণীবিভাজক](3-Classifiers-2/README.md)
+4. [প্রয়োগকৃত এমএল: একটি ওয়েব অ্যাপ তৈরি করুন](4-Applied/README.md)
+
+## কৃতজ্ঞতা
+
+"শ্রেণীবিভাজন শুরু করা" ♥️ দিয়ে লিখেছেন [ক্যাসি ব্রেভিউ](https://www.twitter.com/cassiebreviu) এবং [জেন লুপার](https://www.twitter.com/jenlooper)
+
+সুস্বাদু খাবারের ডেটাসেট [ক্যাগল](https://www.kaggle.com/hoandan/asian-and-indian-cuisines) থেকে সংগ্রহ করা হয়েছে।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/1-Visualize/README.md b/translations/bn/5-Clustering/1-Visualize/README.md
new file mode 100644
index 000000000..7e441fc03
--- /dev/null
+++ b/translations/bn/5-Clustering/1-Visualize/README.md
@@ -0,0 +1,344 @@
+
+# ক্লাস্টারিং-এর পরিচিতি
+
+ক্লাস্টারিং হলো [অপরিচালিত শিক্ষণ](https://wikipedia.org/wiki/Unsupervised_learning)-এর একটি ধরণ, যেখানে ধরে নেওয়া হয় যে একটি ডেটাসেট লেবেলবিহীন বা এর ইনপুট পূর্বনির্ধারিত আউটপুটের সাথে মেলানো হয়নি। এটি বিভিন্ন অ্যালগরিদম ব্যবহার করে লেবেলবিহীন ডেটা বিশ্লেষণ করে এবং ডেটায় পাওয়া প্যাটার্ন অনুযায়ী গ্রুপিং প্রদান করে।
+
+[](https://youtu.be/ty2advRiWJM "PSquare-এর 'No One Like You'")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিও দেখার জন্য। ক্লাস্টারিং-এর মাধ্যমে মেশিন লার্নিং শিখতে শিখতে কিছু নাইজেরিয়ান ডান্স হল ট্র্যাক উপভোগ করুন - এটি PSquare-এর ২০১৪ সালের একটি জনপ্রিয় গান।
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)
+
+### পরিচিতি
+
+[ক্লাস্টারিং](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) ডেটা এক্সপ্লোরেশনের জন্য অত্যন্ত কার্যকর। দেখা যাক এটি নাইজেরিয়ান শ্রোতারা কীভাবে সঙ্গীত গ্রহণ করেন তার প্রবণতা এবং প্যাটার্ন আবিষ্কার করতে সাহায্য করতে পারে কিনা।
+
+✅ এক মিনিট সময় নিয়ে ক্লাস্টারিং-এর ব্যবহার সম্পর্কে ভাবুন। বাস্তব জীবনে, ক্লাস্টারিং ঘটে যখন আপনার কাছে একটি লন্ড্রির স্তূপ থাকে এবং আপনাকে পরিবারের সদস্যদের কাপড় আলাদা করতে হয় 🧦👕👖🩲। ডেটা সায়েন্সে, ক্লাস্টারিং ঘটে যখন ব্যবহারকারীর পছন্দ বিশ্লেষণ করতে হয় বা কোনো লেবেলবিহীন ডেটাসেটের বৈশিষ্ট্য নির্ধারণ করতে হয়। একভাবে, ক্লাস্টারিং বিশৃঙ্খলার মধ্যে অর্থ খুঁজে পেতে সাহায্য করে, যেমন একটি মোজা রাখার ড্রয়ার।
+
+[](https://youtu.be/esmzYhuFnds "ক্লাস্টারিং-এর পরিচিতি")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিও দেখার জন্য: MIT-এর জন গুটটাগ ক্লাস্টারিং-এর পরিচিতি দিচ্ছেন।
+
+পেশাদার ক্ষেত্রে, ক্লাস্টারিং ব্যবহার করা যেতে পারে যেমন বাজার বিভাজন নির্ধারণ করা, উদাহরণস্বরূপ কোন বয়সের গ্রুপ কী ধরনের পণ্য কিনছে তা নির্ধারণ করা। আরেকটি ব্যবহার হতে পারে অস্বাভাবিকতা সনাক্তকরণ, যেমন ক্রেডিট কার্ড লেনদেনের ডেটাসেট থেকে জালিয়াতি সনাক্ত করা। অথবা আপনি এটি ব্যবহার করতে পারেন মেডিকেল স্ক্যানের একটি ব্যাচ থেকে টিউমার নির্ধারণ করতে।
+
+✅ এক মিনিট সময় নিয়ে ভাবুন, আপনি কীভাবে 'প্রকৃত জীবনে' ক্লাস্টারিং-এর মুখোমুখি হয়েছেন, যেমন ব্যাংকিং, ই-কমার্স, বা ব্যবসায়িক ক্ষেত্রে।
+
+> 🎓 মজার বিষয় হলো, ক্লাস্টার বিশ্লেষণ ১৯৩০-এর দশকে নৃতত্ত্ব এবং মনোবিজ্ঞানের ক্ষেত্রে উদ্ভূত হয়েছিল। কল্পনা করুন এটি কীভাবে ব্যবহার করা হতে পারে?
+
+অন্যভাবে, আপনি এটি অনুসন্ধান ফলাফল গ্রুপ করার জন্য ব্যবহার করতে পারেন - যেমন কেনাকাটার লিঙ্ক, ছবি, বা রিভিউ। ক্লাস্টারিং কার্যকর যখন আপনার কাছে একটি বড় ডেটাসেট থাকে যা আপনি হ্রাস করতে চান এবং যার উপর আরও বিশদ বিশ্লেষণ করতে চান, তাই এই কৌশলটি অন্যান্য মডেল তৈরি করার আগে ডেটা সম্পর্কে জানার জন্য ব্যবহার করা যেতে পারে।
+
+✅ একবার আপনার ডেটা ক্লাস্টারে সংগঠিত হলে, আপনি এটিকে একটি ক্লাস্টার আইডি বরাদ্দ করেন, এবং এই কৌশলটি একটি ডেটাসেটের গোপনীয়তা সংরক্ষণে কার্যকর হতে পারে; আপনি ক্লাস্টারের অন্যান্য উপাদানের পরিবর্তে একটি ডেটা পয়েন্টকে তার ক্লাস্টার আইডি দ্বারা উল্লেখ করতে পারেন। আপনি কি অন্য কোনো কারণ ভাবতে পারেন কেন আপনি ক্লাস্টার আইডি ব্যবহার করবেন ক্লাস্টারের অন্যান্য উপাদানের পরিবর্তে এটি চিহ্নিত করতে?
+
+ক্লাস্টারিং কৌশল সম্পর্কে আপনার বোঝাপড়া বাড়ান এই [শিক্ষণ মডিউল](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)-এ।
+
+## ক্লাস্টারিং শুরু করা
+
+[Scikit-learn একটি বড় পরিসরের](https://scikit-learn.org/stable/modules/clustering.html) পদ্ধতি প্রদান করে ক্লাস্টারিং সম্পাদনের জন্য। আপনি কোনটি বেছে নেবেন তা নির্ভর করবে আপনার ব্যবহারের ক্ষেত্রে। ডকুমেন্টেশন অনুযায়ী, প্রতিটি পদ্ধতির বিভিন্ন সুবিধা রয়েছে। এখানে Scikit-learn দ্বারা সমর্থিত পদ্ধতিগুলির একটি সরলীকৃত টেবিল এবং তাদের উপযুক্ত ব্যবহারের ক্ষেত্র দেওয়া হলো:
+
+| পদ্ধতির নাম | ব্যবহারের ক্ষেত্র |
+| :--------------------------- | :--------------------------------------------------------------------- |
+| K-Means | সাধারণ উদ্দেশ্য, ইনডাকটিভ |
+| Affinity propagation | অনেক, অসম ক্লাস্টার, ইনডাকটিভ |
+| Mean-shift | অনেক, অসম ক্লাস্টার, ইনডাকটিভ |
+| Spectral clustering | কম, সমান ক্লাস্টার, ট্রান্সডাকটিভ |
+| Ward hierarchical clustering | অনেক, সীমাবদ্ধ ক্লাস্টার, ট্রান্সডাকটিভ |
+| Agglomerative clustering | অনেক, সীমাবদ্ধ, অ-ইউক্লিডিয়ান দূরত্ব, ট্রান্সডাকটিভ |
+| DBSCAN | অ-সমতল জ্যামিতি, অসম ক্লাস্টার, ট্রান্সডাকটিভ |
+| OPTICS | অ-সমতল জ্যামিতি, অসম ক্লাস্টার ভেরিয়েবল ঘনত্ব সহ, ট্রান্সডাকটিভ |
+| Gaussian mixtures | সমতল জ্যামিতি, ইনডাকটিভ |
+| BIRCH | বড় ডেটাসেট আউটলাইয়ার সহ, ইনডাকটিভ |
+
+> 🎓 আমরা কীভাবে ক্লাস্টার তৈরি করি তা অনেকাংশে নির্ভর করে কীভাবে আমরা ডেটা পয়েন্টগুলোকে গ্রুপে একত্র করি। চলুন কিছু শব্দভাণ্ডার বিশ্লেষণ করি:
+>
+> 🎓 ['ট্রান্সডাকটিভ' বনাম 'ইনডাকটিভ'](https://wikipedia.org/wiki/Transduction_(machine_learning))
+>
+> ট্রান্সডাকটিভ ইনফারেন্স পর্যবেক্ষণকৃত প্রশিক্ষণ কেস থেকে নির্ধারিত হয় যা নির্দিষ্ট টেস্ট কেসের সাথে মানানসই। ইনডাকটিভ ইনফারেন্স প্রশিক্ষণ কেস থেকে নির্ধারিত হয় যা সাধারণ নিয়মে মানানসই হয় এবং তারপর টেস্ট কেসে প্রয়োগ করা হয়।
+>
+> উদাহরণ: কল্পনা করুন আপনার কাছে একটি ডেটাসেট রয়েছে যা আংশিকভাবে লেবেলযুক্ত। কিছু জিনিস 'রেকর্ড', কিছু 'সিডি', এবং কিছু ফাঁকা। আপনার কাজ হলো ফাঁকা জিনিসগুলোর জন্য লেবেল প্রদান করা। যদি আপনি ইনডাকটিভ পদ্ধতি বেছে নেন, আপনি 'রেকর্ড' এবং 'সিডি' খুঁজে বের করার জন্য একটি মডেল প্রশিক্ষণ দেবেন এবং সেই লেবেলগুলো আপনার লেবেলবিহীন ডেটায় প্রয়োগ করবেন। এই পদ্ধতিটি এমন জিনিস শ্রেণীবদ্ধ করতে সমস্যায় পড়বে যা আসলে 'ক্যাসেট'। অন্যদিকে, একটি ট্রান্সডাকটিভ পদ্ধতি এই অজানা ডেটা আরও কার্যকরভাবে পরিচালনা করে কারণ এটি একই ধরনের আইটেমগুলোকে একত্রিত করার জন্য কাজ করে এবং তারপর একটি গ্রুপে লেবেল প্রয়োগ করে।
+>
+> 🎓 ['অ-সমতল' বনাম 'সমতল' জ্যামিতি](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
+>
+> গণিতের পরিভাষা থেকে উদ্ভূত, অ-সমতল বনাম সমতল জ্যামিতি পয়েন্টগুলোর মধ্যে দূরত্ব পরিমাপের পদ্ধতি বোঝায়, যা হয় 'সমতল' ([ইউক্লিডিয়ান](https://wikipedia.org/wiki/Euclidean_geometry)) বা 'অ-সমতল' (অ-ইউক্লিডিয়ান) জ্যামিতিক পদ্ধতিতে হয়।
+>
+>'সমতল' এই প্রসঙ্গে ইউক্লিডিয়ান জ্যামিতিকে বোঝায় (যার কিছু অংশ 'প্লেন' জ্যামিতি হিসেবে শেখানো হয়), এবং অ-সমতল বোঝায় অ-ইউক্লিডিয়ান জ্যামিতি। মেশিন লার্নিং-এর সাথে জ্যামিতির কী সম্পর্ক? যেহেতু দুটি ক্ষেত্রই গণিতের উপর ভিত্তি করে, পয়েন্টগুলোর মধ্যে দূরত্ব পরিমাপের একটি সাধারণ উপায় থাকতে হবে, এবং এটি ডেটার প্রকৃতির উপর নির্ভর করে 'সমতল' বা 'অ-সমতল' পদ্ধতিতে করা যেতে পারে। [ইউক্লিডিয়ান দূরত্ব](https://wikipedia.org/wiki/Euclidean_distance) পরিমাপ করা হয় দুটি পয়েন্টের মধ্যে একটি রেখা খণ্ডের দৈর্ঘ্য হিসাবে। [অ-ইউক্লিডিয়ান দূরত্ব](https://wikipedia.org/wiki/Non-Euclidean_geometry) একটি বক্ররেখা বরাবর পরিমাপ করা হয়। যদি আপনার ডেটা, ভিজ্যুয়ালাইজড, একটি প্লেনে বিদ্যমান না থাকে, তবে এটি পরিচালনা করার জন্য একটি বিশেষ অ্যালগরিদম ব্যবহার করা প্রয়োজন হতে পারে।
+>
+
+> ইনফোগ্রাফিক: [দাসানি মাদিপল্লি](https://twitter.com/dasani_decoded)
+>
+> 🎓 ['দূরত্ব'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
+>
+> ক্লাস্টারগুলো তাদের দূরত্ব ম্যাট্রিক্স দ্বারা সংজ্ঞায়িত হয়, যেমন পয়েন্টগুলোর মধ্যে দূরত্ব। এই দূরত্ব কয়েকটি উপায়ে পরিমাপ করা যেতে পারে। ইউক্লিডিয়ান ক্লাস্টারগুলো পয়েন্ট মানগুলোর গড় দ্বারা সংজ্ঞায়িত হয়, এবং একটি 'সেন্ট্রয়েড' বা কেন্দ্র বিন্দু থাকে। দূরত্বগুলো সেই সেন্ট্রয়েড থেকে দূরত্ব দ্বারা পরিমাপ করা হয়। অ-ইউক্লিডিয়ান দূরত্ব 'ক্লাস্ট্রয়েড' বোঝায়, যা অন্যান্য পয়েন্টের নিকটতম বিন্দু। ক্লাস্ট্রয়েড বিভিন্ন উপায়ে সংজ্ঞায়িত করা যেতে পারে।
+>
+> 🎓 ['সীমাবদ্ধ'](https://wikipedia.org/wiki/Constrained_clustering)
+>
+> [সীমাবদ্ধ ক্লাস্টারিং](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) এই অপরিচালিত পদ্ধতিতে 'আংশিক-পরিচালিত' শিক্ষণ প্রবর্তন করে। পয়েন্টগুলোর মধ্যে সম্পর্ক 'লিঙ্ক করা যাবে না' বা 'লিঙ্ক করতে হবে' হিসাবে চিহ্নিত করা হয়, তাই ডেটাসেটে কিছু নিয়ম আরোপ করা হয়।
+>
+> উদাহরণ: যদি একটি অ্যালগরিদমকে একটি লেবেলবিহীন বা আংশিক-লেবেলযুক্ত ডেটার ব্যাচে মুক্ত করা হয়, এটি যে ক্লাস্টার তৈরি করে তা নিম্নমানের হতে পারে। উপরের উদাহরণে, ক্লাস্টারগুলো 'গোলাকার সঙ্গীত জিনিস', 'চৌকো সঙ্গীত জিনিস', 'ত্রিভুজাকার জিনিস', এবং 'কুকি' গ্রুপ করতে পারে। যদি কিছু সীমাবদ্ধতা বা অনুসরণ করার নিয়ম দেওয়া হয় ("আইটেমটি অবশ্যই প্লাস্টিকের তৈরি হতে হবে", "আইটেমটি সঙ্গীত তৈরি করতে সক্ষম হতে হবে") এটি অ্যালগরিদমকে আরও ভাল পছন্দ করতে সাহায্য করতে পারে।
+>
+> 🎓 'ঘনত্ব'
+>
+> যে ডেটা 'শব্দযুক্ত' বলে বিবেচিত হয় তাকে 'ঘন' বলা হয়। প্রতিটি ক্লাস্টারের পয়েন্টগুলোর মধ্যে দূরত্ব পরীক্ষা করলে দেখা যায় যে এটি বেশি বা কম ঘন, বা 'ভিড়যুক্ত', এবং তাই এই ডেটা বিশ্লেষণ করার জন্য উপযুক্ত ক্লাস্টারিং পদ্ধতি প্রয়োজন। [এই নিবন্ধটি](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) একটি শব্দযুক্ত ডেটাসেটের উপর K-Means ক্লাস্টারিং বনাম HDBSCAN অ্যালগরিদম ব্যবহার করে পার্থক্য প্রদর্শন করে।
+
+## ক্লাস্টারিং অ্যালগরিদম
+
+ক্লাস্টারিং-এর জন্য ১০০টিরও বেশি অ্যালগরিদম রয়েছে, এবং সেগুলোর ব্যবহার নির্ভর করে ডেটার প্রকৃতির উপর। আসুন প্রধান কয়েকটি নিয়ে আলোচনা করি:
+
+- **হায়ারার্কিকাল ক্লাস্টারিং**। যদি কোনো বস্তু তার নিকটবর্তী বস্তুর সাথে তার দূরত্বের ভিত্তিতে শ্রেণীবদ্ধ হয়, তবে ক্লাস্টারগুলো তাদের সদস্যদের অন্যান্য বস্তুর সাথে দূরত্বের ভিত্তিতে গঠিত হয়। Scikit-learn-এর agglomerative clustering হায়ারার্কিকাল।
+
+ 
+ > ইনফোগ্রাফিক: [দাসানি মাদিপল্লি](https://twitter.com/dasani_decoded)
+
+- **সেন্ট্রয়েড ক্লাস্টারিং**। এই জনপ্রিয় অ্যালগরিদমটি 'k', বা গঠিত ক্লাস্টারের সংখ্যা বেছে নেওয়ার প্রয়োজন হয়, তারপর অ্যালগরিদম একটি ক্লাস্টারের কেন্দ্র বিন্দু নির্ধারণ করে এবং সেই বিন্দুর চারপাশে ডেটা সংগ্রহ করে। [K-means ক্লাস্টারিং](https://wikipedia.org/wiki/K-means_clustering) সেন্ট্রয়েড ক্লাস্টারিং-এর একটি জনপ্রিয় সংস্করণ। কেন্দ্রটি নিকটতম গড় দ্বারা নির্ধারিত হয়, তাই এর নাম। ক্লাস্টারের বর্গ দূরত্ব হ্রাস করা হয়।
+
+ 
+ > ইনফোগ্রাফিক: [দাসানি মাদিপল্লি](https://twitter.com/dasani_decoded)
+
+- **বিতরণ-ভিত্তিক ক্লাস্টারিং**। পরিসংখ্যানগত মডেলিংয়ের উপর ভিত্তি করে, বিতরণ-ভিত্তিক ক্লাস্টারিং একটি ডেটা পয়েন্ট একটি ক্লাস্টারের অন্তর্গত হওয়ার সম্ভাবনা নির্ধারণ করে এবং সেই অনুযায়ী এটি বরাদ্দ করে। Gaussian মিশ্রণ পদ্ধতি এই ধরনের অন্তর্গত।
+
+- **ঘনত্ব-ভিত্তিক ক্লাস্টারিং**। ডেটা পয়েন্টগুলো তাদের ঘনত্বের ভিত্তিতে ক্লাস্টারে বরাদ্দ করা হয়, বা তাদের একে অপরের চারপাশে গঠনের ভিত্তিতে। গ্রুপ থেকে দূরে থাকা ডেটা পয়েন্টগুলোকে আউটলায়ার বা শব্দ হিসাবে বিবেচনা করা হয়। DBSCAN, Mean-shift এবং OPTICS এই ধরনের ক্লাস্টারিং-এর অন্তর্গত।
+
+- **গ্রিড-ভিত্তিক ক্লাস্টারিং**। বহু-মাত্রিক ডেটাসেটের জন্য, একটি গ্রিড তৈরি করা হয় এবং ডেটা গ্রিডের কোষগুলোর মধ্যে বিভক্ত করা হয়, ফলে ক্লাস্টার তৈরি হয়।
+
+## অনুশীলন - আপনার ডেটা ক্লাস্টার করুন
+
+ক্লাস্টারিং একটি কৌশল হিসেবে সঠিক ভিজ্যুয়ালাইজেশনের মাধ্যমে অনেক সাহায্য পায়, তাই আসুন আমাদের সঙ্গীত ডেটা ভিজ্যুয়ালাইজ করে শুরু করি। এই অনুশীলনটি আমাদের সিদ্ধান্ত নিতে সাহায্য করবে যে এই ডেটার প্রকৃতির জন্য কোন ক্লাস্টারিং পদ্ধতি সবচেয়ে কার্যকরভাবে ব্যবহার করা উচিত।
+
+1. এই ফোল্ডারের [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) ফাইলটি খুলুন।
+
+1. ভালো ডেটা ভিজ্যুয়ালাইজেশনের জন্য `Seaborn` প্যাকেজটি ইমপোর্ট করুন।
+
+ ```python
+ !pip install seaborn
+ ```
+
+1. [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv) থেকে গান ডেটা যোগ করুন। গানগুলোর ডেটা নিয়ে একটি ডেটাফ্রেম লোড করুন। লাইব্রেরিগুলো ইমপোর্ট করে এবং ডেটা আউটপুট করে এই ডেটা এক্সপ্লোর করার জন্য প্রস্তুত হন:
+
+ ```python
+ import matplotlib.pyplot as plt
+ import pandas as pd
+
+ df = pd.read_csv("../data/nigerian-songs.csv")
+ df.head()
+ ```
+
+ ডেটার প্রথম কয়েকটি লাইন পরীক্ষা করুন:
+
+ | | নাম | অ্যালবাম | শিল্পী | শিল্পীর শীর্ষ ঘরানা | প্রকাশের তারিখ | দৈর্ঘ্য | জনপ্রিয়তা | নাচের ক্ষমতা | অ্যাকোস্টিকনেস | শক্তি | ইন্সট্রুমেন্টালনেস | লাইভনেস | লাউ
+| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 |
+| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 |
+| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 |
+
+1. ডেটাফ্রেম সম্পর্কে কিছু তথ্য পেতে `info()` কল করুন:
+
+ ```python
+ df.info()
+ ```
+
+ আউটপুট দেখতে এরকম:
+
+ ```output
+
+ RangeIndex: 530 entries, 0 to 529
+ Data columns (total 16 columns):
+ # Column Non-Null Count Dtype
+ --- ------ -------------- -----
+ 0 name 530 non-null object
+ 1 album 530 non-null object
+ 2 artist 530 non-null object
+ 3 artist_top_genre 530 non-null object
+ 4 release_date 530 non-null int64
+ 5 length 530 non-null int64
+ 6 popularity 530 non-null int64
+ 7 danceability 530 non-null float64
+ 8 acousticness 530 non-null float64
+ 9 energy 530 non-null float64
+ 10 instrumentalness 530 non-null float64
+ 11 liveness 530 non-null float64
+ 12 loudness 530 non-null float64
+ 13 speechiness 530 non-null float64
+ 14 tempo 530 non-null float64
+ 15 time_signature 530 non-null int64
+ dtypes: float64(8), int64(4), object(4)
+ memory usage: 66.4+ KB
+ ```
+
+1. নাল মানগুলোর জন্য ডাবল-চেক করুন, `isnull()` কল করে এবং নিশ্চিত করুন যে যোগফল 0:
+
+ ```python
+ df.isnull().sum()
+ ```
+
+ সবকিছু ঠিকঠাক:
+
+ ```output
+ name 0
+ album 0
+ artist 0
+ artist_top_genre 0
+ release_date 0
+ length 0
+ popularity 0
+ danceability 0
+ acousticness 0
+ energy 0
+ instrumentalness 0
+ liveness 0
+ loudness 0
+ speechiness 0
+ tempo 0
+ time_signature 0
+ dtype: int64
+ ```
+
+1. ডেটা বর্ণনা করুন:
+
+ ```python
+ df.describe()
+ ```
+
+ | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
+ | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- |
+ | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 |
+ | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 |
+ | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 |
+ | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 |
+ | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 |
+ | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 |
+ | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 |
+ | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 |
+
+> 🤔 যদি আমরা ক্লাস্টারিং নিয়ে কাজ করি, যা একটি আনসুপারভাইজড পদ্ধতি এবং লেবেলড ডেটার প্রয়োজন হয় না, তাহলে কেন আমরা এই ডেটা লেবেলসহ দেখাচ্ছি? ডেটা এক্সপ্লোরেশনের পর্যায়ে এগুলো কাজে লাগে, কিন্তু ক্লাস্টারিং অ্যালগরিদমের কাজের জন্য এগুলো প্রয়োজনীয় নয়। আপনি চাইলে কলাম হেডারগুলো সরিয়ে দিয়ে কলাম নম্বর দিয়ে ডেটাকে উল্লেখ করতে পারেন।
+
+ডেটার সাধারণ মানগুলো দেখুন। লক্ষ্য করুন যে জনপ্রিয়তা '0' হতে পারে, যা এমন গানগুলো দেখায় যেগুলোর কোনো র্যাংকিং নেই। আসুন এগুলো শীঘ্রই সরিয়ে ফেলি।
+
+1. বারপ্লট ব্যবহার করে সবচেয়ে জনপ্রিয় ঘরানাগুলো খুঁজে বের করুন:
+
+ ```python
+ import seaborn as sns
+
+ top = df['artist_top_genre'].value_counts()
+ plt.figure(figsize=(10,7))
+ sns.barplot(x=top[:5].index,y=top[:5].values)
+ plt.xticks(rotation=45)
+ plt.title('Top genres',color = 'blue')
+ ```
+
+ 
+
+✅ যদি আপনি আরও শীর্ষ মান দেখতে চান, তাহলে `[:5]`-কে বড় মানে পরিবর্তন করুন, অথবা সরিয়ে ফেলুন সব দেখতে।
+
+লক্ষ্য করুন, যখন শীর্ষ ঘরানা 'Missing' হিসেবে বর্ণিত হয়, তখন এর মানে Spotify এটি শ্রেণীবদ্ধ করেনি, তাই আসুন এটি সরিয়ে ফেলি।
+
+1. মিসিং ডেটা সরিয়ে ফেলুন ফিল্টারিং করে
+
+ ```python
+ df = df[df['artist_top_genre'] != 'Missing']
+ top = df['artist_top_genre'].value_counts()
+ plt.figure(figsize=(10,7))
+ sns.barplot(x=top.index,y=top.values)
+ plt.xticks(rotation=45)
+ plt.title('Top genres',color = 'blue')
+ ```
+
+ এখন ঘরানাগুলো পুনরায় পরীক্ষা করুন:
+
+ 
+
+1. স্পষ্টভাবে, শীর্ষ তিনটি ঘরানা এই ডেটাসেটে আধিপত্য বিস্তার করে। আসুন `afro dancehall`, `afropop`, এবং `nigerian pop`-এ মনোযোগ দিই, এবং অতিরিক্তভাবে ডেটাসেট থেকে এমন কিছু সরিয়ে ফেলি যার জনপ্রিয়তা মান 0 (যার মানে এটি ডেটাসেটে জনপ্রিয়তা দিয়ে শ্রেণীবদ্ধ হয়নি এবং আমাদের উদ্দেশ্যে এটি শোরগোল হিসেবে বিবেচিত হতে পারে):
+
+ ```python
+ df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')]
+ df = df[(df['popularity'] > 0)]
+ top = df['artist_top_genre'].value_counts()
+ plt.figure(figsize=(10,7))
+ sns.barplot(x=top.index,y=top.values)
+ plt.xticks(rotation=45)
+ plt.title('Top genres',color = 'blue')
+ ```
+
+1. দ্রুত পরীক্ষা করুন ডেটা কোনো বিশেষভাবে শক্তিশালী উপায়ে সম্পর্কিত কিনা:
+
+ ```python
+ corrmat = df.corr(numeric_only=True)
+ f, ax = plt.subplots(figsize=(12, 9))
+ sns.heatmap(corrmat, vmax=.8, square=True)
+ ```
+
+ 
+
+ একমাত্র শক্তিশালী সম্পর্ক `energy` এবং `loudness`-এর মধ্যে, যা খুবই স্বাভাবিক, কারণ জোরে গান সাধারণত বেশ শক্তিশালী হয়। অন্যথায়, সম্পর্কগুলো তুলনামূলকভাবে দুর্বল। এটি দেখতে আকর্ষণীয় হবে যে একটি ক্লাস্টারিং অ্যালগরিদম এই ডেটা থেকে কী বের করতে পারে।
+
+ > 🎓 মনে রাখুন, সম্পর্ক কারণ নির্দেশ করে না! আমাদের কাছে সম্পর্কের প্রমাণ আছে, কিন্তু কারণের প্রমাণ নেই। একটি [মজার ওয়েবসাইট](https://tylervigen.com/spurious-correlations) কিছু ভিজ্যুয়াল দেখায় যা এই পয়েন্টটি জোর দেয়।
+
+এই ডেটাসেটে একটি গানের জনপ্রিয়তা এবং নাচের যোগ্যতার মধ্যে কোনো মিল আছে কি? একটি FacetGrid দেখায় যে ঘরানার পার্থক্য সত্ত্বেও কিছু কেন্দ্রীভূত বৃত্ত রয়েছে। হতে পারে যে নাইজেরিয়ান স্বাদ এই ঘরানার জন্য একটি নির্দিষ্ট নাচের যোগ্যতার স্তরে মিলিত হয়?
+
+✅ বিভিন্ন ডেটাপয়েন্ট (energy, loudness, speechiness) এবং আরও বা ভিন্ন সঙ্গীত ঘরানা চেষ্টা করুন। আপনি কী আবিষ্কার করতে পারেন? ডেটার সাধারণ বিস্তৃতি দেখতে `df.describe()` টেবিলটি দেখুন।
+
+### অনুশীলন - ডেটা বিতরণ
+
+জনপ্রিয়তার উপর ভিত্তি করে নাচের যোগ্যতার ধারণায় এই তিনটি ঘরানা কি উল্লেখযোগ্যভাবে ভিন্ন?
+
+1. আমাদের শীর্ষ তিনটি ঘরানার ডেটা বিতরণ পরীক্ষা করুন জনপ্রিয়তা এবং নাচের যোগ্যতার জন্য একটি প্রদত্ত x এবং y অক্ষ বরাবর।
+
+ ```python
+ sns.set_theme(style="ticks")
+
+ g = sns.jointplot(
+ data=df,
+ x="popularity", y="danceability", hue="artist_top_genre",
+ kind="kde",
+ )
+ ```
+
+ আপনি একটি সাধারণ মিলন বিন্দুর চারপাশে কেন্দ্রীভূত বৃত্ত আবিষ্কার করতে পারেন, যা পয়েন্টগুলোর বিতরণ দেখায়।
+
+ > 🎓 লক্ষ্য করুন যে এই উদাহরণটি একটি KDE (Kernel Density Estimate) গ্রাফ ব্যবহার করে যা ডেটাকে একটি ধারাবাহিক সম্ভাব্যতা ঘনত্ব বক্ররেখা দিয়ে উপস্থাপন করে। এটি আমাদের একাধিক বিতরণের সাথে কাজ করার সময় ডেটা ব্যাখ্যা করতে সাহায্য করে।
+
+ সাধারণভাবে, তিনটি ঘরানা তাদের জনপ্রিয়তা এবং নাচের যোগ্যতার ক্ষেত্রে আলগাভাবে মিলিত হয়। এই আলগাভাবে মিলিত ডেটায় ক্লাস্টার নির্ধারণ করা একটি চ্যালেঞ্জ হবে:
+
+ 
+
+1. একটি স্ক্যাটার প্লট তৈরি করুন:
+
+ ```python
+ sns.FacetGrid(df, hue="artist_top_genre", height=5) \
+ .map(plt.scatter, "popularity", "danceability") \
+ .add_legend()
+ ```
+
+ একই অক্ষের স্ক্যাটারপ্লট একটি মিলিত প্যাটার্ন দেখায়
+
+ 
+
+সাধারণভাবে, ক্লাস্টারিংয়ের জন্য, আপনি ডেটার ক্লাস্টার দেখানোর জন্য স্ক্যাটারপ্লট ব্যবহার করতে পারেন, তাই এই ধরনের ভিজ্যুয়ালাইজেশন আয়ত্ত করা খুবই কার্যকর। পরবর্তী পাঠে, আমরা এই ফিল্টার করা ডেটা নিয়ে k-means ক্লাস্টারিং ব্যবহার করব যাতে এই ডেটায় আকর্ষণীয় উপায়ে ওভারল্যাপ করা গ্রুপগুলো আবিষ্কার করা যায়।
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+পরবর্তী পাঠের প্রস্তুতির জন্য, একটি চার্ট তৈরি করুন বিভিন্ন ক্লাস্টারিং অ্যালগরিদম সম্পর্কে যা আপনি আবিষ্কার করতে পারেন এবং প্রোডাকশন পরিবেশে ব্যবহার করতে পারেন। ক্লাস্টারিং কী ধরনের সমস্যার সমাধান করার চেষ্টা করছে?
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+ক্লাস্টারিং অ্যালগরিদম প্রয়োগ করার আগে, আমরা শিখেছি, আপনার ডেটাসেটের প্রকৃতি বোঝা একটি ভালো ধারণা। এই বিষয়ে আরও পড়ুন [এখানে](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)
+
+[এই সহায়ক নিবন্ধটি](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) বিভিন্ন ক্লাস্টারিং অ্যালগরিদমের আচরণ ব্যাখ্যা করে, বিভিন্ন ডেটা আকারের ভিত্তিতে।
+
+## অ্যাসাইনমেন্ট
+
+[ক্লাস্টারিংয়ের জন্য অন্যান্য ভিজ্যুয়ালাইজেশন গবেষণা করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/1-Visualize/assignment.md b/translations/bn/5-Clustering/1-Visualize/assignment.md
new file mode 100644
index 000000000..6b1eead3c
--- /dev/null
+++ b/translations/bn/5-Clustering/1-Visualize/assignment.md
@@ -0,0 +1,25 @@
+
+# ক্লাস্টারিংয়ের জন্য অন্যান্য ভিজুয়ালাইজেশন গবেষণা করুন
+
+## নির্দেশনা
+
+এই পাঠে, আপনি কিছু ভিজুয়ালাইজেশন কৌশল নিয়ে কাজ করেছেন যা ক্লাস্টারিংয়ের জন্য আপনার ডেটা প্লট করার প্রস্তুতির জন্য সহায়ক। বিশেষ করে স্ক্যাটারপ্লটগুলি বস্তুগুলোর গ্রুপ খুঁজে বের করার জন্য খুবই কার্যকর। স্ক্যাটারপ্লট তৈরি করার বিভিন্ন উপায় এবং বিভিন্ন লাইব্রেরি সম্পর্কে গবেষণা করুন এবং আপনার কাজ একটি নোটবুকে নথিভুক্ত করুন। আপনি এই পাঠের ডেটা, অন্যান্য পাঠের ডেটা, অথবা নিজে সংগ্রহ করা ডেটা ব্যবহার করতে পারেন (তবে দয়া করে তার উৎস আপনার নোটবুকে উল্লেখ করুন)। স্ক্যাটারপ্লট ব্যবহার করে কিছু ডেটা প্লট করুন এবং আপনি যা আবিষ্কার করেন তা ব্যাখ্যা করুন।
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ---------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------- |
+| | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে পাঁচটি ভালোভাবে নথিভুক্ত স্ক্যাটারপ্লট রয়েছে | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে পাঁচটির কম স্ক্যাটারপ্লট রয়েছে এবং এটি কম ভালোভাবে নথিভুক্ত | একটি অসম্পূর্ণ নোটবুক উপস্থাপন করা হয়েছে |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/1-Visualize/notebook.ipynb b/translations/bn/5-Clustering/1-Visualize/notebook.ipynb
new file mode 100644
index 000000000..4e3c0d68a
--- /dev/null
+++ b/translations/bn/5-Clustering/1-Visualize/notebook.ipynb
@@ -0,0 +1,50 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.3"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python383jvsc74a57bd0e134e05457d34029b6460cd73bbf1ed73f339b5b6d98c95be70b69eba114fe95",
+ "display_name": "Python 3.8.3 64-bit (conda)"
+ },
+ "coopTranslator": {
+ "original_hash": "40e0707e96b3e1899a912776006264f9",
+ "translation_date": "2025-08-29T23:25:15+00:00",
+ "source_file": "5-Clustering/1-Visualize/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/1-Visualize/solution/Julia/README.md b/translations/bn/5-Clustering/1-Visualize/solution/Julia/README.md
new file mode 100644
index 000000000..19b8cc6ad
--- /dev/null
+++ b/translations/bn/5-Clustering/1-Visualize/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb b/translations/bn/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb
new file mode 100644
index 000000000..c30cd3591
--- /dev/null
+++ b/translations/bn/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb
@@ -0,0 +1,499 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## **স্পটিফাই থেকে সংগৃহীত নাইজেরিয়ান সঙ্গীত - একটি বিশ্লেষণ**\n",
+ "\n",
+ "ক্লাস্টারিং হলো [অপরীক্ষিত শিক্ষণ](https://wikipedia.org/wiki/Unsupervised_learning) এর একটি ধরণ, যা ধরে নেয় যে একটি ডেটাসেট লেবেলবিহীন বা এর ইনপুট পূর্বনির্ধারিত আউটপুটের সাথে মেলানো হয়নি। এটি বিভিন্ন অ্যালগরিদম ব্যবহার করে লেবেলবিহীন ডেটা বিশ্লেষণ করে এবং ডেটার মধ্যে পাওয়া প্যাটার্ন অনুযায়ী গ্রুপ তৈরি করে।\n",
+ "\n",
+ "[**পূর্ব-লেকচার কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
+ "\n",
+ "### **ভূমিকা**\n",
+ "\n",
+ "[ক্লাস্টারিং](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) ডেটা অনুসন্ধানের জন্য খুবই কার্যকর। চলুন দেখি এটি নাইজেরিয়ান শ্রোতারা কীভাবে সঙ্গীত উপভোগ করেন তার প্রবণতা এবং প্যাটার্ন আবিষ্কার করতে সাহায্য করতে পারে কিনা।\n",
+ "\n",
+ "> ✅ ক্লাস্টারিং এর ব্যবহার নিয়ে এক মিনিট চিন্তা করুন। বাস্তব জীবনে, ক্লাস্টারিং ঘটে যখন আপনার কাছে একটি কাপড়ের স্তূপ থাকে এবং আপনাকে পরিবারের সদস্যদের কাপড় আলাদা করতে হয় 🧦👕👖🩲। ডেটা সায়েন্সে, ক্লাস্টারিং ঘটে যখন ব্যবহারকারীর পছন্দ বিশ্লেষণ করা হয় বা কোনো লেবেলবিহীন ডেটাসেটের বৈশিষ্ট্য নির্ধারণ করা হয়। একভাবে, ক্লাস্টারিং বিশৃঙ্খলাকে অর্থপূর্ণ করে তোলে, যেমন একটি মোজা রাখার ড্রয়ার।\n",
+ "\n",
+ "পেশাদার ক্ষেত্রে, ক্লাস্টারিং ব্যবহার করা যেতে পারে যেমন বাজার বিভাজন নির্ধারণ করা, কোন বয়সের গ্রুপ কী কিনছে তা নির্ধারণ করা। আরেকটি ব্যবহার হতে পারে অস্বাভাবিকতা সনাক্তকরণ, যেমন ক্রেডিট কার্ড লেনদেনের ডেটাসেট থেকে প্রতারণা সনাক্ত করা। অথবা আপনি এটি ব্যবহার করতে পারেন মেডিকেল স্ক্যানের একটি ব্যাচ থেকে টিউমার নির্ধারণ করতে।\n",
+ "\n",
+ "✅ এক মিনিট চিন্তা করুন, আপনি কীভাবে 'ক্লাস্টারিং' এর ব্যবহার ব্যাংকিং, ই-কমার্স বা ব্যবসার ক্ষেত্রে দেখেছেন।\n",
+ "\n",
+ "> 🎓 মজার ব্যাপার হলো, ক্লাস্টার বিশ্লেষণ ১৯৩০-এর দশকে নৃতত্ত্ব এবং মনোবিজ্ঞানের ক্ষেত্রে উদ্ভূত হয়েছিল। আপনি কল্পনা করতে পারেন এটি কীভাবে ব্যবহার করা হতে পারে?\n",
+ "\n",
+ "অন্যভাবে, এটি ব্যবহার করা যেতে পারে অনুসন্ধানের ফলাফল গ্রুপ করার জন্য - যেমন কেনাকাটার লিঙ্ক, ছবি বা রিভিউ। ক্লাস্টারিং কার্যকর যখন আপনার কাছে একটি বড় ডেটাসেট থাকে যা আপনি ছোট করতে চান এবং যার উপর আরও বিস্তারিত বিশ্লেষণ করতে চান। এই পদ্ধতি ডেটা সম্পর্কে জানার জন্য ব্যবহার করা যেতে পারে অন্য মডেল তৈরি করার আগে।\n",
+ "\n",
+ "✅ একবার আপনার ডেটা ক্লাস্টারে সংগঠিত হলে, আপনি এটিকে একটি ক্লাস্টার আইডি বরাদ্দ করেন। এই পদ্ধতি একটি ডেটাসেটের গোপনীয়তা সংরক্ষণে কার্যকর হতে পারে; আপনি ক্লাস্টারের আরও প্রকাশযোগ্য সনাক্তযোগ্য ডেটার পরিবর্তে একটি ডেটা পয়েন্টকে তার ক্লাস্টার আইডি দ্বারা উল্লেখ করতে পারেন। আপনি কি অন্য কারণ চিন্তা করতে পারেন কেন আপনি ক্লাস্টার আইডি ব্যবহার করবেন ক্লাস্টারের অন্যান্য উপাদানগুলির পরিবর্তে এটি সনাক্ত করতে?\n",
+ "\n",
+ "### ক্লাস্টারিং শুরু করা\n",
+ "\n",
+ "> 🎓 আমরা কীভাবে ক্লাস্টার তৈরি করি তা অনেকাংশে নির্ভর করে আমরা কীভাবে ডেটা পয়েন্টগুলোকে গ্রুপে সংগ্রহ করি। চলুন কিছু শব্দভাণ্ডার বিশ্লেষণ করি:\n",
+ ">\n",
+ "> 🎓 ['ট্রান্সডাকটিভ' বনাম 'ইনডাকটিভ'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
+ ">\n",
+ "> ট্রান্সডাকটিভ ইনফারেন্স পর্যবেক্ষণ করা প্রশিক্ষণ কেস থেকে নির্দিষ্ট টেস্ট কেসে ম্যাপ করে। ইনডাকটিভ ইনফারেন্স প্রশিক্ষণ কেস থেকে সাধারণ নিয়মে ম্যাপ করে যা পরে টেস্ট কেসে প্রয়োগ করা হয়।\n",
+ ">\n",
+ "> একটি উদাহরণ: কল্পনা করুন আপনার কাছে একটি ডেটাসেট আছে যা আংশিকভাবে লেবেলযুক্ত। কিছু জিনিস 'রেকর্ড', কিছু 'সিডি', এবং কিছু ফাঁকা। আপনার কাজ হলো ফাঁকাগুলো লেবেল করা। যদি আপনি একটি ইনডাকটিভ পদ্ধতি বেছে নেন, আপনি একটি মডেল প্রশিক্ষণ করবেন 'রেকর্ড' এবং 'সিডি' খুঁজতে এবং সেই লেবেলগুলো আপনার লেবেলবিহীন ডেটায় প্রয়োগ করবেন। এই পদ্ধতি 'ক্যাসেট' হিসেবে জিনিসগুলো শ্রেণীবদ্ধ করতে সমস্যায় পড়বে। অন্যদিকে, একটি ট্রান্সডাকটিভ পদ্ধতি এই অজানা ডেটা আরও কার্যকরভাবে পরিচালনা করে কারণ এটি অনুরূপ আইটেমগুলোকে একসাথে গ্রুপ করতে কাজ করে এবং তারপর একটি গ্রুপে লেবেল প্রয়োগ করে। এই ক্ষেত্রে, ক্লাস্টারগুলো 'গোলাকার সঙ্গীত জিনিস' এবং 'চৌকো সঙ্গীত জিনিস' প্রতিফলিত করতে পারে।\n",
+ ">\n",
+ "> 🎓 ['নন-ফ্ল্যাট' বনাম 'ফ্ল্যাট' জ্যামিতি](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
+ ">\n",
+ "> গাণিতিক পরিভাষা থেকে উদ্ভূত, নন-ফ্ল্যাট বনাম ফ্ল্যাট জ্যামিতি পয়েন্টগুলোর মধ্যে দূরত্ব পরিমাপের পদ্ধতি বোঝায়, যা হয় 'ফ্ল্যাট' ([ইউক্লিডিয়ান](https://wikipedia.org/wiki/Euclidean_geometry)) বা 'নন-ফ্ল্যাট' (নন-ইউক্লিডিয়ান) জ্যামিতিক পদ্ধতি।\n",
+ ">\n",
+ "> 'ফ্ল্যাট' এই প্রসঙ্গে ইউক্লিডিয়ান জ্যামিতি (যার কিছু অংশ 'প্লেন' জ্যামিতি হিসেবে শেখানো হয়), এবং নন-ফ্ল্যাট নন-ইউক্লিডিয়ান জ্যামিতি বোঝায়। জ্যামিতি এবং মেশিন লার্নিং এর মধ্যে সম্পর্ক কী? ঠিক আছে, যেহেতু দুটি ক্ষেত্রই গণিতের উপর ভিত্তি করে, পয়েন্টগুলোর মধ্যে দূরত্ব পরিমাপের একটি সাধারণ উপায় থাকতে হবে, এবং এটি 'ফ্ল্যাট' বা 'নন-ফ্ল্যাট' পদ্ধতিতে করা যেতে পারে, ডেটার প্রকৃতির উপর নির্ভর করে। [ইউক্লিডিয়ান দূরত্ব](https://wikipedia.org/wiki/Euclidean_distance) দুটি পয়েন্টের মধ্যে একটি রেখা অংশের দৈর্ঘ্য হিসেবে পরিমাপ করা হয়। [নন-ইউক্লিডিয়ান দূরত্ব](https://wikipedia.org/wiki/Non-Euclidean_geometry) একটি বক্ররেখা বরাবর পরিমাপ করা হয়। যদি আপনার ডেটা, ভিজ্যুয়ালাইজড, একটি প্লেনে বিদ্যমান না থাকে, তাহলে এটি পরিচালনা করার জন্য একটি বিশেষ অ্যালগরিদম ব্যবহার করতে হতে পারে।\n",
+ "\n",
+ "
\n",
+ " \n",
+ " ডাসানি মাদিপাল্লি দ্বারা ইনফোগ্রাফিক\n",
+ "\n",
+ "\n",
+ "\n",
+ "> 🎓 ['দূরত্ব'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
+ ">\n",
+ "> ক্লাস্টারগুলো তাদের দূরত্ব ম্যাট্রিক্স দ্বারা সংজ্ঞায়িত হয়, যেমন পয়েন্টগুলোর মধ্যে দূরত্ব। এই দূরত্ব কয়েকটি উপায়ে পরিমাপ করা যেতে পারে। ইউক্লিডিয়ান ক্লাস্টারগুলো পয়েন্ট মানগুলোর গড় দ্বারা সংজ্ঞায়িত হয় এবং একটি 'সেন্ট্রয়েড' বা কেন্দ্র বিন্দু ধারণ করে। দূরত্ব সেই সেন্ট্রয়েডের দূরত্ব দ্বারা পরিমাপ করা হয়। নন-ইউক্লিডিয়ান দূরত্ব 'ক্লাস্ট্রয়েড' বোঝায়, যা অন্যান্য পয়েন্টগুলোর সবচেয়ে কাছাকাছি বিন্দু। ক্লাস্ট্রয়েডগুলো বিভিন্ন উপায়ে সংজ্ঞায়িত করা যেতে পারে।\n",
+ ">\n",
+ "> 🎓 ['নিয়ন্ত্রিত'](https://wikipedia.org/wiki/Constrained_clustering)\n",
+ ">\n",
+ "> [নিয়ন্ত্রিত ক্লাস্টারিং](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) এই অপরীক্ষিত পদ্ধতিতে 'আংশিক-পরীক্ষিত' শিক্ষণ প্রবর্তন করে। পয়েন্টগুলোর মধ্যে সম্পর্কগুলো 'লিঙ্ক করা যাবে না' বা 'লিঙ্ক করতে হবে' হিসেবে চিহ্নিত করা হয়, তাই কিছু নিয়ম ডেটাসেটে প্রয়োগ করা হয়।\n",
+ ">\n",
+ "> একটি উদাহরণ: যদি একটি অ্যালগরিদমকে একটি ব্যাচের লেবেলবিহীন বা আংশিক-লেবেলযুক্ত ডেটায় মুক্ত করা হয়, এটি যে ক্লাস্টারগুলো তৈরি করে তা নিম্নমানের হতে পারে। উপরের উদাহরণে, ক্লাস্টারগুলো 'গোলাকার সঙ্গীত জিনিস', 'চৌকো সঙ্গীত জিনিস', 'ত্রিভুজাকার জিনিস' এবং 'কুকিজ' গ্রুপ করতে পারে। যদি কিছু নিয়ন্ত্রণ বা অনুসরণ করার নিয়ম দেওয়া হয় (\"আইটেমটি প্লাস্টিকের তৈরি হতে হবে\", \"আইটেমটি সঙ্গীত তৈরি করতে সক্ষম হতে হবে\") এটি অ্যালগরিদমকে আরও ভালো পছন্দ করতে সাহায্য করতে পারে।\n",
+ ">\n",
+ "> 🎓 'ঘনত্ব'\n",
+ ">\n",
+ "> 'শব্দযুক্ত' ডেটাকে 'ঘন' বলে মনে করা হয়। এর প্রতিটি ক্লাস্টারের মধ্যে পয়েন্টগুলোর দূরত্ব পরীক্ষা করলে দেখা যায় যে এটি বেশি বা কম ঘন, বা 'ভিড়যুক্ত' হতে পারে এবং তাই এই ডেটা উপযুক্ত ক্লাস্টারিং পদ্ধতি দিয়ে বিশ্লেষণ করা প্রয়োজন। [এই নিবন্ধটি](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) একটি শব্দযুক্ত ডেটাসেটের অসম ক্লাস্টার ঘনত্ব অন্বেষণ করতে K-Means ক্লাস্টারিং বনাম HDBSCAN অ্যালগরিদম ব্যবহার করার পার্থক্য প্রদর্শন করে।\n",
+ "\n",
+ "ক্লাস্টারিং কৌশল সম্পর্কে আপনার বোঝার গভীর করুন এই [শেখার মডিউলে](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)\n",
+ "\n",
+ "### **ক্লাস্টারিং অ্যালগরিদম**\n",
+ "\n",
+ "ক্লাস্টারিং অ্যালগরিদমের সংখ্যা ১০০-এর বেশি, এবং এর ব্যবহার ডেটার প্রকৃতির উপর নির্ভর করে। চলুন কিছু প্রধান অ্যালগরিদম আলোচনা করি:\n",
+ "\n",
+ "- **হায়ারারকিকাল ক্লাস্টারিং**। যদি কোনো বস্তু তার কাছাকাছি থাকা অন্য বস্তুর সাথে তার দূরত্বের ভিত্তিতে শ্রেণীবদ্ধ হয়, দূরের বস্তুর সাথে নয়, তাহলে ক্লাস্টারগুলো তাদের সদস্যদের দূরত্বের ভিত্তিতে গঠিত হয়। হায়ারারকিকাল ক্লাস্টারিং বারবার দুটি ক্লাস্টার একত্রিত করার মাধ্যমে চিহ্নিত করা হয়।\n",
+ "\n",
+ "
\n",
+ " \n",
+ " ডাসানি মাদিপাল্লি দ্বারা ইনফোগ্রাফিক\n",
+ "\n",
+ "\n",
+ "\n",
+ "- **সেন্ট্রয়েড ক্লাস্টারিং**। এই জনপ্রিয় অ্যালগরিদম 'k', বা তৈরি করার ক্লাস্টারের সংখ্যা নির্বাচন করার প্রয়োজন হয়, এর পরে অ্যালগরিদম একটি ক্লাস্টারের কেন্দ্র বিন্দু নির্ধারণ করে এবং সেই বিন্দুর চারপাশে ডেটা সংগ্রহ করে। [K-means ক্লাস্টারিং](https://wikipedia.org/wiki/K-means_clustering) সেন্ট্রয়েড ক্লাস্টারিং এর একটি জনপ্রিয় সংস্করণ যা একটি ডেটাসেটকে পূর্বনির্ধারিত K গ্রুপে বিভক্ত করে। কেন্দ্রটি নিকটতম গড় দ্বারা নির্ধারিত হয়, তাই নাম। ক্লাস্টারের বর্গক্ষেত্র দূরত্ব কমানো হয়।\n",
+ "\n",
+ "
\n",
+ " \n",
+ " ডাসানি মাদিপাল্লি দ্বারা ইনফোগ্রাফিক\n",
+ "\n",
+ "\n",
+ "\n",
+ "- **বিতরণ-ভিত্তিক ক্লাস্টারিং**। পরিসংখ্যানগত মডেলিংয়ের উপর ভিত্তি করে, বিতরণ-ভিত্তিক ক্লাস্টারিং একটি ক্লাস্টারে একটি ডেটা পয়েন্টের অন্তর্ভুক্তির সম্ভাবনা নির্ধারণ করে এবং সেই অনুযায়ী এটি বরাদ্দ করে। গাউসিয়ান মিশ্রণ পদ্ধতি এই ধরনের অন্তর্ভুক্ত।\n",
+ "\n",
+ "- **ঘনত্ব-ভিত্তিক ক্লাস্টারিং**। ডেটা পয়েন্টগুলো তাদের ঘনত্বের ভিত্তিতে ক্লাস্টারে বরাদ্দ করা হয়, বা তাদের একে অপরের চারপাশে গোষ্ঠীভুক্ত করা হয়। গ্রুপ থেকে দূরের ডেটা পয়েন্টগুলোকে আউটলায়ার বা শব্দ হিসেবে বিবেচনা করা হয়। DBSCAN, Mean-shift এবং OPTICS এই ধরনের ক্লাস্টারিংয়ের অন্তর্ভুক্ত।\n",
+ "\n",
+ "- **গ্রিড-ভিত্তিক ক্লাস্টারিং**। বহু-মাত্রিক ডেটাসেটের জন্য, একটি গ্রিড তৈরি করা হয় এবং ডেটা গ্রিডের কোষগুলোর মধ্যে বিভক্ত করা হয়, এর ফলে ক্লাস্টার তৈরি হয়।\n",
+ "\n",
+ "ক্লাস্টারিং সম্পর্কে শেখার সেরা উপায় হলো এটি নিজে চেষ্টা করা, তাই এই অনুশীলনে আপনি সেটাই করবেন।\n",
+ "\n",
+ "আমাদের এই মডিউল সম্পন্ন করতে কিছু প্যাকেজ প্রয়োজন হবে। আপনি এগুলো ইনস্টল করতে পারেন: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
+ "\n",
+ "অন্যভাবে, নিচের স্ক্রিপ্টটি পরীক্ষা করে দেখবে আপনার কাছে এই মডিউল সম্পন্ন করার জন্য প্রয়োজনীয় প্যাকেজগুলো আছে কিনা এবং যদি কিছু অনুপস্থিত থাকে তাহলে সেগুলো ইনস্টল করবে।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n",
+ "\r\n",
+ "pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## অনুশীলন - আপনার ডেটা ক্লাস্টার করুন\n",
+ "\n",
+ "ক্লাস্টারিং একটি পদ্ধতি হিসেবে সঠিক ভিজুয়ালাইজেশনের মাধ্যমে অনেকটাই সহজ হয়, তাই চলুন আমাদের মিউজিক ডেটা ভিজুয়ালাইজ করে শুরু করি। এই অনুশীলনটি আমাদের সাহায্য করবে সিদ্ধান্ত নিতে যে এই ডেটার প্রকৃতির জন্য কোন ক্লাস্টারিং পদ্ধতি সবচেয়ে কার্যকরভাবে ব্যবহার করা উচিত।\n",
+ "\n",
+ "চলুন দ্রুত শুরু করি ডেটা ইমপোর্ট করার মাধ্যমে।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load the core tidyverse and make it available in your current R session\r\n",
+ "library(tidyverse)\r\n",
+ "\r\n",
+ "# Import the data into a tibble\r\n",
+ "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n",
+ "\r\n",
+ "# View the first 5 rows of the data set\r\n",
+ "df %>% \r\n",
+ " slice_head(n = 5)\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "কখনও কখনও, আমরা আমাদের ডেটা সম্পর্কে কিছু অতিরিক্ত তথ্য জানতে চাইতে পারি। আমরা `data` এবং `এর গঠন` দেখতে পারি [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) ফাংশন ব্যবহার করে:\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Glimpse into the data set\r\n",
+ "df %>% \r\n",
+ " glimpse()\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ভালো কাজ!💪\n",
+ "\n",
+ "আমরা দেখতে পাচ্ছি যে `glimpse()` আপনাকে মোট সারি (পর্যবেক্ষণ) এবং কলাম (ভেরিয়েবল) সংখ্যা দেখাবে, তারপর প্রতিটি ভেরিয়েবলের নামের পরে সারিতে প্রতিটি ভেরিয়েবলের প্রথম কয়েকটি এন্ট্রি দেখাবে। এর পাশাপাশি, ভেরিয়েবলের *ডেটা টাইপ* প্রতিটি ভেরিয়েবলের নামের ঠিক পরে `< >` এর মধ্যে দেওয়া হয়।\n",
+ "\n",
+ "`DataExplorer::introduce()` এই তথ্যটি সুন্দরভাবে সংক্ষেপ করতে পারে:\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Describe basic information for our data\r\n",
+ "df %>% \r\n",
+ " introduce()\r\n",
+ "\r\n",
+ "# A visual display of the same\r\n",
+ "df %>% \r\n",
+ " plot_intro()\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "দারুণ! আমরা এখনই শিখলাম যে আমাদের ডেটাতে কোনো অনুপস্থিত মান নেই।\n",
+ "\n",
+ "যেহেতু আমরা এই পর্যায়ে আছি, আমরা সাধারণ কেন্দ্রীয় প্রবণতার পরিসংখ্যান (যেমন [গড়](https://en.wikipedia.org/wiki/Arithmetic_mean) এবং [মধ্যম](https://en.wikipedia.org/wiki/Median)) এবং বিচ্ছুরণের পরিমাপ (যেমন [মানক বিচ্যুতি](https://en.wikipedia.org/wiki/Standard_deviation)) `summarytools::descr()` ব্যবহার করে অনুসন্ধান করতে পারি।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Describe common statistics\r\n",
+ "df %>% \r\n",
+ " descr(stats = \"common\")\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "চলুন ডেটার সাধারণ মানগুলো দেখি। মনে রাখবেন, জনপ্রিয়তা `0` হতে পারে, যা এমন গানগুলোকে নির্দেশ করে যেগুলোর কোনো র্যাঙ্কিং নেই। আমরা এগুলো শীঘ্রই সরিয়ে ফেলব।\n",
+ "\n",
+ "> 🤔 যদি আমরা ক্লাস্টারিং নিয়ে কাজ করি, যা একটি অযাচাইকৃত পদ্ধতি এবং লেবেলযুক্ত ডেটার প্রয়োজন হয় না, তাহলে কেন আমরা এই ডেটা লেবেলসহ দেখাচ্ছি? ডেটা অনুসন্ধানের পর্যায়ে এগুলো কাজে লাগে, তবে ক্লাস্টারিং অ্যালগরিদম কাজ করার জন্য এগুলো প্রয়োজনীয় নয়।\n",
+ "\n",
+ "### ১. জনপ্রিয় ঘরানাগুলো অনুসন্ধান করুন\n",
+ "\n",
+ "চলুন 🎶 সবচেয়ে জনপ্রিয় ঘরানাগুলো খুঁজে বের করি, এর উপস্থিতির সংখ্যা গণনা করে।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Popular genres\r\n",
+ "top_genres <- df %>% \r\n",
+ " count(artist_top_genre, sort = TRUE) %>% \r\n",
+ "# Encode to categorical and reorder the according to count\r\n",
+ " mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n",
+ "\r\n",
+ "# Print the top genres\r\n",
+ "top_genres\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এটা ভালোই হলো! তারা বলে একটি ছবি হাজার হাজার ডেটা ফ্রেমের সারির সমান মূল্যবান (আসলে কেউই এটা বলে না 😅)। তবে আপনি তো বুঝতেই পারছেন, তাই না?\n",
+ "\n",
+ "বিষয়ভিত্তিক ডেটা (character বা factor ভেরিয়েবল) ভিজুয়ালাইজ করার একটি উপায় হলো বারপ্লট ব্যবহার করা। চলুন, শীর্ষ ১০টি জেনারের একটি বারপ্লট তৈরি করি:\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Change the default gray theme\r\n",
+ "theme_set(theme_light())\r\n",
+ "\r\n",
+ "# Visualize popular genres\r\n",
+ "top_genres %>%\r\n",
+ " slice(1:10) %>% \r\n",
+ " ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
+ " fill = artist_top_genre)) +\r\n",
+ " geom_col(alpha = 0.8) +\r\n",
+ " paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
+ " ggtitle(\"Top genres\") +\r\n",
+ " theme(plot.title = element_text(hjust = 0.5),\r\n",
+ " # Rotates the X markers (so we can read them)\r\n",
+ " axis.text.x = element_text(angle = 90))\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "এখন `missing` ঘরানাগুলো চিহ্নিত করা অনেক সহজ 🧐!\n",
+ "\n",
+ "> একটি ভালো ভিজুয়ালাইজেশন এমন কিছু দেখাবে যা আপনি আশা করেননি, অথবা ডেটা সম্পর্কে নতুন প্রশ্ন উত্থাপন করবে - হ্যাডলি উইকহ্যাম এবং গ্যারেট গ্রোলেমুন্ড, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
+ "\n",
+ "খেয়াল করুন, যখন শীর্ষ ঘরানাটি `Missing` হিসেবে বর্ণিত হয়, তার মানে হলো Spotify এটি শ্রেণীবদ্ধ করেনি, তাই আসুন এটি বাদ দেই।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Visualize popular genres\r\n",
+ "top_genres %>%\r\n",
+ " filter(artist_top_genre != \"Missing\") %>% \r\n",
+ " slice(1:10) %>% \r\n",
+ " ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
+ " fill = artist_top_genre)) +\r\n",
+ " geom_col(alpha = 0.8) +\r\n",
+ " paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
+ " ggtitle(\"Top genres\") +\r\n",
+ " theme(plot.title = element_text(hjust = 0.5),\r\n",
+ " # Rotates the X markers (so we can read them)\r\n",
+ " axis.text.x = element_text(angle = 90))\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "প্রাথমিক ডেটা অনুসন্ধান থেকে আমরা শিখি যে শীর্ষ তিনটি ঘরানা এই ডেটাসেটে আধিপত্য বিস্তার করে। চলুন `afro dancehall`, `afropop`, এবং `nigerian pop`-এর উপর মনোযোগ কেন্দ্রীভূত করি, পাশাপাশি ডেটাসেটটি ফিল্টার করে এমন সবকিছু সরিয়ে ফেলি যার জনপ্রিয়তার মান 0 (যার অর্থ এটি ডেটাসেটে জনপ্রিয়তা দিয়ে শ্রেণীবদ্ধ করা হয়নি এবং আমাদের উদ্দেশ্যে এটি শোরগোল হিসেবে বিবেচিত হতে পারে):\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "nigerian_songs <- df %>% \r\n",
+ " # Concentrate on top 3 genres\r\n",
+ " filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
+ " # Remove unclassified observations\r\n",
+ " filter(popularity != 0)\r\n",
+ "\r\n",
+ "\r\n",
+ "\r\n",
+ "# Visualize popular genres\r\n",
+ "nigerian_songs %>%\r\n",
+ " count(artist_top_genre) %>%\r\n",
+ " ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
+ " fill = artist_top_genre)) +\r\n",
+ " geom_col(alpha = 0.8) +\r\n",
+ " paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
+ " ggtitle(\"Top genres\") +\r\n",
+ " theme(plot.title = element_text(hjust = 0.5))\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "চলুন দেখি আমাদের ডেটাসেটে সংখ্যাগত ভেরিয়েবলগুলোর মধ্যে কোনো সুস্পষ্ট রৈখিক সম্পর্ক আছে কিনা। এই সম্পর্কটি গাণিতিকভাবে [সম্পর্ক পরিসংখ্যান](https://en.wikipedia.org/wiki/Correlation) দ্বারা পরিমাপ করা হয়।\n",
+ "\n",
+ "সম্পর্ক পরিসংখ্যান একটি মান যা -1 এবং 1 এর মধ্যে থাকে এবং এটি একটি সম্পর্কের শক্তি নির্দেশ করে। 0 এর উপরে মান *ইতিবাচক* সম্পর্ক নির্দেশ করে (একটি ভেরিয়েবলের উচ্চ মান সাধারণত অন্য ভেরিয়েবলের উচ্চ মানের সাথে মিলে যায়), আর 0 এর নিচে মান *নেতিবাচক* সম্পর্ক নির্দেশ করে (একটি ভেরিয়েবলের উচ্চ মান সাধারণত অন্য ভেরিয়েবলের নিম্ন মানের সাথে মিলে যায়)।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Narrow down to numeric variables and fid correlation\r\n",
+ "corr_mat <- nigerian_songs %>% \r\n",
+ " select(where(is.numeric)) %>% \r\n",
+ " cor()\r\n",
+ "\r\n",
+ "# Visualize correlation matrix\r\n",
+ "corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "ডেটাগুলোর মধ্যে শক্তিশালী সম্পর্ক নেই, শুধুমাত্র `energy` এবং `loudness` এর মধ্যে সম্পর্ক দেখা যায়, যা স্বাভাবিক, কারণ জোরে বাজানো গান সাধারণত অনেক বেশি উদ্দীপনামূলক হয়। `Popularity` এর সাথে `release date` এর একটি সম্পর্ক রয়েছে, যা স্বাভাবিক, কারণ সাম্প্রতিক গানগুলো সম্ভবত বেশি জনপ্রিয়। দৈর্ঘ্য এবং `energy` এর মধ্যেও একটি সম্পর্ক দেখা যায়।\n",
+ "\n",
+ "এই ডেটা নিয়ে একটি ক্লাস্টারিং অ্যালগরিদম কী করতে পারে তা দেখা বেশ আকর্ষণীয় হবে!\n",
+ "\n",
+ "> 🎓 মনে রাখবেন, সম্পর্ক থাকা মানেই কারণ প্রমাণিত হয় না! আমাদের কাছে সম্পর্কের প্রমাণ আছে, কিন্তু কারণের প্রমাণ নেই। একটি [মজার ওয়েবসাইট](https://tylervigen.com/spurious-correlations) এই বিষয়ে কিছু চিত্র দেখায় যা এই পয়েন্টটি জোর দেয়।\n",
+ "\n",
+ "### ২. ডেটা বিতরণ অন্বেষণ করুন\n",
+ "\n",
+ "চলুন আরও সূক্ষ্ম কিছু প্রশ্ন করি। জনপ্রিয়তার ভিত্তিতে তাদের নাচের যোগ্যতার ধারণায় কি ঘরানাগুলো উল্লেখযোগ্যভাবে ভিন্ন? চলুন আমাদের শীর্ষ তিনটি ঘরানার জনপ্রিয়তা এবং নাচের যোগ্যতার ডেটা বিতরণ একটি নির্দিষ্ট x এবং y অক্ষ বরাবর [ঘনত্ব প্লট](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) ব্যবহার করে পরীক্ষা করি।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Perform 2D kernel density estimation\r\n",
+ "density_estimate_2d <- nigerian_songs %>% \r\n",
+ " ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n",
+ " geom_density_2d(bins = 5, size = 1) +\r\n",
+ " paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
+ " xlim(-20, 80) +\r\n",
+ " ylim(0, 1.2)\r\n",
+ "\r\n",
+ "# Density plot based on the popularity\r\n",
+ "density_estimate_pop <- nigerian_songs %>% \r\n",
+ " ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
+ " geom_density(size = 1, alpha = 0.5) +\r\n",
+ " paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
+ " paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
+ " theme(legend.position = \"none\")\r\n",
+ "\r\n",
+ "# Density plot based on the danceability\r\n",
+ "density_estimate_dance <- nigerian_songs %>% \r\n",
+ " ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
+ " geom_density(size = 1, alpha = 0.5) +\r\n",
+ " paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
+ " paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Patch everything together\r\n",
+ "library(patchwork)\r\n",
+ "density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "আমরা দেখতে পাই যে, ঘরানার পার্থক্য সত্ত্বেও কিছু নির্দিষ্ট স্তরে নৃত্যযোগ্যতার ক্ষেত্রে কেন্দ্রিক বৃত্তগুলো একত্রিত হয়। এটা কি হতে পারে যে নাইজেরিয়ান রুচি এই ঘরানার জন্য একটি নির্দিষ্ট নৃত্যযোগ্যতার স্তরে মিলিত হয়?\n",
+ "\n",
+ "সাধারণভাবে, এই তিনটি ঘরানা তাদের জনপ্রিয়তা এবং নৃত্যযোগ্যতার ক্ষেত্রে একে অপরের সাথে সামঞ্জস্যপূর্ণ। এই অল্প-সংগঠিত ডেটায় ক্লাস্টার নির্ধারণ করা একটি চ্যালেঞ্জ হবে। দেখা যাক, একটি স্ক্যাটার প্লট কি এই বিষয়ে সহায়ক হতে পারে।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# A scatter plot of popularity and danceability\r\n",
+ "scatter_plot <- nigerian_songs %>% \r\n",
+ " ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n",
+ " geom_point(size = 2, alpha = 0.8) +\r\n",
+ " paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n",
+ "\r\n",
+ "# Add a touch of interactivity\r\n",
+ "ggplotly(scatter_plot)\r\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "একই অক্ষের একটি স্ক্যাটারপ্লট একই ধরনের অভিসরণ প্যাটার্ন দেখায়।\n",
+ "\n",
+ "সাধারণভাবে, ক্লাস্টারিংয়ের জন্য, আপনি স্ক্যাটারপ্লট ব্যবহার করতে পারেন ডেটার ক্লাস্টার দেখানোর জন্য, তাই এই ধরনের ভিজ্যুয়ালাইজেশন আয়ত্ত করা খুবই উপকারী। পরবর্তী পাঠে, আমরা এই ফিল্টার করা ডেটা ব্যবহার করব এবং কি-মিন্স ক্লাস্টারিং ব্যবহার করে এই ডেটায় এমন কিছু গ্রুপ আবিষ্কার করব যা আকর্ষণীয়ভাবে ওভারল্যাপ করে।\n",
+ "\n",
+ "## **🚀 চ্যালেঞ্জ**\n",
+ "\n",
+ "পরবর্তী পাঠের প্রস্তুতির জন্য, একটি চার্ট তৈরি করুন বিভিন্ন ক্লাস্টারিং অ্যালগরিদম সম্পর্কে যা আপনি আবিষ্কার করতে পারেন এবং প্রোডাকশন পরিবেশে ব্যবহার করতে পারেন। ক্লাস্টারিং কোন ধরনের সমস্যাগুলি সমাধান করার চেষ্টা করছে?\n",
+ "\n",
+ "## [**পোস্ট-লেকচার কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
+ "\n",
+ "## **পুনরালোচনা ও স্ব-অধ্যয়ন**\n",
+ "\n",
+ "ক্লাস্টারিং অ্যালগরিদম প্রয়োগ করার আগে, যেমন আমরা শিখেছি, আপনার ডেটাসেটের প্রকৃতি বোঝা একটি ভালো ধারণা। এই বিষয়ে আরও পড়ুন [এখানে](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
+ "\n",
+ "ক্লাস্টারিং কৌশল সম্পর্কে আপনার জ্ঞান গভীর করুন:\n",
+ "\n",
+ "- [Tidymodels এবং বন্ধুদের ব্যবহার করে ক্লাস্টারিং মডেল প্রশিক্ষণ এবং মূল্যায়ন](https://rpubs.com/eR_ic/clustering)\n",
+ "\n",
+ "- ব্র্যাডলি বোয়েমকে এবং ব্র্যান্ডন গ্রিনওয়েল, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
+ "\n",
+ "## **অ্যাসাইনমেন্ট**\n",
+ "\n",
+ "[ক্লাস্টারিংয়ের জন্য অন্যান্য ভিজ্যুয়ালাইজেশন গবেষণা করুন](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
+ "\n",
+ "## ধন্যবাদ:\n",
+ "\n",
+ "[জেন লুপার](https://www.twitter.com/jenlooper) মূল পাইথন সংস্করণ তৈরি করার জন্য ♥️\n",
+ "\n",
+ "[`দাসানি মাদিপল্লি`](https://twitter.com/dasani_decoded) অসাধারণ ইলাস্ট্রেশন তৈরি করার জন্য যা মেশিন লার্নিং ধারণাগুলিকে আরও সহজবোধ্য এবং বোঝার সহজ করে তোলে।\n",
+ "\n",
+ "শুভ শিক্ষাগ্রহণ,\n",
+ "\n",
+ "[এরিক](https://twitter.com/ericntay), গোল্ড মাইক্রোসফট লার্ন স্টুডেন্ট অ্যাম্বাসেডর।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখুন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": "",
+ "kernelspec": {
+ "display_name": "R",
+ "language": "R",
+ "name": "ir"
+ },
+ "language_info": {
+ "codemirror_mode": "r",
+ "file_extension": ".r",
+ "mimetype": "text/x-r-source",
+ "name": "R",
+ "pygments_lexer": "r",
+ "version": "3.4.1"
+ },
+ "coopTranslator": {
+ "original_hash": "99c36449cad3708a435f6798cfa39972",
+ "translation_date": "2025-08-29T23:27:51+00:00",
+ "source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/1-Visualize/solution/notebook.ipynb b/translations/bn/5-Clustering/1-Visualize/solution/notebook.ipynb
new file mode 100644
index 000000000..8c3113fb6
--- /dev/null
+++ b/translations/bn/5-Clustering/1-Visualize/solution/notebook.ipynb
@@ -0,0 +1,825 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Defaulting to user installation because normal site-packages is not writeable\n",
+ "Requirement already satisfied: seaborn in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (0.11.2)\n",
+ "Requirement already satisfied: matplotlib>=2.2 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from seaborn) (3.5.0)\n",
+ "Requirement already satisfied: numpy>=1.15 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from seaborn) (1.21.4)\n",
+ "Requirement already satisfied: pandas>=0.23 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from seaborn) (1.3.4)\n",
+ "Requirement already satisfied: scipy>=1.0 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from seaborn) (1.7.2)\n",
+ "Requirement already satisfied: fonttools>=4.22.0 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from matplotlib>=2.2->seaborn) (4.28.1)\n",
+ "Requirement already satisfied: pyparsing>=2.2.1 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from matplotlib>=2.2->seaborn) (2.4.7)\n",
+ "Requirement already satisfied: kiwisolver>=1.0.1 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from matplotlib>=2.2->seaborn) (1.3.2)\n",
+ "Requirement already satisfied: pillow>=6.2.0 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from matplotlib>=2.2->seaborn) (8.4.0)\n",
+ "Requirement already satisfied: cycler>=0.10 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from matplotlib>=2.2->seaborn) (0.11.0)\n",
+ "Requirement already satisfied: packaging>=20.0 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from matplotlib>=2.2->seaborn) (21.2)\n",
+ "Requirement already satisfied: setuptools-scm>=4 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from matplotlib>=2.2->seaborn) (6.3.2)\n",
+ "Requirement already satisfied: python-dateutil>=2.7 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from matplotlib>=2.2->seaborn) (2.8.2)\n",
+ "Requirement already satisfied: pytz>=2017.3 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from pandas>=0.23->seaborn) (2021.3)\n",
+ "Requirement already satisfied: six>=1.5 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from python-dateutil>=2.7->matplotlib>=2.2->seaborn) (1.16.0)\n",
+ "Requirement already satisfied: tomli>=1.0.0 in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from setuptools-scm>=4->matplotlib>=2.2->seaborn) (1.2.2)\n",
+ "Requirement already satisfied: setuptools in /Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages (from setuptools-scm>=4->matplotlib>=2.2->seaborn) (59.1.1)\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install seaborn"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.set_theme(style=\"ticks\")\n",
+ "\n",
+ "# Show the joint distribution using kernel density estimation\n",
+ "g = sns.jointplot(\n",
+ " data=df,\n",
+ " x=\"popularity\", y=\"danceability\", hue=\"artist_top_genre\",\n",
+ " kind=\"kde\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "সাধারণভাবে, তিনটি ঘরানা তাদের জনপ্রিয়তা এবং নাচের যোগ্যতার ক্ষেত্রে সামঞ্জস্যপূর্ণ। একই অক্ষের একটি স্ক্যাটারপ্লট একটি অনুরূপ সংমিলনের প্যাটার্ন দেখায়। প্রতিটি ঘরানার ডেটার বিতরণ পরীক্ষা করতে একটি স্ক্যাটারপ্লট চেষ্টা করুন।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/jenniferlooper/Library/Python/3.8/lib/python/site-packages/seaborn/axisgrid.py:337: UserWarning: The `size` parameter has been renamed to `height`; please update your code.\n",
+ " warnings.warn(msg, UserWarning)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.FacetGrid(df, hue=\"artist_top_genre\", size=5) \\\n",
+ " .map(plt.scatter, \"popularity\", \"danceability\") \\\n",
+ " .add_legend()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
+ },
+ "kernelspec": {
+ "display_name": "Python 3.7.0 64-bit ('3.7')",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.9"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "c61deff2839902ac8cb4ed411eb10fee",
+ "translation_date": "2025-08-29T23:25:44+00:00",
+ "source_file": "5-Clustering/1-Visualize/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/2-K-Means/README.md b/translations/bn/5-Clustering/2-K-Means/README.md
new file mode 100644
index 000000000..396939347
--- /dev/null
+++ b/translations/bn/5-Clustering/2-K-Means/README.md
@@ -0,0 +1,261 @@
+
+# K-Means ক্লাস্টারিং
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)
+
+এই পাঠে, আপনি Scikit-learn এবং পূর্বে আমদানি করা নাইজেরিয়ান মিউজিক ডেটাসেট ব্যবহার করে ক্লাস্টার তৈরি করতে শিখবেন। আমরা ক্লাস্টারিংয়ের জন্য K-Means এর মৌলিক বিষয়গুলি আলোচনা করব। মনে রাখবেন, পূর্বের পাঠে আপনি শিখেছেন যে ক্লাস্টার নিয়ে কাজ করার অনেক পদ্ধতি রয়েছে এবং আপনি যে পদ্ধতি ব্যবহার করবেন তা আপনার ডেটার উপর নির্ভর করে। আমরা K-Means চেষ্টা করব কারণ এটি সবচেয়ে সাধারণ ক্লাস্টারিং কৌশল। চলুন শুরু করি!
+
+আপনি যেসব শব্দ শিখবেন:
+
+- সিলুয়েট স্কোরিং
+- এলবো পদ্ধতি
+- ইনর্শিয়া
+- ভ্যারিয়েন্স
+
+## পরিচিতি
+
+[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) একটি পদ্ধতি যা সিগন্যাল প্রসেসিং ডোমেইন থেকে উদ্ভূত। এটি ডেটার গ্রুপগুলোকে 'k' ক্লাস্টারে ভাগ এবং বিভাজন করতে ব্যবহৃত হয় একটি পর্যবেক্ষণের সিরিজ ব্যবহার করে। প্রতিটি পর্যবেক্ষণ একটি নির্দিষ্ট ডেটাপয়েন্টকে তার নিকটতম 'mean' বা ক্লাস্টারের কেন্দ্রবিন্দুর সাথে গ্রুপ করতে কাজ করে।
+
+ক্লাস্টারগুলোকে [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram) হিসেবে চিত্রিত করা যায়, যেখানে একটি পয়েন্ট (বা 'seed') এবং তার সংশ্লিষ্ট অঞ্চল অন্তর্ভুক্ত থাকে।
+
+
+
+> ইনফোগ্রাফিক: [Jen Looper](https://twitter.com/jenlooper)
+
+K-Means ক্লাস্টারিং প্রক্রিয়া [তিনটি ধাপে সম্পন্ন হয়](https://scikit-learn.org/stable/modules/clustering.html#k-means):
+
+1. অ্যালগরিদমটি ডেটাসেট থেকে k-সংখ্যক কেন্দ্রবিন্দু নির্বাচন করে। এরপর এটি লুপ করে:
+ 1. এটি প্রতিটি নমুনাকে নিকটতম সেন্ট্রয়েডে বরাদ্দ করে।
+ 2. এটি পূর্ববর্তী সেন্ট্রয়েডে বরাদ্দ করা সমস্ত নমুনার গড় মান গ্রহণ করে নতুন সেন্ট্রয়েড তৈরি করে।
+ 3. তারপর এটি নতুন এবং পুরনো সেন্ট্রয়েডের মধ্যে পার্থক্য গণনা করে এবং সেন্ট্রয়েড স্থিতিশীল না হওয়া পর্যন্ত পুনরাবৃত্তি করে।
+
+K-Means ব্যবহারের একটি অসুবিধা হল আপনাকে 'k', অর্থাৎ সেন্ট্রয়েডের সংখ্যা নির্ধারণ করতে হবে। সৌভাগ্যক্রমে, 'elbow method' একটি ভালো প্রাথমিক মান অনুমান করতে সাহায্য করে। আপনি এটি একটু পরে চেষ্টা করবেন।
+
+## পূর্বশর্ত
+
+আপনি এই পাঠের [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) ফাইলটি ব্যবহার করবেন, যেখানে আপনি আগের পাঠে ডেটা আমদানি এবং প্রাথমিক পরিষ্কারকরণ করেছেন।
+
+## অনুশীলন - প্রস্তুতি
+
+গানের ডেটা আবার দেখুন।
+
+1. প্রতিটি কলামের জন্য `boxplot()` কল করে একটি বক্সপ্লট তৈরি করুন:
+
+ ```python
+ plt.figure(figsize=(20,20), dpi=200)
+
+ plt.subplot(4,3,1)
+ sns.boxplot(x = 'popularity', data = df)
+
+ plt.subplot(4,3,2)
+ sns.boxplot(x = 'acousticness', data = df)
+
+ plt.subplot(4,3,3)
+ sns.boxplot(x = 'energy', data = df)
+
+ plt.subplot(4,3,4)
+ sns.boxplot(x = 'instrumentalness', data = df)
+
+ plt.subplot(4,3,5)
+ sns.boxplot(x = 'liveness', data = df)
+
+ plt.subplot(4,3,6)
+ sns.boxplot(x = 'loudness', data = df)
+
+ plt.subplot(4,3,7)
+ sns.boxplot(x = 'speechiness', data = df)
+
+ plt.subplot(4,3,8)
+ sns.boxplot(x = 'tempo', data = df)
+
+ plt.subplot(4,3,9)
+ sns.boxplot(x = 'time_signature', data = df)
+
+ plt.subplot(4,3,10)
+ sns.boxplot(x = 'danceability', data = df)
+
+ plt.subplot(4,3,11)
+ sns.boxplot(x = 'length', data = df)
+
+ plt.subplot(4,3,12)
+ sns.boxplot(x = 'release_date', data = df)
+ ```
+
+ এই ডেটা কিছুটা গোলমেলে: প্রতিটি কলামকে বক্সপ্লট হিসেবে পর্যবেক্ষণ করে আপনি আউটলায়ার দেখতে পারেন।
+
+ 
+
+আপনি ডেটাসেটটি পর্যালোচনা করে এই আউটলায়ারগুলো সরিয়ে ফেলতে পারেন, তবে এটি ডেটাকে বেশ কমিয়ে দেবে।
+
+1. আপাতত, আপনি কোন কলামগুলো ক্লাস্টারিং অনুশীলনের জন্য ব্যবহার করবেন তা নির্বাচন করুন। একই রেঞ্জের কলামগুলো বেছে নিন এবং `artist_top_genre` কলামটিকে সংখ্যাসূচক ডেটা হিসেবে এনকোড করুন:
+
+ ```python
+ from sklearn.preprocessing import LabelEncoder
+ le = LabelEncoder()
+
+ X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')]
+
+ y = df['artist_top_genre']
+
+ X['artist_top_genre'] = le.fit_transform(X['artist_top_genre'])
+
+ y = le.transform(y)
+ ```
+
+1. এখন আপনাকে কতগুলো ক্লাস্টার লক্ষ্য করতে হবে তা নির্বাচন করতে হবে। আপনি জানেন যে ডেটাসেট থেকে আমরা ৩টি গান জেনার বের করেছি, তাই চলুন ৩টি চেষ্টা করি:
+
+ ```python
+ from sklearn.cluster import KMeans
+
+ nclusters = 3
+ seed = 0
+
+ km = KMeans(n_clusters=nclusters, random_state=seed)
+ km.fit(X)
+
+ # Predict the cluster for each data point
+
+ y_cluster_kmeans = km.predict(X)
+ y_cluster_kmeans
+ ```
+
+আপনি একটি অ্যারে দেখতে পাবেন যা প্রতিটি ডেটাফ্রেমের সারির জন্য পূর্বাভাসিত ক্লাস্টার (0, 1, বা 2) প্রিন্ট করে।
+
+1. এই অ্যারে ব্যবহার করে একটি 'সিলুয়েট স্কোর' গণনা করুন:
+
+ ```python
+ from sklearn import metrics
+ score = metrics.silhouette_score(X, y_cluster_kmeans)
+ score
+ ```
+
+## সিলুয়েট স্কোর
+
+একটি সিলুয়েট স্কোর 1 এর কাছাকাছি দেখুন। এই স্কোর -1 থেকে 1 পর্যন্ত পরিবর্তিত হয়, এবং যদি স্কোর 1 হয়, তাহলে ক্লাস্টারটি ঘন এবং অন্যান্য ক্লাস্টার থেকে ভালোভাবে পৃথক। 0 এর কাছাকাছি একটি মান ক্লাস্টারগুলোর মধ্যে ওভারল্যাপ নির্দেশ করে, যেখানে নমুনাগুলো প্রতিবেশী ক্লাস্টারের সিদ্ধান্ত সীমার খুব কাছাকাছি থাকে। [(উৎস)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)
+
+আমাদের স্কোর **.53**, যা মাঝামাঝি। এটি নির্দেশ করে যে আমাদের ডেটা এই ধরনের ক্লাস্টারিংয়ের জন্য বিশেষভাবে উপযুক্ত নয়, তবে চলুন এগিয়ে যাই।
+
+### অনুশীলন - একটি মডেল তৈরি করুন
+
+1. `KMeans` আমদানি করুন এবং ক্লাস্টারিং প্রক্রিয়া শুরু করুন।
+
+ ```python
+ from sklearn.cluster import KMeans
+ wcss = []
+
+ for i in range(1, 11):
+ kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
+ kmeans.fit(X)
+ wcss.append(kmeans.inertia_)
+
+ ```
+
+ এখানে কয়েকটি অংশ রয়েছে যা ব্যাখ্যা করার যোগ্য।
+
+ > 🎓 range: এটি ক্লাস্টারিং প্রক্রিয়ার পুনরাবৃত্তি।
+
+ > 🎓 random_state: "সেন্ট্রয়েড ইনিশিয়ালাইজেশনের জন্য র্যান্ডম নম্বর জেনারেশন নির্ধারণ করে।" [উৎস](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
+
+ > 🎓 WCSS: "within-cluster sums of squares" একটি ক্লাস্টারের সেন্ট্রয়েড থেকে সমস্ত পয়েন্টের গড় দূরত্বের বর্গ পরিমাপ করে। [উৎস](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce)
+
+ > 🎓 Inertia: K-Means অ্যালগরিদমগুলো সেন্ট্রয়েড নির্বাচন করার চেষ্টা করে যাতে 'inertia' কমানো যায়, যা "ক্লাস্টারগুলো কতটা অভ্যন্তরীণভাবে সঙ্গতিপূর্ণ তার একটি পরিমাপ।" [উৎস](https://scikit-learn.org/stable/modules/clustering.html)। এই মানটি প্রতিটি পুনরাবৃত্তিতে wcss ভেরিয়েবলে যোগ করা হয়।
+
+ > 🎓 k-means++: [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) এ আপনি 'k-means++' অপ্টিমাইজেশন ব্যবহার করতে পারেন, যা "সেন্ট্রয়েডগুলোকে সাধারণত একে অপরের থেকে দূরে ইনিশিয়ালাইজ করে, যা র্যান্ডম ইনিশিয়ালাইজেশনের চেয়ে সম্ভবত ভালো ফলাফল দেয়।"
+
+### এলবো পদ্ধতি
+
+পূর্বে, আপনি অনুমান করেছিলেন যে, যেহেতু আপনি ৩টি গান জেনার লক্ষ্য করেছেন, আপনাকে ৩টি ক্লাস্টার বেছে নেওয়া উচিত। কিন্তু তা কি সত্যিই সঠিক?
+
+1. নিশ্চিত করতে 'এলবো পদ্ধতি' ব্যবহার করুন।
+
+ ```python
+ plt.figure(figsize=(10,5))
+ sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red')
+ plt.title('Elbow')
+ plt.xlabel('Number of clusters')
+ plt.ylabel('WCSS')
+ plt.show()
+ ```
+
+ পূর্ববর্তী ধাপে তৈরি করা `wcss` ভেরিয়েবল ব্যবহার করে একটি চার্ট তৈরি করুন যা এলবোতে 'বাঁক' দেখায়, যা ক্লাস্টারের সর্বোত্তম সংখ্যা নির্দেশ করে। হয়তো এটি **৩**!
+
+ 
+
+## অনুশীলন - ক্লাস্টারগুলো প্রদর্শন করুন
+
+1. প্রক্রিয়াটি আবার চেষ্টা করুন, এবার তিনটি ক্লাস্টার সেট করুন এবং ক্লাস্টারগুলোকে একটি স্ক্যাটারপ্লট হিসেবে প্রদর্শন করুন:
+
+ ```python
+ from sklearn.cluster import KMeans
+ kmeans = KMeans(n_clusters = 3)
+ kmeans.fit(X)
+ labels = kmeans.predict(X)
+ plt.scatter(df['popularity'],df['danceability'],c = labels)
+ plt.xlabel('popularity')
+ plt.ylabel('danceability')
+ plt.show()
+ ```
+
+1. মডেলের সঠিকতা পরীক্ষা করুন:
+
+ ```python
+ labels = kmeans.labels_
+
+ correct_labels = sum(y == labels)
+
+ print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size))
+
+ print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size)))
+ ```
+
+ এই মডেলের সঠিকতা খুব ভালো নয়, এবং ক্লাস্টারগুলোর আকৃতি আপনাকে একটি ইঙ্গিত দেয় কেন।
+
+ 
+
+ এই ডেটা খুবই অসমতল, খুব কম সম্পর্কযুক্ত এবং কলাম মানগুলোর মধ্যে খুব বেশি ভ্যারিয়েন্স রয়েছে যা ভালোভাবে ক্লাস্টার করতে পারে। প্রকৃতপক্ষে, গঠিত ক্লাস্টারগুলো সম্ভবত উপরে সংজ্ঞায়িত তিনটি জেনার বিভাগ দ্বারা প্রভাবিত বা বিকৃত হয়েছে। এটি একটি শেখার প্রক্রিয়া ছিল!
+
+ Scikit-learn এর ডকুমেন্টেশনে, আপনি দেখতে পারেন যে এই ধরনের একটি মডেল, যেখানে ক্লাস্টারগুলো খুব ভালোভাবে চিহ্নিত নয়, একটি 'ভ্যারিয়েন্স' সমস্যা রয়েছে:
+
+ 
+ > ইনফোগ্রাফিক: Scikit-learn
+
+## ভ্যারিয়েন্স
+
+ভ্যারিয়েন্সকে "Mean থেকে বর্গ পার্থক্যের গড়" হিসেবে সংজ্ঞায়িত করা হয় [(উৎস)](https://www.mathsisfun.com/data/standard-deviation.html)। এই ক্লাস্টারিং সমস্যার প্রসঙ্গে, এটি নির্দেশ করে যে আমাদের ডেটাসেটের সংখ্যাগুলো Mean থেকে একটু বেশিই বিচ্যুত হতে থাকে।
+
+✅ এটি একটি চমৎকার মুহূর্ত যেখানে আপনি এই সমস্যাটি ঠিক করার সমস্ত উপায় নিয়ে চিন্তা করতে পারেন। ডেটা আরও সামঞ্জস্য করুন? ভিন্ন কলাম ব্যবহার করুন? ভিন্ন অ্যালগরিদম ব্যবহার করুন? ইঙ্গিত: আপনার ডেটা [স্কেলিং](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) করে স্বাভাবিক করুন এবং অন্যান্য কলাম পরীক্ষা করুন।
+
+> এই '[ভ্যারিয়েন্স ক্যালকুলেটর](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' ব্যবহার করে ধারণাটি আরও ভালোভাবে বুঝুন।
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+এই নোটবুক নিয়ে কিছু সময় ব্যয় করুন, প্যারামিটারগুলো সামঞ্জস্য করুন। আউটলায়ার সরিয়ে ডেটা আরও পরিষ্কার করে মডেলের সঠিকতা উন্নত করতে পারেন কি? আপনি নির্দিষ্ট ডেটা নমুনাগুলোকে আরও বেশি ওজন দিতে ওজন ব্যবহার করতে পারেন। আরও ভালো ক্লাস্টার তৈরি করতে আপনি আর কী করতে পারেন?
+
+ইঙ্গিত: আপনার ডেটা স্কেল করার চেষ্টা করুন। নোটবুকে মন্তব্য করা কোড রয়েছে যা স্ট্যান্ডার্ড স্কেলিং যোগ করে যাতে ডেটা কলামগুলো রেঞ্জের ক্ষেত্রে একে অপরের সাথে আরও ঘনিষ্ঠভাবে সাদৃশ্যপূর্ণ হয়। আপনি দেখতে পাবেন যে সিলুয়েট স্কোর কমে যায়, তবে এলবো গ্রাফের 'বাঁক' মসৃণ হয়ে যায়। এর কারণ হল ডেটা স্কেল না করলে কম ভ্যারিয়েন্সযুক্ত ডেটা বেশি ওজন বহন করতে পারে। এই সমস্যাটি সম্পর্কে আরও পড়ুন [এখানে](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226)।
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+একটি K-Means সিমুলেটর [যেমন এটি](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) দেখুন। আপনি এই টুলটি ব্যবহার করে নমুনা ডেটা পয়েন্টগুলো চিত্রিত করতে এবং এর সেন্ট্রয়েড নির্ধারণ করতে পারেন। আপনি ডেটার র্যান্ডমনেস, ক্লাস্টারের সংখ্যা এবং সেন্ট্রয়েডের সংখ্যা সম্পাদনা করতে পারেন। এটি কি আপনাকে ডেটা কীভাবে গ্রুপ করা যায় সে সম্পর্কে ধারণা পেতে সাহায্য করে?
+
+এছাড়াও, [Stanford থেকে এই K-Means হ্যান্ডআউট](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) দেখুন।
+
+## অ্যাসাইনমেন্ট
+
+[বিভিন্ন ক্লাস্টারিং পদ্ধতি চেষ্টা করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/2-K-Means/assignment.md b/translations/bn/5-Clustering/2-K-Means/assignment.md
new file mode 100644
index 000000000..b23c13a1c
--- /dev/null
+++ b/translations/bn/5-Clustering/2-K-Means/assignment.md
@@ -0,0 +1,25 @@
+
+# বিভিন্ন ক্লাস্টারিং পদ্ধতি চেষ্টা করুন
+
+## নির্দেশনা
+
+এই পাঠে আপনি K-Means ক্লাস্টারিং সম্পর্কে শিখেছেন। কখনও কখনও K-Means আপনার ডেটার জন্য উপযুক্ত নয়। একটি নোটবুক তৈরি করুন যা এই পাঠের ডেটা বা অন্য কোথাও থেকে নেওয়া ডেটা ব্যবহার করে (আপনার উৎস উল্লেখ করুন) এবং K-Means ছাড়া অন্য একটি ক্লাস্টারিং পদ্ধতি দেখান। আপনি কী শিখলেন?
+
+## মূল্যায়ন
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | --------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- |
+| | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে একটি ভালোভাবে ডকুমেন্টেড ক্লাস্টারিং মডেল রয়েছে | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে ভালো ডকুমেন্টেশন নেই এবং/অথবা অসম্পূর্ণ | অসম্পূর্ণ কাজ জমা দেওয়া হয়েছে |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/2-K-Means/notebook.ipynb b/translations/bn/5-Clustering/2-K-Means/notebook.ipynb
new file mode 100644
index 000000000..3de5990d0
--- /dev/null
+++ b/translations/bn/5-Clustering/2-K-Means/notebook.ipynb
@@ -0,0 +1,231 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "3e5c8ab363e8d88f566d4365efc7e0bd",
+ "translation_date": "2025-08-29T23:32:26+00:00",
+ "source_file": "5-Clustering/2-K-Means/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Requirement already satisfied: seaborn in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (0.11.1)\n",
+ "Requirement already satisfied: numpy>=1.15 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from seaborn) (1.19.2)\n",
+ "Requirement already satisfied: pandas>=0.23 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from seaborn) (1.1.2)\n",
+ "Requirement already satisfied: scipy>=1.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from seaborn) (1.4.1)\n",
+ "Requirement already satisfied: matplotlib>=2.2 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from seaborn) (3.1.0)\n",
+ "Requirement already satisfied: python-dateutil>=2.7.3 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from pandas>=0.23->seaborn) (2.8.0)\n",
+ "Requirement already satisfied: pytz>=2017.2 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from pandas>=0.23->seaborn) (2019.1)\n",
+ "Requirement already satisfied: cycler>=0.10 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn) (0.10.0)\n",
+ "Requirement already satisfied: kiwisolver>=1.0.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn) (1.1.0)\n",
+ "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn) (2.4.0)\n",
+ "Requirement already satisfied: six>=1.5 in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from python-dateutil>=2.7.3->pandas>=0.23->seaborn) (1.12.0)\n",
+ "Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from kiwisolver>=1.0.1->matplotlib>=2.2->seaborn) (45.1.0)\n",
+ "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
+ "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "pip install seaborn"
+ ]
+ },
+ {
+ "source": [
+ "শেষ পাঠে যেখানে আমরা শেষ করেছিলাম, সেখান থেকে শুরু করুন, ডেটা আমদানি এবং ফিল্টার করা হয়েছে।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " name album \\\n",
+ "0 Sparky Mandy & The Jungle \n",
+ "1 shuga rush EVERYTHING YOU HEARD IS TRUE \n",
+ "2 LITT! LITT! \n",
+ "3 Confident / Feeling Cool Enjoy Your Life \n",
+ "4 wanted you rare. \n",
+ "\n",
+ " artist artist_top_genre release_date length popularity \\\n",
+ "0 Cruel Santino alternative r&b 2019 144000 48 \n",
+ "1 Odunsi (The Engine) afropop 2020 89488 30 \n",
+ "2 AYLØ indie r&b 2018 207758 40 \n",
+ "3 Lady Donli nigerian pop 2019 175135 14 \n",
+ "4 Odunsi (The Engine) afropop 2018 152049 25 \n",
+ "\n",
+ " danceability acousticness energy instrumentalness liveness loudness \\\n",
+ "0 0.666 0.8510 0.420 0.534000 0.1100 -6.699 \n",
+ "1 0.710 0.0822 0.683 0.000169 0.1010 -5.640 \n",
+ "2 0.836 0.2720 0.564 0.000537 0.1100 -7.127 \n",
+ "3 0.894 0.7980 0.611 0.000187 0.0964 -4.961 \n",
+ "4 0.702 0.1160 0.833 0.910000 0.3480 -6.044 \n",
+ "\n",
+ " speechiness tempo time_signature \n",
+ "0 0.0829 133.015 5 \n",
+ "1 0.3600 129.993 3 \n",
+ "2 0.0424 130.005 4 \n",
+ "3 0.1130 111.087 4 \n",
+ "4 0.0447 105.115 4 "
+ ],
+ "text/html": "
"
+ },
+ "metadata": {},
+ "execution_count": 8
+ }
+ ],
+ "source": [
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/2-K-Means/solution/Julia/README.md b/translations/bn/5-Clustering/2-K-Means/solution/Julia/README.md
new file mode 100644
index 000000000..b7ff8c0e5
--- /dev/null
+++ b/translations/bn/5-Clustering/2-K-Means/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb b/translations/bn/5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb
new file mode 100644
index 000000000..f8904ca53
--- /dev/null
+++ b/translations/bn/5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb
@@ -0,0 +1,640 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "anaconda-cloud": "",
+ "kernelspec": {
+ "display_name": "R",
+ "language": "R",
+ "name": "ir"
+ },
+ "language_info": {
+ "codemirror_mode": "r",
+ "file_extension": ".r",
+ "mimetype": "text/x-r-source",
+ "name": "R",
+ "pygments_lexer": "r",
+ "version": "3.4.1"
+ },
+ "colab": {
+ "name": "lesson_14.ipynb",
+ "provenance": [],
+ "collapsed_sections": [],
+ "toc_visible": true
+ },
+ "coopTranslator": {
+ "original_hash": "ad65fb4aad0a156b42216e4929f490fc",
+ "translation_date": "2025-08-29T23:35:59+00:00",
+ "source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "GULATlQXLXyR"
+ },
+ "source": [
+ "## R এবং Tidy ডেটা নীতিমালা ব্যবহার করে K-Means ক্লাস্টারিং অন্বেষণ করুন\n",
+ "\n",
+ "### [**পূর্ব-লেকচার কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
+ "\n",
+ "এই পাঠে, আপনি শিখবেন কীভাবে Tidymodels প্যাকেজ এবং R ইকোসিস্টেমের অন্যান্য প্যাকেজ (আমরা তাদের বন্ধু 🧑🤝🧑 বলব) ব্যবহার করে ক্লাস্টার তৈরি করতে হয় এবং আপনি আগে আমদানি করা নাইজেরিয়ান মিউজিক ডেটাসেট ব্যবহার করবেন। আমরা ক্লাস্টারিংয়ের জন্য K-Means-এর মৌলিক বিষয়গুলি কভার করব। মনে রাখবেন, যেমন আপনি আগের পাঠে শিখেছেন, ক্লাস্টারের সাথে কাজ করার অনেক পদ্ধতি রয়েছে এবং আপনি কোন পদ্ধতি ব্যবহার করবেন তা আপনার ডেটার উপর নির্ভর করে। আমরা K-Means চেষ্টা করব কারণ এটি সবচেয়ে সাধারণ ক্লাস্টারিং কৌশল। চলুন শুরু করি!\n",
+ "\n",
+ "আপনি যেসব শব্দ সম্পর্কে শিখবেন:\n",
+ "\n",
+ "- সিলুয়েট স্কোরিং\n",
+ "\n",
+ "- এলবো পদ্ধতি\n",
+ "\n",
+ "- জড়তা (Inertia)\n",
+ "\n",
+ "- ভ্যারিয়েন্স\n",
+ "\n",
+ "### **পরিচিতি**\n",
+ "\n",
+ "[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) একটি পদ্ধতি যা সিগন্যাল প্রসেসিং ডোমেইন থেকে উদ্ভূত। এটি ডেটার বৈশিষ্ট্যের সাদৃশ্যের উপর ভিত্তি করে `k ক্লাস্টার`-এ গ্রুপ বিভক্ত এবং ভাগ করার জন্য ব্যবহৃত হয়।\n",
+ "\n",
+ "ক্লাস্টারগুলোকে [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram) হিসেবে চিত্রায়িত করা যায়, যেখানে একটি পয়েন্ট (বা 'বীজ') এবং তার সংশ্লিষ্ট অঞ্চল অন্তর্ভুক্ত থাকে।\n",
+ "\n",
+ "
\n",
+ " \n",
+ " জেন লুপারের ইনফোগ্রাফিক\n",
+ "\n",
+ "\n",
+ "K-Means ক্লাস্টারিংয়ের ধাপগুলো নিম্নরূপ:\n",
+ "\n",
+ "1. ডেটা বিজ্ঞানী প্রথমে তৈরি করতে চাওয়া ক্লাস্টারের সংখ্যা নির্দিষ্ট করেন।\n",
+ "\n",
+ "2. এরপর, অ্যালগরিদম এলোমেলোভাবে ডেটাসেট থেকে Kটি পর্যবেক্ষণ নির্বাচন করে যা ক্লাস্টারের প্রাথমিক কেন্দ্র (অর্থাৎ, সেন্ট্রয়েড) হিসেবে কাজ করবে।\n",
+ "\n",
+ "3. এরপর, বাকি প্রতিটি পর্যবেক্ষণকে তার নিকটতম সেন্ট্রয়েডে বরাদ্দ করা হয়।\n",
+ "\n",
+ "4. এরপর, প্রতিটি ক্লাস্টারের নতুন গড় গণনা করা হয় এবং সেন্ট্রয়েডকে গড়ে সরানো হয়।\n",
+ "\n",
+ "5. এখন যেহেতু কেন্দ্রগুলো পুনরায় গণনা করা হয়েছে, প্রতিটি পর্যবেক্ষণ আবার পরীক্ষা করা হয় এটি অন্য কোনো ক্লাস্টারের কাছাকাছি হতে পারে কিনা। সমস্ত অবজেক্ট আবার আপডেট হওয়া ক্লাস্টার গড় ব্যবহার করে পুনরায় বরাদ্দ করা হয়। ক্লাস্টার বরাদ্দ এবং সেন্ট্রয়েড আপডেট ধাপগুলো পুনরাবৃত্তি করা হয় যতক্ষণ না ক্লাস্টার বরাদ্দ পরিবর্তন হওয়া বন্ধ হয় (অর্থাৎ, যখন কনভার্জেন্স অর্জিত হয়)। সাধারণত, অ্যালগরিদম তখন বন্ধ হয় যখন প্রতিটি নতুন পুনরাবৃত্তি সেন্ট্রয়েডের নগণ্য গতিবিধি এবং ক্লাস্টারগুলো স্থির হয়ে যায়।\n",
+ "\n",
+ "
\n",
+ "\n",
+ "> মনে রাখবেন যে প্রাথমিক k পর্যবেক্ষণ এলোমেলোভাবে শুরু সেন্ট্রয়েড হিসেবে ব্যবহৃত হওয়ার কারণে, আমরা প্রতিবার পদ্ধতিটি প্রয়োগ করার সময় সামান্য ভিন্ন ফলাফল পেতে পারি। এই কারণে, বেশিরভাগ অ্যালগরিদম একাধিক *random starts* ব্যবহার করে এবং সর্বনিম্ন WCSS সহ পুনরাবৃত্তি নির্বাচন করে। সুতরাং, একটি *অপ্রীতিকর স্থানীয় অপ্টিমাম* এড়াতে সর্বদা K-Means একাধিক *nstart* মান দিয়ে চালানো অত্যন্ত সুপারিশ করা হয়।\n",
+ "\n",
+ "
\n",
+ "\n",
+ "অ্যালিসন হর্স্টের [চিত্রকর্ম](https://github.com/allisonhorst/stats-illustrations) ব্যবহার করে এই সংক্ষিপ্ত অ্যানিমেশনটি ক্লাস্টারিং প্রক্রিয়াটি ব্যাখ্যা করে:\n",
+ "\n",
+ "
\n",
+ " \n",
+ " @allison_horst এর চিত্রকর্ম\n",
+ "\n",
+ "\n",
+ "\n",
+ "ক্লাস্টারিংয়ে একটি মৌলিক প্রশ্ন হলো: আপনি কীভাবে জানবেন আপনার ডেটাকে কতগুলো ক্লাস্টারে ভাগ করবেন? K-Means ব্যবহারের একটি অসুবিধা হলো আপনাকে `k` নির্ধারণ করতে হবে, অর্থাৎ `centroids`-এর সংখ্যা। সৌভাগ্যক্রমে, `elbow method` `k`-এর জন্য একটি ভালো প্রাথমিক মান অনুমান করতে সাহায্য করে। আপনি এটি একটু পরেই চেষ্টা করবেন।\n",
+ "\n",
+ "### \n",
+ "\n",
+ "**প্রয়োজনীয়তা**\n",
+ "\n",
+ "আমরা [পূর্ববর্তী পাঠ](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) থেকে ঠিক যেখানে থেমেছিলাম সেখান থেকে শুরু করব, যেখানে আমরা ডেটাসেট বিশ্লেষণ করেছি, অনেক ভিজ্যুয়ালাইজেশন তৈরি করেছি এবং আগ্রহের পর্যবেক্ষণগুলিতে ডেটাসেট ফিল্টার করেছি। এটি অবশ্যই দেখে নিন!\n",
+ "\n",
+ "এই মডিউলটি সম্পন্ন করতে আমাদের কিছু প্যাকেজ প্রয়োজন হবে। আপনি সেগুলো ইনস্টল করতে পারেন: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
+ "\n",
+ "অথবা, নিচের স্ক্রিপ্টটি পরীক্ষা করে দেখবে আপনার কাছে এই মডিউল সম্পন্ন করার জন্য প্রয়োজনীয় প্যাকেজগুলো আছে কিনা এবং যদি কিছু অনুপস্থিত থাকে তবে সেগুলো ইনস্টল করবে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "ah_tBi58LXyi"
+ },
+ "source": [
+ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
+ "\n",
+ "pacman::p_load('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork')\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "7e--UCUTLXym"
+ },
+ "source": [
+ "চলুন দ্রুত শুরু করি!\n",
+ "\n",
+ "## ১. ডেটার সাথে নাচ: তিনটি সবচেয়ে জনপ্রিয় সঙ্গীত ঘরানা নির্ধারণ করুন\n",
+ "\n",
+ "এটি আগের পাঠে আমরা যা করেছি তার একটি পুনরাবৃত্তি। চলুন কিছু ডেটা বিশ্লেষণ করি!\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Ycamx7GGLXyn"
+ },
+ "source": [
+ "# Load the core tidyverse and make it available in your current R session\n",
+ "library(tidyverse)\n",
+ "\n",
+ "# Import the data into a tibble\n",
+ "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\", show_col_types = FALSE)\n",
+ "\n",
+ "# Narrow down to top 3 popular genres\n",
+ "nigerian_songs <- df %>% \n",
+ " # Concentrate on top 3 genres\n",
+ " filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \n",
+ " # Remove unclassified observations\n",
+ " filter(popularity != 0)\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Visualize popular genres using bar plots\n",
+ "theme_set(theme_light())\n",
+ "nigerian_songs %>%\n",
+ " count(artist_top_genre) %>%\n",
+ " ggplot(mapping = aes(x = artist_top_genre, y = n,\n",
+ " fill = artist_top_genre)) +\n",
+ " geom_col(alpha = 0.8) +\n",
+ " paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\n",
+ " ggtitle(\"Top genres\") +\n",
+ " theme(plot.title = element_text(hjust = 0.5))\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "b5h5zmkPLXyp"
+ },
+ "source": [
+ "🤩 এটি বেশ ভালো হলো!\n",
+ "\n",
+ "## ২. আরও ডেটা অনুসন্ধান।\n",
+ "\n",
+ "এই ডেটা কতটা পরিষ্কার? বক্সপ্লট ব্যবহার করে আউটলায়ার পরীক্ষা করা যাক। আমরা এমন সংখ্যাসূচক কলামগুলোর উপর মনোযোগ দেব যেখানে আউটলায়ার কম (যদিও আপনি আউটলায়ারগুলো সরিয়ে ফেলতে পারেন)। বক্সপ্লট ডেটার পরিসীমা দেখাতে পারে এবং কোন কলামগুলো ব্যবহার করা হবে তা বেছে নিতে সাহায্য করবে। তবে মনে রাখবেন, বক্সপ্লট ভ্যারিয়েন্স দেখায় না, যা ভালো ক্লাস্টারযোগ্য ডেটার একটি গুরুত্বপূর্ণ উপাদান। আরও জানতে [এই আলোচনা](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) দেখুন।\n",
+ "\n",
+ "[বক্সপ্লট](https://en.wikipedia.org/wiki/Box_plot) সংখ্যাসূচক ডেটার বণ্টন গ্রাফিক্যালি উপস্থাপন করতে ব্যবহৃত হয়, তাই আসুন জনপ্রিয় সঙ্গীত ঘরানার পাশাপাশি সমস্ত সংখ্যাসূচক কলাম *নির্বাচন* করে শুরু করি।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "HhNreJKLLXyq"
+ },
+ "source": [
+ "# Select top genre column and all other numeric columns\n",
+ "df_numeric <- nigerian_songs %>% \n",
+ " select(artist_top_genre, where(is.numeric)) \n",
+ "\n",
+ "# Display the data\n",
+ "df_numeric %>% \n",
+ " slice_head(n = 5)\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "uYXrwJRaLXyq"
+ },
+ "source": [
+ "দেখুন কীভাবে `where` সিলেকশন হেল্পারটি এটি সহজ করে তোলে 💁? এমন আরও ফাংশন [এখানে](https://tidyselect.r-lib.org/) অন্বেষণ করুন।\n",
+ "\n",
+ "যেহেতু আমরা প্রতিটি সংখ্যাসূচক বৈশিষ্ট্যের জন্য একটি বক্সপ্লট তৈরি করব এবং লুপ ব্যবহার এড়াতে চাই, আসুন আমাদের ডেটাকে একটি *লম্বা* ফরম্যাটে রূপান্তর করি যা আমাদের `facets` - সাবপ্লট যা প্রতিটি ডেটার একটি উপসেট প্রদর্শন করে - এর সুবিধা নিতে সাহায্য করবে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "gd5bR3f8LXys"
+ },
+ "source": [
+ "# Pivot data from wide to long\n",
+ "df_numeric_long <- df_numeric %>% \n",
+ " pivot_longer(!artist_top_genre, names_to = \"feature_names\", values_to = \"values\") \n",
+ "\n",
+ "# Print out data\n",
+ "df_numeric_long %>% \n",
+ " slice_head(n = 15)\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-7tE1swnLXyv"
+ },
+ "source": [
+ "আরও দীর্ঘ! এখন কিছু `ggplots` এর সময়! তাহলে আমরা কোন `geom` ব্যবহার করব?\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "r88bIsyuLXyy"
+ },
+ "source": [
+ "# Make a box plot\n",
+ "df_numeric_long %>% \n",
+ " ggplot(mapping = aes(x = feature_names, y = values, fill = feature_names)) +\n",
+ " geom_boxplot() +\n",
+ " facet_wrap(~ feature_names, ncol = 4, scales = \"free\") +\n",
+ " theme(legend.position = \"none\")\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "EYVyKIUELXyz"
+ },
+ "source": [
+ "এখন আমরা দেখতে পাচ্ছি যে এই ডেটা কিছুটা বিশৃঙ্খল: প্রতিটি কলামকে একটি বক্সপ্লট হিসেবে পর্যবেক্ষণ করলে আপনি আউটলায়ার দেখতে পাবেন। আপনি ডেটাসেটটি পর্যবেক্ষণ করে এই আউটলায়ারগুলো সরিয়ে ফেলতে পারেন, তবে এতে ডেটা খুবই সীমিত হয়ে যাবে।\n",
+ "\n",
+ "এখন, চলুন ঠিক করি কোন কোন কলাম আমরা আমাদের ক্লাস্টারিং অনুশীলনের জন্য ব্যবহার করব। চলুন একই রেঞ্জের সংখ্যাসূচক কলামগুলো বেছে নিই। আমরা `artist_top_genre`-কে সংখ্যায় রূপান্তর করতে পারতাম, তবে আপাতত এটি বাদ দিচ্ছি।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "-wkpINyZLXy0"
+ },
+ "source": [
+ "# Select variables with similar ranges\n",
+ "df_numeric_select <- df_numeric %>% \n",
+ " select(popularity, danceability, acousticness, loudness, energy) \n",
+ "\n",
+ "# Normalize data\n",
+ "# df_numeric_select <- scale(df_numeric_select)\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "D7dLzgpqLXy1"
+ },
+ "source": [
+ "## ৩. R-এ k-means ক্লাস্টারিং গণনা করা\n",
+ "\n",
+ "আমরা R-এ বিল্ট-ইন `kmeans` ফাংশন ব্যবহার করে k-means গণনা করতে পারি, দেখুন `help(\"kmeans()\")`। `kmeans()` ফাংশন একটি ডেটা ফ্রেম গ্রহণ করে যার সমস্ত কলাম সংখ্যা-ভিত্তিক, এবং এটি এর প্রধান আর্গুমেন্ট।\n",
+ "\n",
+ "k-means ক্লাস্টারিং ব্যবহার করার প্রথম ধাপ হলো ক্লাস্টারের সংখ্যা (k) নির্ধারণ করা, যা চূড়ান্ত সমাধানে তৈরি হবে। আমরা জানি যে ডেটাসেট থেকে আমরা ৩টি গানের ঘরানা বের করেছি, তাই চলুন ৩টি চেষ্টা করি:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "uC4EQ5w7LXy5"
+ },
+ "source": [
+ "set.seed(2056)\n",
+ "# Kmeans clustering for 3 clusters\n",
+ "kclust <- kmeans(\n",
+ " df_numeric_select,\n",
+ " # Specify the number of clusters\n",
+ " centers = 3,\n",
+ " # How many random initial configurations\n",
+ " nstart = 25\n",
+ ")\n",
+ "\n",
+ "# Display clustering object\n",
+ "kclust\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "hzfhscWrLXy-"
+ },
+ "source": [
+ "kmeans অবজেক্টে বেশ কিছু তথ্য থাকে যা `help(\"kmeans()\")`-এ ভালোভাবে ব্যাখ্যা করা হয়েছে। আপাতত, আমরা কয়েকটি বিষয়ে মনোযোগ দিই। আমরা দেখতে পাচ্ছি যে ডেটা ৩টি ক্লাস্টারে ভাগ করা হয়েছে, যার সাইজ যথাক্রমে ৬৫, ১১০, ১১১। আউটপুটে ৫টি ভেরিয়েবলের উপর ভিত্তি করে ৩টি গ্রুপের ক্লাস্টার সেন্টার (গড়) রয়েছে।\n",
+ "\n",
+ "ক্লাস্টারিং ভেক্টর প্রতিটি পর্যবেক্ষণের জন্য ক্লাস্টার অ্যাসাইনমেন্ট নির্দেশ করে। আসুন `augment` ফাংশন ব্যবহার করে মূল ডেটাসেটে ক্লাস্টার অ্যাসাইনমেন্ট যোগ করি।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "0XwwpFGQLXy_"
+ },
+ "source": [
+ "# Add predicted cluster assignment to data set\n",
+ "augment(kclust, df_numeric_select) %>% \n",
+ " relocate(.cluster) %>% \n",
+ " slice_head(n = 10)\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "NXIVXXACLXzA"
+ },
+ "source": [
+ "দারুণ, আমরা আমাদের ডেটাসেটকে ৩টি গ্রুপে ভাগ করেছি। তাহলে, আমাদের ক্লাস্টারিং কতটা ভালো 🤷? চলুন `Silhouette score` দেখে নিই।\n",
+ "\n",
+ "### **Silhouette score**\n",
+ "\n",
+ "[Silhouette বিশ্লেষণ](https://en.wikipedia.org/wiki/Silhouette_(clustering)) ব্যবহার করে আমরা ক্লাস্টারগুলোর মধ্যে বিভাজন দূরত্ব বিশ্লেষণ করতে পারি। এই স্কোর -1 থেকে 1 এর মধ্যে পরিবর্তিত হয়। যদি স্কোর 1 এর কাছাকাছি হয়, তাহলে ক্লাস্টারটি ঘন এবং অন্যান্য ক্লাস্টার থেকে ভালোভাবে পৃথক। 0 এর কাছাকাছি মান নির্দেশ করে যে ক্লাস্টারগুলো একে অপরের সাথে ওভারল্যাপ করছে এবং নমুনাগুলো প্রতিবেশী ক্লাস্টারের সিদ্ধান্ত সীমানার খুব কাছাকাছি। [source](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)।\n",
+ "\n",
+ "গড় silhouette পদ্ধতি বিভিন্ন *k* এর মানের জন্য পর্যবেক্ষণগুলোর গড় silhouette স্কোর গণনা করে। একটি উচ্চ গড় silhouette স্কোর একটি ভালো ক্লাস্টারিং নির্দেশ করে।\n",
+ "\n",
+ "`silhouette` ফাংশনটি ক্লাস্টার প্যাকেজে ব্যবহার করা হয় গড় silhouette প্রস্থ গণনা করার জন্য।\n",
+ "\n",
+ "> Silhouette যেকোনো [দূরত্ব](https://en.wikipedia.org/wiki/Distance \"Distance\") মেট্রিক ব্যবহার করে গণনা করা যেতে পারে, যেমন [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") বা [Manhattan distance](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\"), যা আমরা [পূর্ববর্তী পাঠে](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb) আলোচনা করেছি।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "Jn0McL28LXzB"
+ },
+ "source": [
+ "# Load cluster package\n",
+ "library(cluster)\n",
+ "\n",
+ "# Compute average silhouette score\n",
+ "ss <- silhouette(kclust$cluster,\n",
+ " # Compute euclidean distance\n",
+ " dist = dist(df_numeric_select))\n",
+ "mean(ss[, 3])\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "QyQRn97nLXzC"
+ },
+ "source": [
+ "আমাদের স্কোর **.549**, যা মাঝামাঝি অবস্থানে রয়েছে। এটি নির্দেশ করে যে আমাদের ডেটা এই ধরনের ক্লাস্টারিংয়ের জন্য বিশেষভাবে উপযুক্ত নয়। চলুন দেখি আমরা এই ধারণাটি চাক্ষুষভাবে নিশ্চিত করতে পারি কিনা। [factoextra প্যাকেজ](https://rpkgs.datanovia.com/factoextra/index.html) ক্লাস্টারিং চিত্রায়নের জন্য ফাংশন (`fviz_cluster()`) প্রদান করে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "7a6Km1_FLXzD"
+ },
+ "source": [
+ "library(factoextra)\n",
+ "\n",
+ "# Visualize clustering results\n",
+ "fviz_cluster(kclust, df_numeric_select)\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "IBwCWt-0LXzD"
+ },
+ "source": [
+ "ক্লাস্টারগুলোর মধ্যে ওভারল্যাপ নির্দেশ করে যে আমাদের ডেটা এই ধরনের ক্লাস্টারিংয়ের জন্য বিশেষভাবে উপযুক্ত নয়, তবে চলুন আমরা এগিয়ে যাই।\n",
+ "\n",
+ "## ৪. অপ্টিমাল ক্লাস্টার নির্ধারণ\n",
+ "\n",
+ "K-Means ক্লাস্টারিংয়ে একটি মৌলিক প্রশ্ন প্রায়ই উঠে আসে - যদি ক্লাস লেবেল জানা না থাকে, তাহলে কীভাবে বুঝবেন যে আপনার ডেটাকে কতগুলো ক্লাস্টারে ভাগ করতে হবে?\n",
+ "\n",
+ "আমরা এটি জানার একটি উপায় হলো একটি ডেটা স্যাম্পল ব্যবহার করে `একটি সিরিজ ক্লাস্টারিং মডেল তৈরি করা`, যেখানে ক্লাস্টারের সংখ্যা ধাপে ধাপে বাড়ানো হয় (যেমন ১ থেকে ১০ পর্যন্ত), এবং ক্লাস্টারিং মেট্রিক যেমন **Silhouette স্কোর** মূল্যায়ন করা।\n",
+ "\n",
+ "চলুন বিভিন্ন *k* এর জন্য ক্লাস্টারিং অ্যালগরিদম গণনা করে এবং **Within Cluster Sum of Squares** (WCSS) মূল্যায়ন করে অপ্টিমাল ক্লাস্টারের সংখ্যা নির্ধারণ করি। টোটাল Within Cluster Sum of Squares (WCSS) ক্লাস্টারিংয়ের কমপ্যাক্টনেস পরিমাপ করে এবং আমরা চাই এটি যতটা সম্ভব ছোট হোক, কারণ ছোট মান নির্দেশ করে যে ডেটা পয়েন্টগুলো একে অপরের কাছাকাছি।\n",
+ "\n",
+ "চলুন `k` এর বিভিন্ন মান (১ থেকে ১০ পর্যন্ত) এই ক্লাস্টারিংয়ে কী প্রভাব ফেলে তা অন্বেষণ করি।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "hSeIiylDLXzE"
+ },
+ "source": [
+ "# Create a series of clustering models\n",
+ "kclusts <- tibble(k = 1:10) %>% \n",
+ " # Perform kmeans clustering for 1,2,3 ... ,10 clusters\n",
+ " mutate(model = map(k, ~ kmeans(df_numeric_select, centers = .x, nstart = 25)),\n",
+ " # Farm out clustering metrics eg WCSS\n",
+ " glanced = map(model, ~ glance(.x))) %>% \n",
+ " unnest(cols = glanced)\n",
+ " \n",
+ "\n",
+ "# View clustering rsulsts\n",
+ "kclusts\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "m7rS2U1eLXzE"
+ },
+ "source": [
+ "এখন আমাদের কাছে প্রতিটি ক্লাস্টারিং অ্যালগরিদমের জন্য কেন্দ্র *k* সহ মোট ক্লাস্টারের মধ্যে যোগফল (tot.withinss) রয়েছে, আমরা [elbow method](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) ব্যবহার করে ক্লাস্টারের সর্বোত্তম সংখ্যা নির্ধারণ করি। এই পদ্ধতিতে ক্লাস্টারের সংখ্যার উপর ভিত্তি করে WCSS এর একটি গ্রাফ আঁকা হয় এবং [বক্ররেখার কনুই](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") নির্বাচন করা হয় ক্লাস্টারের সংখ্যা হিসাবে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "o_DjHGItLXzF"
+ },
+ "source": [
+ "set.seed(2056)\n",
+ "# Use elbow method to determine optimum number of clusters\n",
+ "kclusts %>% \n",
+ " ggplot(mapping = aes(x = k, y = tot.withinss)) +\n",
+ " geom_line(size = 1.2, alpha = 0.8, color = \"#FF7F0EFF\") +\n",
+ " geom_point(size = 2, color = \"#FF7F0EFF\")\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "pLYyt5XSLXzG"
+ },
+ "source": [
+ "প্লটে দেখা যাচ্ছে যে WCSS-এ (অর্থাৎ, বেশি *ঘনত্ব*) একটি বড় পরিমাণ হ্রাস ঘটে যখন ক্লাস্টারের সংখ্যা এক থেকে দুইয়ে বৃদ্ধি পায়, এবং দুই থেকে তিন ক্লাস্টারে আরও একটি উল্লেখযোগ্য হ্রাস দেখা যায়। এর পর থেকে হ্রাসের মাত্রা তেমন স্পষ্ট নয়, যার ফলে চার্টে প্রায় তিনটি ক্লাস্টারের কাছাকাছি একটি `elbow` 💪 তৈরি হয়। এটি একটি ভালো ইঙ্গিত দেয় যে ডেটা পয়েন্টগুলোর মধ্যে দুই থেকে তিনটি যথেষ্ট ভালোভাবে পৃথক ক্লাস্টার রয়েছে।\n",
+ "\n",
+ "এখন আমরা `k = 3` এর জন্য ক্লাস্টারিং মডেলটি বের করতে পারি:\n",
+ "\n",
+ "> `pull()`: একটি একক কলাম বের করতে ব্যবহৃত হয় \n",
+ ">\n",
+ "> `pluck()`: তালিকা বা অনুরূপ ডেটা কাঠামো থেকে ডেটা সূচক করতে ব্যবহৃত হয় \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "JP_JPKBILXzG"
+ },
+ "source": [
+ "# Extract k = 3 clustering\n",
+ "final_kmeans <- kclusts %>% \n",
+ " filter(k == 3) %>% \n",
+ " pull(model) %>% \n",
+ " pluck(1)\n",
+ "\n",
+ "\n",
+ "final_kmeans\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "l_PDTu8tLXzI"
+ },
+ "source": [
+ "চলুন, আমরা প্রাপ্ত ক্লাস্টারগুলো ভিজুয়ালাইজ করি। `plotly` ব্যবহার করে কিছু ইন্টারঅ্যাক্টিভিটি যোগ করতে চান?\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "dNcleFe-LXzJ"
+ },
+ "source": [
+ "# Add predicted cluster assignment to data set\n",
+ "results <- augment(final_kmeans, df_numeric_select) %>% \n",
+ " bind_cols(df_numeric %>% select(artist_top_genre)) \n",
+ "\n",
+ "# Plot cluster assignments\n",
+ "clust_plt <- results %>% \n",
+ " ggplot(mapping = aes(x = popularity, y = danceability, color = .cluster, shape = artist_top_genre)) +\n",
+ " geom_point(size = 2, alpha = 0.8) +\n",
+ " paletteer::scale_color_paletteer_d(\"ggthemes::Tableau_10\")\n",
+ "\n",
+ "ggplotly(clust_plt)\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "6JUM_51VLXzK"
+ },
+ "source": [
+ "সম্ভবত আমরা আশা করতাম যে প্রতিটি ক্লাস্টার (বিভিন্ন রঙ দ্বারা উপস্থাপিত) আলাদা আলাদা ঘরানা (বিভিন্ন আকার দ্বারা উপস্থাপিত) থাকবে।\n",
+ "\n",
+ "চলুন মডেলের সঠিকতা দেখে নিই।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "metadata": {
+ "id": "HdIMUGq7LXzL"
+ },
+ "source": [
+ "# Assign genres to predefined integers\n",
+ "label_count <- results %>% \n",
+ " group_by(artist_top_genre) %>% \n",
+ " mutate(id = cur_group_id()) %>% \n",
+ " ungroup() %>% \n",
+ " summarise(correct_labels = sum(.cluster == id))\n",
+ "\n",
+ "\n",
+ "# Print results \n",
+ "cat(\"Result:\", label_count$correct_labels, \"out of\", nrow(results), \"samples were correctly labeled.\")\n",
+ "\n",
+ "cat(\"\\nAccuracy score:\", label_count$correct_labels/nrow(results))\n"
+ ],
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "C50wvaAOLXzM"
+ },
+ "source": [
+ "এই মডেলের সঠিকতা খারাপ নয়, তবে খুব ভালোও নয়। হতে পারে যে ডেটা K-Means ক্লাস্টারিংয়ের জন্য খুব উপযুক্ত নয়। এই ডেটা খুবই অসম, খুব কম সম্পর্কযুক্ত এবং কলাম মানগুলির মধ্যে অনেক বেশি বৈচিত্র্য রয়েছে যা ভালোভাবে ক্লাস্টার করতে বাধা দেয়। প্রকৃতপক্ষে, গঠিত ক্লাস্টারগুলি সম্ভবত উপরে সংজ্ঞায়িত তিনটি ঘরানার দ্বারা ভারীভাবে প্রভাবিত বা বিকৃত হয়।\n",
+ "\n",
+ "তবুও, এটি একটি চমৎকার শেখার প্রক্রিয়া ছিল!\n",
+ "\n",
+ "Scikit-learn এর ডকুমেন্টেশনে, আপনি দেখতে পাবেন যে এই ধরনের একটি মডেল, যেখানে ক্লাস্টারগুলি খুব ভালোভাবে চিহ্নিত নয়, একটি 'বৈচিত্র্য' সমস্যার সম্মুখীন হয়:\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Scikit-learn থেকে ইনফোগ্রাফিক\n",
+ "\n",
+ "\n",
+ "\n",
+ "## **বৈচিত্র্য**\n",
+ "\n",
+ "বৈচিত্র্যকে সংজ্ঞায়িত করা হয় \"গড় থেকে বর্গমূল পার্থক্যের গড়\" [উৎস](https://www.mathsisfun.com/data/standard-deviation.html)। এই ক্লাস্টারিং সমস্যার প্রেক্ষিতে, এটি বোঝায় যে আমাদের ডেটাসেটের সংখ্যাগুলি গড় থেকে একটু বেশিই বিচ্যুত হওয়ার প্রবণতা দেখায়।\n",
+ "\n",
+ "✅ এটি একটি দুর্দান্ত মুহূর্ত এই সমস্যাটি সমাধানের সমস্ত উপায় নিয়ে ভাবার জন্য। ডেটা আরেকটু পরিবর্তন করবেন? ভিন্ন কলাম ব্যবহার করবেন? ভিন্ন অ্যালগরিদম ব্যবহার করবেন? ইঙ্গিত: আপনার ডেটা [স্কেলিং](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) করার চেষ্টা করুন এটি স্বাভাবিক করতে এবং অন্যান্য কলাম পরীক্ষা করুন।\n",
+ "\n",
+ "> এই '[বৈচিত্র্য ক্যালকুলেটর](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' ব্যবহার করে ধারণাটি আরও ভালোভাবে বোঝার চেষ্টা করুন।\n",
+ "\n",
+ "------------------------------------------------------------------------\n",
+ "\n",
+ "## **🚀চ্যালেঞ্জ**\n",
+ "\n",
+ "এই নোটবুকের সাথে কিছু সময় কাটান, প্যারামিটার পরিবর্তন করুন। ডেটা আরও পরিষ্কার করে (উদাহরণস্বরূপ, আউটলায়ার সরিয়ে) মডেলের সঠিকতা বাড়াতে পারবেন কি? আপনি নির্দিষ্ট ডেটা নমুনাগুলিকে বেশি ওজন দিতে ওজন ব্যবহার করতে পারেন। আরও কী করতে পারেন যাতে ভালো ক্লাস্টার তৈরি হয়?\n",
+ "\n",
+ "ইঙ্গিত: আপনার ডেটা স্কেল করার চেষ্টা করুন। নোটবুকে মন্তব্য করা কোড রয়েছে যা স্ট্যান্ডার্ড স্কেলিং যোগ করে যাতে ডেটা কলামগুলি রেঞ্জের দিক থেকে একে অপরের সাথে আরও ঘনিষ্ঠভাবে সাদৃশ্যপূর্ণ হয়। আপনি দেখতে পাবেন যে সিলুয়েট স্কোর কমে যায়, তবে 'কিংক' এলবো গ্রাফে মসৃণ হয়ে যায়। এর কারণ হল ডেটা স্কেল না করলে কম বৈচিত্র্যযুক্ত ডেটা বেশি ওজন বহন করতে পারে। এই সমস্যাটি সম্পর্কে আরও পড়ুন [এখানে](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226)।\n",
+ "\n",
+ "## [**পোস্ট-লেকচার কুইজ**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
+ "\n",
+ "## **পুনরালোচনা ও স্ব-অধ্যয়ন**\n",
+ "\n",
+ "- একটি K-Means সিমুলেটর [যেমন এটি](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/) দেখুন। আপনি এই টুলটি ব্যবহার করে নমুনা ডেটা পয়েন্টগুলি ভিজ্যুয়ালাইজ করতে এবং এর সেন্ট্রয়েড নির্ধারণ করতে পারেন। আপনি ডেটার র্যান্ডমনেস, ক্লাস্টারের সংখ্যা এবং সেন্ট্রয়েডের সংখ্যা সম্পাদনা করতে পারেন। এটি কি আপনাকে ডেটা কীভাবে গোষ্ঠীবদ্ধ করা যায় সে সম্পর্কে ধারণা পেতে সাহায্য করে?\n",
+ "\n",
+ "- এছাড়াও, [স্ট্যানফোর্ডের এই হ্যান্ডআউট](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) দেখুন K-Means সম্পর্কে।\n",
+ "\n",
+ "আপনার সদ্য অর্জিত ক্লাস্টারিং দক্ষতাগুলি এমন ডেটাসেটে প্রয়োগ করতে চান যা K-Means ক্লাস্টারিংয়ের জন্য উপযুক্ত? দয়া করে দেখুন:\n",
+ "\n",
+ "- [ক্লাস্টারিং মডেল প্রশিক্ষণ এবং মূল্যায়ন](https://rpubs.com/eR_ic/clustering) Tidymodels এবং বন্ধুদের ব্যবহার করে\n",
+ "\n",
+ "- [K-means ক্লাস্টার বিশ্লেষণ](https://uc-r.github.io/kmeans_clustering), UC বিজনেস অ্যানালিটিক্স R প্রোগ্রামিং গাইড\n",
+ "\n",
+ "- [টিডি ডেটা নীতির সাথে K-means ক্লাস্টারিং](https://www.tidymodels.org/learn/statistics/k-means/)\n",
+ "\n",
+ "## **অ্যাসাইনমেন্ট**\n",
+ "\n",
+ "[বিভিন্ন ক্লাস্টারিং পদ্ধতি চেষ্টা করুন](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
+ "\n",
+ "## ধন্যবাদ:\n",
+ "\n",
+ "[জেন লুপার](https://www.twitter.com/jenlooper) এই মডিউলের মূল পাইথন সংস্করণ তৈরি করার জন্য ♥️\n",
+ "\n",
+ "[`অ্যালিসন হর্স্ট`](https://twitter.com/allison_horst/) অসাধারণ ইলাস্ট্রেশন তৈরি করার জন্য যা R-কে আরও স্বাগত এবং আকর্ষণীয় করে তোলে। তার আরও ইলাস্ট্রেশন খুঁজুন তার [গ্যালারিতে](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM)।\n",
+ "\n",
+ "শুভ শেখা,\n",
+ "\n",
+ "[এরিক](https://twitter.com/ericntay), গোল্ড মাইক্রোসফট লার্ন স্টুডেন্ট অ্যাম্বাসেডর।\n",
+ "\n",
+ "
\n",
+ " \n",
+ " @allison_horst এর শিল্পকর্ম\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/2-K-Means/solution/notebook.ipynb b/translations/bn/5-Clustering/2-K-Means/solution/notebook.ipynb
new file mode 100644
index 000000000..fea06f05d
--- /dev/null
+++ b/translations/bn/5-Clustering/2-K-Means/solution/notebook.ipynb
@@ -0,0 +1,552 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "e867e87e3129c8875423a82945f4ad5e",
+ "translation_date": "2025-08-29T23:33:08+00:00",
+ "source_file": "5-Clustering/2-K-Means/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Requirement already satisfied: seaborn in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (0.11.1)\n",
+ "Requirement already satisfied: pandas>=0.23 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from seaborn) (1.1.2)\n",
+ "Requirement already satisfied: matplotlib>=2.2 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from seaborn) (3.1.0)\n",
+ "Requirement already satisfied: scipy>=1.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from seaborn) (1.4.1)\n",
+ "Requirement already satisfied: numpy>=1.15 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from seaborn) (1.19.2)\n",
+ "Requirement already satisfied: python-dateutil>=2.7.3 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from pandas>=0.23->seaborn) (2.8.0)\n",
+ "Requirement already satisfied: pytz>=2017.2 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from pandas>=0.23->seaborn) (2019.1)\n",
+ "Requirement already satisfied: kiwisolver>=1.0.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn) (1.1.0)\n",
+ "Requirement already satisfied: cycler>=0.10 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn) (0.10.0)\n",
+ "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from matplotlib>=2.2->seaborn) (2.4.0)\n",
+ "Requirement already satisfied: six>=1.5 in /Users/jenlooper/Library/Python/3.7/lib/python/site-packages (from python-dateutil>=2.7.3->pandas>=0.23->seaborn) (1.12.0)\n",
+ "Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from kiwisolver>=1.0.1->matplotlib>=2.2->seaborn) (45.1.0)\n",
+ "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
+ "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "pip install seaborn"
+ ]
+ },
+ {
+ "source": [
+ "শেষ পাঠে যেখানে আমরা শেষ করেছিলাম, সেখান থেকে শুরু করুন, ডেটা আমদানি এবং ফিল্টার করা হয়েছে।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " name album \\\n",
+ "0 Sparky Mandy & The Jungle \n",
+ "1 shuga rush EVERYTHING YOU HEARD IS TRUE \n",
+ "2 LITT! LITT! \n",
+ "3 Confident / Feeling Cool Enjoy Your Life \n",
+ "4 wanted you rare. \n",
+ "\n",
+ " artist artist_top_genre release_date length popularity \\\n",
+ "0 Cruel Santino alternative r&b 2019 144000 48 \n",
+ "1 Odunsi (The Engine) afropop 2020 89488 30 \n",
+ "2 AYLØ indie r&b 2018 207758 40 \n",
+ "3 Lady Donli nigerian pop 2019 175135 14 \n",
+ "4 Odunsi (The Engine) afropop 2018 152049 25 \n",
+ "\n",
+ " danceability acousticness energy instrumentalness liveness loudness \\\n",
+ "0 0.666 0.8510 0.420 0.534000 0.1100 -6.699 \n",
+ "1 0.710 0.0822 0.683 0.000169 0.1010 -5.640 \n",
+ "2 0.836 0.2720 0.564 0.000537 0.1100 -7.127 \n",
+ "3 0.894 0.7980 0.611 0.000187 0.0964 -4.961 \n",
+ "4 0.702 0.1160 0.833 0.910000 0.3480 -6.044 \n",
+ "\n",
+ " speechiness tempo time_signature \n",
+ "0 0.0829 133.015 5 \n",
+ "1 0.3600 129.993 3 \n",
+ "2 0.0424 130.005 4 \n",
+ "3 0.1130 111.087 4 \n",
+ "4 0.0447 105.115 4 "
+ ],
+ "text/html": "
"
+ },
+ "metadata": {},
+ "execution_count": 107
+ }
+ ],
+ "source": [
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 108,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.preprocessing import StandardScaler\n",
+ "\n",
+ "scaler = StandardScaler()\n",
+ "\n",
+ "# X = df.loc[:, ('danceability','energy')]\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 110,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "error",
+ "ename": "ValueError",
+ "evalue": "Unknown label type: 'continuous'",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;31m# we create an instance of SVM and fit out data. We do not scale our\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;31m# data since we want to plot the support vectors\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 22\u001b[0;31m \u001b[0mls30\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mLabelSpreading\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_30\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_30\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Label Spreading 30% data'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 23\u001b[0m \u001b[0mls50\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mLabelSpreading\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_50\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_50\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Label Spreading 50% data'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0mls100\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mLabelSpreading\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Label Spreading 100% data'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/semi_supervised/_label_propagation.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 229\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mX_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 230\u001b[0;31m \u001b[0mcheck_classification_targets\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 231\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0;31m# actual graph construction (implementations should override this)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/utils/multiclass.py\u001b[0m in \u001b[0;36mcheck_classification_targets\u001b[0;34m(y)\u001b[0m\n\u001b[1;32m 181\u001b[0m if y_type not in ['binary', 'multiclass', 'multiclass-multioutput',\n\u001b[1;32m 182\u001b[0m 'multilabel-indicator', 'multilabel-sequences']:\n\u001b[0;32m--> 183\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Unknown label type: %r\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0my_type\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 184\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mValueError\u001b[0m: Unknown label type: 'continuous'"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.svm import SVC\n",
+ "from sklearn.semi_supervised import LabelSpreading\n",
+ "from sklearn.semi_supervised import SelfTrainingClassifier\n",
+ "from sklearn import datasets\n",
+ "\n",
+ "X = df[['danceability','acousticness']].values\n",
+ "y = df['energy'].values\n",
+ "\n",
+ "# X = scaler.fit_transform(X)\n",
+ "\n",
+ "# step size in the mesh\n",
+ "h = .02\n",
+ "\n",
+ "rng = np.random.RandomState(0)\n",
+ "y_rand = rng.rand(y.shape[0])\n",
+ "y_30 = np.copy(y)\n",
+ "y_30[y_rand < 0.3] = -1 # set random samples to be unlabeled\n",
+ "y_50 = np.copy(y)\n",
+ "y_50[y_rand < 0.5] = -1\n",
+ "# we create an instance of SVM and fit out data. We do not scale our\n",
+ "# data since we want to plot the support vectors\n",
+ "ls30 = (LabelSpreading().fit(X, y_30), y_30, 'Label Spreading 30% data')\n",
+ "ls50 = (LabelSpreading().fit(X, y_50), y_50, 'Label Spreading 50% data')\n",
+ "ls100 = (LabelSpreading().fit(X, y), y, 'Label Spreading 100% data')\n",
+ "\n",
+ "# the base classifier for self-training is identical to the SVC\n",
+ "base_classifier = SVC(kernel='rbf', gamma=.5, probability=True)\n",
+ "st30 = (SelfTrainingClassifier(base_classifier).fit(X, y_30),\n",
+ " y_30, 'Self-training 30% data')\n",
+ "st50 = (SelfTrainingClassifier(base_classifier).fit(X, y_50),\n",
+ " y_50, 'Self-training 50% data')\n",
+ "\n",
+ "rbf_svc = (SVC(kernel='rbf', gamma=.5).fit(X, y), y, 'SVC with rbf kernel')\n",
+ "\n",
+ "# create a mesh to plot in\n",
+ "x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1\n",
+ "y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1\n",
+ "xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n",
+ " np.arange(y_min, y_max, h))\n",
+ "\n",
+ "color_map = {-1: (1, 1, 1), 0: (0, 0, .9), 1: (1, 0, 0), 2: (.8, .6, 0)}\n",
+ "\n",
+ "classifiers = (ls30, st30, ls50, st50, ls100, rbf_svc)\n",
+ "for i, (clf, y_train, title) in enumerate(classifiers):\n",
+ " # Plot the decision boundary. For that, we will assign a color to each\n",
+ " # point in the mesh [x_min, x_max]x[y_min, y_max].\n",
+ " plt.subplot(3, 2, i + 1)\n",
+ " Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n",
+ "\n",
+ " # Put the result into a color plot\n",
+ " Z = Z.reshape(xx.shape)\n",
+ " plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)\n",
+ " plt.axis('off')\n",
+ "\n",
+ " # Plot also the training points\n",
+ " colors = [color_map[y] for y in y_train]\n",
+ " plt.scatter(X[:, 0], X[:, 1], c=colors, edgecolors='black')\n",
+ "\n",
+ " plt.title(title)\n",
+ "\n",
+ "plt.suptitle(\"Unlabeled points are colored white\", y=0.1)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/5-Clustering/README.md b/translations/bn/5-Clustering/README.md
new file mode 100644
index 000000000..551155292
--- /dev/null
+++ b/translations/bn/5-Clustering/README.md
@@ -0,0 +1,42 @@
+
+# মেশিন লার্নিংয়ের জন্য ক্লাস্টারিং মডেল
+
+ক্লাস্টারিং একটি মেশিন লার্নিং কাজ যেখানে একে এমন বস্তু খুঁজে বের করতে হয় যেগুলো একে অপরের সাথে সাদৃশ্যপূর্ণ এবং সেগুলোকে ক্লাস্টার নামে পরিচিত গ্রুপে ভাগ করা হয়। ক্লাস্টারিংয়ের বিশেষত্ব হলো এটি স্বয়ংক্রিয়ভাবে ঘটে, যা মেশিন লার্নিংয়ের অন্যান্য পদ্ধতির থেকে আলাদা। আসলে, এটি সুপারভাইজড লার্নিংয়ের বিপরীত বলা যেতে পারে।
+
+## আঞ্চলিক বিষয়: নাইজেরিয়ান শ্রোতাদের সঙ্গীত রুচির জন্য ক্লাস্টারিং মডেল 🎧
+
+নাইজেরিয়ার বৈচিত্র্যময় শ্রোতাদের সঙ্গীতের রুচিও বৈচিত্র্যময়। Spotify থেকে সংগৃহীত ডেটা ব্যবহার করে (এই [প্রবন্ধটি](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421) দ্বারা অনুপ্রাণিত), আসুন নাইজেরিয়ায় জনপ্রিয় কিছু সঙ্গীত দেখি। এই ডেটাসেটে বিভিন্ন গানের 'danceability' স্কোর, 'acousticness', শব্দের উচ্চতা, 'speechiness', জনপ্রিয়তা এবং এনার্জি সম্পর্কিত তথ্য অন্তর্ভুক্ত রয়েছে। এই ডেটায় প্যাটার্ন খুঁজে বের করাটা বেশ মজার হবে!
+
+
+
+> ছবি তুলেছেন Marcela LaskoskiUnsplash-এ
+
+এই পাঠগুলোর মাধ্যমে, আপনি ক্লাস্টারিং টেকনিক ব্যবহার করে ডেটা বিশ্লেষণের নতুন উপায় শিখবেন। ক্লাস্টারিং বিশেষভাবে কার্যকর যখন আপনার ডেটাসেটে লেবেল থাকে না। যদি লেবেল থাকে, তাহলে পূর্ববর্তী পাঠে শেখা ক্লাসিফিকেশন টেকনিকগুলো বেশি কার্যকর হতে পারে। কিন্তু যখন আপনি লেবেলবিহীন ডেটাকে গ্রুপ করতে চান, তখন ক্লাস্টারিং প্যাটার্ন আবিষ্কারের জন্য একটি চমৎকার পদ্ধতি।
+
+> ক্লাস্টারিং মডেলের সাথে কাজ করার জন্য কিছু কার্যকর লো-কোড টুল রয়েছে। এই কাজের জন্য [Azure ML চেষ্টা করুন](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
+
+## পাঠসমূহ
+
+1. [ক্লাস্টারিংয়ের পরিচিতি](1-Visualize/README.md)
+2. [কে-মিন্স ক্লাস্টারিং](2-K-Means/README.md)
+
+## কৃতজ্ঞতা
+
+এই পাঠগুলো 🎶 দিয়ে লিখেছেন [Jen Looper](https://www.twitter.com/jenlooper), এবং সহায়ক পর্যালোচনা করেছেন [Rishit Dagli](https://rishit_dagli) এবং [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan)।
+
+[Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) ডেটাসেটটি Kaggle থেকে সংগৃহীত, যা Spotify থেকে স্ক্র্যাপ করা হয়েছে।
+
+এই পাঠ তৈরিতে সহায়ক কিছু কার্যকর কে-মিন্স উদাহরণ অন্তর্ভুক্ত ছিল, যেমন এই [আইরিস বিশ্লেষণ](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), এই [পরিচিতিমূলক নোটবুক](https://www.kaggle.com/prashant111/k-means-clustering-with-python), এবং এই [কাল্পনিক এনজিও উদাহরণ](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering)।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/1-Introduction-to-NLP/README.md b/translations/bn/6-NLP/1-Introduction-to-NLP/README.md
new file mode 100644
index 000000000..7c7b74238
--- /dev/null
+++ b/translations/bn/6-NLP/1-Introduction-to-NLP/README.md
@@ -0,0 +1,179 @@
+
+# প্রাকৃতিক ভাষা প্রক্রিয়াকরণে পরিচিতি
+
+এই পাঠে *প্রাকৃতিক ভাষা প্রক্রিয়াকরণ* (NLP), যা *কম্পিউটেশনাল লিঙ্গুইস্টিকস* এর একটি শাখা, এর সংক্ষিপ্ত ইতিহাস এবং গুরুত্বপূর্ণ ধারণাগুলি আলোচনা করা হয়েছে।
+
+## [পাঠের পূর্ববর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/31/)
+
+## পরিচিতি
+
+NLP, যা সাধারণত পরিচিত, মেশিন লার্নিং প্রয়োগ এবং প্রোডাকশন সফটওয়্যারে ব্যবহৃত সবচেয়ে পরিচিত ক্ষেত্রগুলির মধ্যে একটি।
+
+✅ আপনি কি এমন কোনো সফটওয়্যারের কথা ভাবতে পারেন যা আপনি প্রতিদিন ব্যবহার করেন এবং যেখানে সম্ভবত কিছু NLP অন্তর্ভুক্ত রয়েছে? আপনার ওয়ার্ড প্রসেসিং প্রোগ্রাম বা মোবাইল অ্যাপ্লিকেশনগুলির কথা ভাবুন যা আপনি নিয়মিত ব্যবহার করেন।
+
+আপনি শিখবেন:
+
+- **ভাষার ধারণা**। ভাষাগুলি কীভাবে বিকশিত হয়েছে এবং অধ্যয়নের প্রধান ক্ষেত্রগুলি কী ছিল।
+- **সংজ্ঞা এবং ধারণা**। আপনি শিখবেন কীভাবে কম্পিউটার টেক্সট প্রক্রিয়া করে, যেমন পার্সিং, ব্যাকরণ, এবং বিশেষ্য ও ক্রিয়াপদ চিহ্নিত করা। এই পাঠে কিছু কোডিং কাজ রয়েছে এবং বেশ কয়েকটি গুরুত্বপূর্ণ ধারণা উপস্থাপন করা হয়েছে যা আপনি পরবর্তী পাঠে কোড করতে শিখবেন।
+
+## কম্পিউটেশনাল লিঙ্গুইস্টিকস
+
+কম্পিউটেশনাল লিঙ্গুইস্টিকস কয়েক দশকের গবেষণা এবং উন্নয়নের একটি ক্ষেত্র যা অধ্যয়ন করে কীভাবে কম্পিউটার ভাষার সাথে কাজ করতে পারে, এমনকি বুঝতে, অনুবাদ করতে এবং যোগাযোগ করতে পারে। প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (NLP) একটি সম্পর্কিত ক্ষেত্র যা কম্পিউটার কীভাবে 'প্রাকৃতিক', বা মানব, ভাষা প্রক্রিয়া করতে পারে তার উপর ফোকাস করে।
+
+### উদাহরণ - ফোন ডিক্টেশন
+
+আপনি যদি কখনো টাইপ করার পরিবর্তে আপনার ফোনে কথা বলে থাকেন বা ভার্চুয়াল অ্যাসিস্ট্যান্টকে কোনো প্রশ্ন জিজ্ঞাসা করে থাকেন, তবে আপনার বক্তব্যকে টেক্সটে রূপান্তরিত করা হয়েছে এবং তারপর প্রক্রিয়াকরণ বা *পার্সিং* করা হয়েছে। সনাক্ত করা কীওয়ার্ডগুলি এমন একটি ফরম্যাটে প্রক্রিয়াকৃত হয়েছে যা ফোন বা অ্যাসিস্ট্যান্ট বুঝতে এবং কার্যকর করতে পারে।
+
+
+> প্রকৃত ভাষাগত বোঝাপড়া কঠিন! ছবি: [Jen Looper](https://twitter.com/jenlooper)
+
+### এই প্রযুক্তি কীভাবে সম্ভব হয়েছে?
+
+এটি সম্ভব হয়েছে কারণ কেউ এই কাজটি করার জন্য একটি কম্পিউটার প্রোগ্রাম লিখেছেন। কয়েক দশক আগে, কিছু বিজ্ঞান কল্পকাহিনী লেখক ভবিষ্যদ্বাণী করেছিলেন যে মানুষ প্রধানত তাদের কম্পিউটারের সাথে কথা বলবে, এবং কম্পিউটার সবসময় তাদের অর্থ সঠিকভাবে বুঝতে পারবে। দুঃখজনকভাবে, এটি অনেকের কল্পনার চেয়ে কঠিন একটি সমস্যা হয়ে দাঁড়িয়েছে, এবং যদিও এটি আজ একটি অনেক ভালোভাবে বোঝা সমস্যা, বাক্যের অর্থ বোঝার ক্ষেত্রে 'নিখুঁত' প্রাকৃতিক ভাষা প্রক্রিয়াকরণ অর্জনে উল্লেখযোগ্য চ্যালেঞ্জ রয়েছে। বিশেষ করে রসিকতা বোঝা বা বাক্যে বিদ্রূপের মতো আবেগ সনাক্ত করা একটি বিশেষভাবে কঠিন সমস্যা।
+
+এখন আপনি হয়তো স্কুলের সেই ক্লাসগুলির কথা মনে করতে পারেন যেখানে শিক্ষক বাক্যের ব্যাকরণের অংশগুলি শেখাতেন। কিছু দেশে, শিক্ষার্থীদের ব্যাকরণ এবং ভাষাবিজ্ঞান একটি পৃথক বিষয় হিসাবে শেখানো হয়, তবে অনেক দেশে এই বিষয়গুলি ভাষা শেখার অংশ হিসাবে অন্তর্ভুক্ত থাকে: হয় প্রাথমিক বিদ্যালয়ে আপনার প্রথম ভাষা (পড়া এবং লেখা শেখা) এবং সম্ভবত মাধ্যমিক বা উচ্চ বিদ্যালয়ে একটি দ্বিতীয় ভাষা। যদি আপনি বিশেষ্য এবং ক্রিয়াপদ বা ক্রিয়া বিশেষণ এবং বিশেষণের মধ্যে পার্থক্য করতে বিশেষজ্ঞ না হন তবে চিন্তা করবেন না!
+
+যদি আপনি *সাধারণ বর্তমান* এবং *বর্তমান প্রগতিশীল* এর মধ্যে পার্থক্য নিয়ে লড়াই করেন, তবে আপনি একা নন। এটি অনেকের জন্য একটি চ্যালেঞ্জিং বিষয়, এমনকি একটি ভাষার স্থানীয় বক্তাদের জন্যও। ভালো খবর হল কম্পিউটার আনুষ্ঠানিক নিয়ম প্রয়োগ করতে খুবই দক্ষ, এবং আপনি কোড লিখতে শিখবেন যা একটি বাক্যকে মানুষের মতো *পার্স* করতে পারে। বৃহত্তর চ্যালেঞ্জ যা আপনি পরে পরীক্ষা করবেন তা হল একটি বাক্যের *অর্থ* এবং *ভাব* বোঝা।
+
+## প্রয়োজনীয়তা
+
+এই পাঠের জন্য প্রধান প্রয়োজনীয়তা হল এই পাঠের ভাষা পড়তে এবং বুঝতে সক্ষম হওয়া। এখানে কোনো গাণিতিক সমস্যা বা সমীকরণ সমাধান করতে হবে না। যদিও মূল লেখক এই পাঠটি ইংরেজিতে লিখেছেন, এটি অন্যান্য ভাষায়ও অনুবাদ করা হয়েছে, তাই আপনি হয়তো একটি অনুবাদ পড়ছেন। এমন কিছু উদাহরণ রয়েছে যেখানে বিভিন্ন ভাষার ব্যাকরণ নিয়ম তুলনা করার জন্য বিভিন্ন ভাষা ব্যবহার করা হয়েছে। এগুলি *অনুবাদ করা হয়নি*, তবে ব্যাখ্যামূলক পাঠ্য অনুবাদ করা হয়েছে, তাই অর্থটি পরিষ্কার হওয়া উচিত।
+
+কোডিং কাজগুলির জন্য, আপনি Python ব্যবহার করবেন এবং উদাহরণগুলি Python 3.8 ব্যবহার করে তৈরি করা হয়েছে।
+
+এই অংশে, আপনার প্রয়োজন হবে এবং ব্যবহার করবেন:
+
+- **Python 3 বোঝাপড়া**। Python 3 প্রোগ্রামিং ভাষার বোঝাপড়া, এই পাঠে ইনপুট, লুপ, ফাইল পড়া, অ্যারে ব্যবহার করা হয়েছে।
+- **Visual Studio Code + এক্সটেনশন**। আমরা Visual Studio Code এবং এর Python এক্সটেনশন ব্যবহার করব। আপনি আপনার পছন্দের অন্য কোনো Python IDE ব্যবহার করতে পারেন।
+- **TextBlob**। [TextBlob](https://github.com/sloria/TextBlob) হল Python-এর জন্য একটি সরলীকৃত টেক্সট প্রক্রিয়াকরণ লাইব্রেরি। এটি আপনার সিস্টেমে ইনস্টল করার জন্য TextBlob সাইটের নির্দেশাবলী অনুসরণ করুন (নিচে দেখানো হিসাবে corpora ইনস্টল করুন):
+
+ ```bash
+ pip install -U textblob
+ python -m textblob.download_corpora
+ ```
+
+> 💡 টিপ: আপনি সরাসরি VS Code পরিবেশে Python চালাতে পারেন। আরও তথ্যের জন্য [ডকুমেন্টেশন](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) দেখুন।
+
+## মেশিনের সাথে কথা বলা
+
+মানুষের ভাষা বোঝার জন্য কম্পিউটার তৈরি করার ইতিহাস কয়েক দশক পুরনো, এবং প্রাকৃতিক ভাষা প্রক্রিয়াকরণ নিয়ে চিন্তা করা প্রথম বিজ্ঞানীদের একজন ছিলেন *অ্যালান টুরিং*।
+
+### 'টুরিং টেস্ট'
+
+যখন টুরিং ১৯৫০-এর দশকে *কৃত্রিম বুদ্ধিমত্তা* নিয়ে গবেষণা করছিলেন, তখন তিনি বিবেচনা করেছিলেন যে একটি কথোপকথনমূলক পরীক্ষা একজন মানুষ এবং একটি কম্পিউটারের (টাইপ করা যোগাযোগের মাধ্যমে) দেওয়া যেতে পারে যেখানে কথোপকথনে থাকা মানুষটি নিশ্চিত হতে পারবে না যে তারা আরেকজন মানুষের সাথে কথা বলছে নাকি একটি কম্পিউটারের সাথে।
+
+যদি একটি নির্দিষ্ট সময়ের কথোপকথনের পরে, মানুষটি নির্ধারণ করতে না পারে যে উত্তরগুলি একটি কম্পিউটার থেকে এসেছে কিনা, তবে কি কম্পিউটারটিকে *চিন্তা করছে* বলা যেতে পারে?
+
+### অনুপ্রেরণা - 'দ্য ইমিটেশন গেম'
+
+এই ধারণাটি একটি পার্টি গেম *দ্য ইমিটেশন গেম* থেকে এসেছে যেখানে একজন প্রশ্নকর্তা একটি ঘরে একা থাকে এবং অন্য ঘরে থাকা দুই ব্যক্তির মধ্যে কে পুরুষ এবং কে মহিলা তা নির্ধারণ করার দায়িত্ব দেওয়া হয়। প্রশ্নকর্তা নোট পাঠাতে পারে এবং এমন প্রশ্ন ভাবতে হবে যেখানে লিখিত উত্তরগুলি রহস্যময় ব্যক্তির লিঙ্গ প্রকাশ করে। অবশ্যই, অন্য ঘরে থাকা খেলোয়াড়রা প্রশ্নকর্তাকে বিভ্রান্ত করার জন্য এমনভাবে উত্তর দেওয়ার চেষ্টা করে যাতে বিভ্রান্তি সৃষ্টি হয়, তবে একই সাথে সৎ উত্তর দেওয়ার ছাপ দেয়।
+
+### এলিজা তৈরি করা
+
+১৯৬০-এর দশকে MIT-এর একজন বিজ্ঞানী *জোসেফ ওয়েইজেনবাউম* [*এলিজা*](https://wikipedia.org/wiki/ELIZA) নামে একটি কম্পিউটার 'থেরাপিস্ট' তৈরি করেছিলেন যা মানুষের কাছে প্রশ্ন করত এবং তাদের উত্তর বোঝার ছাপ দিত। তবে, এলিজা একটি বাক্য পার্স করতে এবং নির্দিষ্ট ব্যাকরণগত গঠন এবং কীওয়ার্ড চিহ্নিত করতে পারলেও বাক্যটি *বোঝে* এমনটি বলা যায় না। উদাহরণস্বরূপ, যদি এলিজাকে "**আমি** দুঃখিত" ফরম্যাটের একটি বাক্য দেওয়া হয়, এটি বাক্যটি পুনর্বিন্যাস এবং শব্দ প্রতিস্থাপন করে "তুমি কতদিন ধরে **দুঃখিত**?" এই ধরনের উত্তর তৈরি করতে পারে।
+
+এটি এমন একটি ছাপ দিত যে এলিজা বিবৃতিটি বুঝতে পেরেছে এবং একটি অনুসরণমূলক প্রশ্ন করছে, যেখানে বাস্তবে এটি কেবল ক্রিয়ার কাল পরিবর্তন করছিল এবং কিছু শব্দ যোগ করছিল। যদি এলিজা এমন একটি কীওয়ার্ড চিহ্নিত করতে না পারে যার জন্য এটি একটি উত্তর তৈরি করতে পারে, তবে এটি পরিবর্তে একটি এলোমেলো উত্তর দিত যা অনেক ভিন্ন বিবৃতির জন্য প্রযোজ্য হতে পারে। উদাহরণস্বরূপ, যদি একজন ব্যবহারকারী লিখেন "**তুমি** একটি সাইকেল", এটি উত্তর দিতে পারে "আমি কতদিন ধরে **সাইকেল**?" পরিবর্তে একটি যুক্তিসঙ্গত উত্তর দেওয়ার।
+
+[](https://youtu.be/RMK9AphfLco "এলিজার সাথে চ্যাটিং")
+
+> 🎥 উপরের ছবিতে ক্লিক করে এলিজার আসল প্রোগ্রাম সম্পর্কে একটি ভিডিও দেখুন
+
+> নোট: আপনি যদি ACM অ্যাকাউন্ট রাখেন তবে ১৯৬৬ সালে প্রকাশিত [এলিজার](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) আসল বিবরণ পড়তে পারেন। বিকল্পভাবে, এলিজা সম্পর্কে [উইকিপিডিয়ায়](https://wikipedia.org/wiki/ELIZA) পড়ুন।
+
+## অনুশীলন - একটি মৌলিক কথোপকথনমূলক বট কোডিং
+
+একটি কথোপকথনমূলক বট, যেমন এলিজা, একটি প্রোগ্রাম যা ব্যবহারকারীর ইনপুট গ্রহণ করে এবং বুদ্ধিমত্তার সাথে উত্তর দেওয়ার ছাপ দেয়। এলিজার মতো নয়, আমাদের বটের একাধিক নিয়ম থাকবে না যা এটিকে একটি বুদ্ধিমান কথোপকথনের ছাপ দেয়। পরিবর্তে, আমাদের বটের একটি মাত্র ক্ষমতা থাকবে, এলোমেলো উত্তর দিয়ে কথোপকথন চালিয়ে যাওয়া যা প্রায় যেকোনো সাধারণ কথোপকথনে কাজ করতে পারে।
+
+### পরিকল্পনা
+
+একটি কথোপকথনমূলক বট তৈরি করার ধাপসমূহ:
+
+1. ব্যবহারকারীকে বটের সাথে কীভাবে যোগাযোগ করতে হবে তা নির্দেশনা প্রিন্ট করুন
+2. একটি লুপ শুরু করুন
+ 1. ব্যবহারকারীর ইনপুট গ্রহণ করুন
+ 2. যদি ব্যবহারকারী প্রস্থান করতে চায়, তবে প্রস্থান করুন
+ 3. ব্যবহারকারীর ইনপুট প্রক্রিয়াকরণ করুন এবং উত্তর নির্ধারণ করুন (এই ক্ষেত্রে, উত্তরটি সম্ভাব্য সাধারণ উত্তরগুলির একটি এলোমেলো পছন্দ)
+ 4. উত্তর প্রিন্ট করুন
+3. ধাপ ২-এ ফিরে যান
+
+### বট তৈরি করা
+
+এখন বট তৈরি করা যাক। আমরা কিছু বাক্যাংশ সংজ্ঞায়িত করে শুরু করব।
+
+1. নিম্নলিখিত এলোমেলো উত্তর দিয়ে Python-এ নিজেই এই বটটি তৈরি করুন:
+
+ ```python
+ random_responses = ["That is quite interesting, please tell me more.",
+ "I see. Do go on.",
+ "Why do you say that?",
+ "Funny weather we've been having, isn't it?",
+ "Let's change the subject.",
+ "Did you catch the game last night?"]
+ ```
+
+ এখানে কিছু নমুনা আউটপুট দেওয়া হয়েছে যা আপনাকে গাইড করবে (ব্যবহারকারীর ইনপুট `>` দিয়ে শুরু হওয়া লাইনে):
+
+ ```output
+ Hello, I am Marvin, the simple robot.
+ You can end this conversation at any time by typing 'bye'
+ After typing each answer, press 'enter'
+ How are you today?
+ > I am good thanks
+ That is quite interesting, please tell me more.
+ > today I went for a walk
+ Did you catch the game last night?
+ > I did, but my team lost
+ Funny weather we've been having, isn't it?
+ > yes but I hope next week is better
+ Let's change the subject.
+ > ok, lets talk about music
+ Why do you say that?
+ > because I like music!
+ Why do you say that?
+ > bye
+ It was nice talking to you, goodbye!
+ ```
+
+ এই কাজের একটি সম্ভাব্য সমাধান [এখানে](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py) পাওয়া যাবে।
+
+ ✅ থামুন এবং বিবেচনা করুন
+
+ 1. আপনি কি মনে করেন এলোমেলো উত্তরগুলি কাউকে 'প্রতারণা' করতে পারে যাতে মনে হয় বটটি আসলে তাদের বুঝতে পারছে?
+ 2. বটটিকে আরও কার্যকর করতে কী বৈশিষ্ট্য প্রয়োজন হবে?
+ 3. যদি একটি বট সত্যিই একটি বাক্যের অর্থ 'বোঝে', তবে কি এটি কথোপকথনে আগের বাক্যগুলির অর্থ 'মনে রাখতে' হবে?
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+উপরের "থামুন এবং বিবেচনা করুন" উপাদানগুলির মধ্যে একটি বেছে নিন এবং হয় কোডে এটি বাস্তবায়নের চেষ্টা করুন অথবা ছদ্ম-কোড ব্যবহার করে কাগজে একটি সমাধান লিখুন।
+
+পরবর্তী পাঠে, আপনি প্রাকৃতিক ভাষা পার্সিং এবং মেশিন লার্নিংয়ের অন্যান্য পদ্ধতি সম্পর্কে শিখবেন।
+
+## [পাঠ-পরবর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/32/)
+
+## পর্যালোচনা এবং স্ব-অধ্যয়ন
+
+নিচের রেফারেন্সগুলি আরও পড়ার সুযোগ হিসেবে দেখুন।
+
+### রেফারেন্স
+
+1. শুবার্ট, লেনহার্ট, "কম্পিউটেশনাল লিঙ্গুইস্টিকস", *দ্য স্ট্যানফোর্ড এনসাইক্লোপিডিয়া অফ ফিলোসফি* (স্প্রিং ২০২০ সংস্করণ), এডওয়ার্ড এন. জাল্টা (সম্পাদক), URL = ।
+2. প্রিন্সটন ইউনিভার্সিটি "ওয়ার্ডনেট সম্পর্কে।" [ওয়ার্ডনেট](https://wordnet.princeton.edu/)। প্রিন্সটন ইউনিভার্সিটি। ২০১০।
+
+## অ্যাসাইনমেন্ট
+
+[একটি বট খুঁজুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিক অনুবাদের চেষ্টা করি, তবে দয়া করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/1-Introduction-to-NLP/assignment.md b/translations/bn/6-NLP/1-Introduction-to-NLP/assignment.md
new file mode 100644
index 000000000..4964a14f9
--- /dev/null
+++ b/translations/bn/6-NLP/1-Introduction-to-NLP/assignment.md
@@ -0,0 +1,25 @@
+
+# একটি বট খুঁজুন
+
+## নির্দেশনা
+
+বট সর্বত্রই রয়েছে। আপনার কাজ: একটি বট খুঁজুন এবং সেটিকে গ্রহণ করুন! আপনি এগুলো ওয়েব সাইটে, ব্যাংকিং অ্যাপ্লিকেশনে, এবং ফোনে খুঁজে পেতে পারেন, যেমন যখন আপনি আর্থিক সেবা কোম্পানিগুলোর সাথে পরামর্শ বা অ্যাকাউন্ট তথ্যের জন্য যোগাযোগ করেন। বটটি বিশ্লেষণ করুন এবং দেখুন আপনি এটিকে বিভ্রান্ত করতে পারেন কিনা। যদি আপনি বটটিকে বিভ্রান্ত করতে পারেন, তাহলে কেন তা ঘটেছে বলে আপনি মনে করেন? আপনার অভিজ্ঞতা নিয়ে একটি সংক্ষিপ্ত প্রতিবেদন লিখুন।
+
+## মূল্যায়ন
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------- |
+| | একটি পূর্ণ পৃষ্ঠার প্রতিবেদন লেখা হয়েছে, যেখানে অনুমিত বটের স্থাপত্য ব্যাখ্যা করা হয়েছে এবং আপনার অভিজ্ঞতা তুলে ধরা হয়েছে | প্রতিবেদন অসম্পূর্ণ বা যথাযথভাবে গবেষণা করা হয়নি | কোনো প্রতিবেদন জমা দেওয়া হয়নি |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/2-Tasks/README.md b/translations/bn/6-NLP/2-Tasks/README.md
new file mode 100644
index 000000000..62b2f3aab
--- /dev/null
+++ b/translations/bn/6-NLP/2-Tasks/README.md
@@ -0,0 +1,228 @@
+
+# সাধারণ প্রাকৃতিক ভাষা প্রক্রিয়াকরণ কাজ এবং কৌশল
+
+বেশিরভাগ *প্রাকৃতিক ভাষা প্রক্রিয়াকরণ* কাজের জন্য, প্রক্রিয়াকরণের জন্য পাঠ্যটি ভেঙে বিশ্লেষণ করতে হয় এবং ফলাফল সংরক্ষণ বা নিয়ম এবং ডেটাসেটের সাথে ক্রস রেফারেন্স করতে হয়। এই কাজগুলো প্রোগ্রামারকে পাঠ্যের মধ্যে শব্দ এবং শব্দের _অর্থ_, _উদ্দেশ্য_ বা শুধুমাত্র _ঘনত্ব_ নির্ধারণ করতে সাহায্য করে।
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/33/)
+
+চলুন পাঠ্য প্রক্রিয়াকরণের সাধারণ কৌশলগুলি আবিষ্কার করি। মেশিন লার্নিংয়ের সাথে মিলিত হয়ে, এই কৌশলগুলি আপনাকে বড় পরিমাণে পাঠ্য দক্ষতার সাথে বিশ্লেষণ করতে সাহায্য করে। তবে, এই কাজগুলিতে মেশিন লার্নিং প্রয়োগ করার আগে, একজন NLP বিশেষজ্ঞের সম্মুখীন হওয়া সমস্যাগুলি বুঝতে হবে।
+
+## NLP-তে সাধারণ কাজ
+
+আপনি যে পাঠ্যের উপর কাজ করছেন তা বিশ্লেষণ করার বিভিন্ন উপায় রয়েছে। কিছু নির্দিষ্ট কাজ সম্পাদন করে আপনি পাঠ্যটি বুঝতে এবং সিদ্ধান্ত নিতে সক্ষম হন। সাধারণত এই কাজগুলো একটি নির্দিষ্ট ক্রমে সম্পাদিত হয়।
+
+### টোকেনাইজেশন
+
+সম্ভবত প্রথম কাজ যা বেশিরভাগ NLP অ্যালগরিদমকে করতে হয় তা হলো পাঠ্যকে টোকেন বা শব্দে বিভক্ত করা। যদিও এটি সহজ মনে হয়, বিরামচিহ্ন এবং বিভিন্ন ভাষার শব্দ এবং বাক্য বিভাজনকারীদের হিসাব করতে হয়, যা এটি জটিল করে তুলতে পারে। আপনাকে বিভাজন নির্ধারণের জন্য বিভিন্ন পদ্ধতি ব্যবহার করতে হতে পারে।
+
+
+> **Pride and Prejudice** থেকে একটি বাক্য টোকেনাইজ করা। ইনফোগ্রাফিক: [Jen Looper](https://twitter.com/jenlooper)
+
+### এমবেডিংস
+
+[ওয়ার্ড এমবেডিংস](https://wikipedia.org/wiki/Word_embedding) হলো আপনার পাঠ্য ডেটাকে সংখ্যায় রূপান্তর করার একটি উপায়। এমবেডিংস এমনভাবে করা হয় যাতে একই অর্থের বা একসাথে ব্যবহৃত শব্দগুলো একসাথে ক্লাস্টার করে।
+
+
+> "I have the highest respect for your nerves, they are my old friends." - **Pride and Prejudice** থেকে একটি বাক্যের জন্য ওয়ার্ড এমবেডিংস। ইনফোগ্রাফিক: [Jen Looper](https://twitter.com/jenlooper)
+
+✅ [এই আকর্ষণীয় টুলটি](https://projector.tensorflow.org/) ব্যবহার করে ওয়ার্ড এমবেডিংস নিয়ে পরীক্ষা করুন। একটি শব্দে ক্লিক করলে একই ধরনের শব্দের ক্লাস্টার দেখায়: 'toy' ক্লাস্টার করে 'disney', 'lego', 'playstation', এবং 'console' এর সাথে।
+
+### পার্সিং এবং পার্ট-অফ-স্পিচ ট্যাগিং
+
+প্রতিটি টোকেনাইজ করা শব্দকে পার্ট-অফ-স্পিচ হিসেবে ট্যাগ করা যায় - যেমন নাউন, ভার্ব, বা অ্যাডজেকটিভ। বাক্য `the quick red fox jumped over the lazy brown dog` এর POS ট্যাগ হতে পারে fox = noun, jumped = verb।
+
+
+
+> **Pride and Prejudice** থেকে একটি বাক্য পার্স করা। ইনফোগ্রাফিক: [Jen Looper](https://twitter.com/jenlooper)
+
+পার্সিং হলো একটি বাক্যে কোন শব্দগুলো একে অপরের সাথে সম্পর্কিত তা চিহ্নিত করা - যেমন `the quick red fox jumped` হলো একটি adjective-noun-verb সিকোয়েন্স যা `lazy brown dog` সিকোয়েন্স থেকে আলাদা।
+
+### শব্দ এবং বাক্যাংশের ঘনত্ব
+
+বড় পরিমাণে পাঠ্য বিশ্লেষণ করার সময় একটি দরকারী পদ্ধতি হলো প্রতিটি শব্দ বা আগ্রহের বাক্যাংশের একটি ডিকশনারি তৈরি করা এবং এটি কতবার উপস্থিত হয়েছে তা গণনা করা। বাক্য `the quick red fox jumped over the lazy brown dog` এ `the` শব্দটির ঘনত্ব ২।
+
+চলুন একটি উদাহরণ পাঠ্য দেখি যেখানে আমরা শব্দের ঘনত্ব গণনা করি। রুডইয়ার্ড কিপলিং-এর কবিতা **The Winners** এর একটি অংশ:
+
+```output
+What the moral? Who rides may read.
+When the night is thick and the tracks are blind
+A friend at a pinch is a friend, indeed,
+But a fool to wait for the laggard behind.
+Down to Gehenna or up to the Throne,
+He travels the fastest who travels alone.
+```
+
+যেহেতু বাক্যাংশের ঘনত্ব প্রয়োজন অনুযায়ী কেস সেনসিটিভ বা কেস ইনসেনসিটিভ হতে পারে, তাই `a friend` বাক্যাংশের ঘনত্ব ২ এবং `the` এর ঘনত্ব ৬, এবং `travels` এর ঘনত্ব ২।
+
+### এন-গ্রাম
+
+একটি পাঠ্যকে নির্দিষ্ট দৈর্ঘ্যের শব্দের সিকোয়েন্সে বিভক্ত করা যায়, যেমন একক শব্দ (ইউনিগ্রাম), দুই শব্দ (বাইগ্রাম), তিন শব্দ (ট্রাইগ্রাম) বা যেকোনো সংখ্যক শব্দ (এন-গ্রাম)।
+
+উদাহরণস্বরূপ, `the quick red fox jumped over the lazy brown dog` বাক্যটি ২ এন-গ্রামের স্কোর দিয়ে নিম্নলিখিত এন-গ্রাম তৈরি করে:
+
+1. the quick
+2. quick red
+3. red fox
+4. fox jumped
+5. jumped over
+6. over the
+7. the lazy
+8. lazy brown
+9. brown dog
+
+এটি একটি স্লাইডিং বক্সের মতো বাক্যের উপর কল্পনা করা সহজ হতে পারে। এখানে এটি ৩ শব্দের এন-গ্রামের জন্য দেখানো হয়েছে, প্রতিটি বাক্যে এন-গ্রামটি **বোল্ড**:
+
+1. **the quick red** fox jumped over the lazy brown dog
+2. the **quick red fox** jumped over the lazy brown dog
+3. the quick **red fox jumped** over the lazy brown dog
+4. the quick red **fox jumped over** the lazy brown dog
+5. the quick red fox **jumped over the** lazy brown dog
+6. the quick red fox jumped **over the lazy** brown dog
+7. the quick red fox jumped over **the lazy brown** dog
+8. the quick red fox jumped over the **lazy brown dog**
+
+
+
+> ৩ এন-গ্রামের মান: ইনফোগ্রাফিক: [Jen Looper](https://twitter.com/jenlooper)
+
+### নাউন বাক্যাংশ নির্যাস
+
+বেশিরভাগ বাক্যে একটি নাউন থাকে যা বাক্যের বিষয় বা বস্তু। ইংরেজিতে এটি প্রায়শই `a`, `an`, বা `the` দ্বারা চিহ্নিত করা যায়। বাক্যের অর্থ বোঝার চেষ্টা করার সময় `নাউন বাক্যাংশ নির্যাস` একটি সাধারণ NLP কাজ।
+
+✅ বাক্যে "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun." আপনি কি নাউন বাক্যাংশগুলো চিহ্নিত করতে পারেন?
+
+বাক্য `the quick red fox jumped over the lazy brown dog` এ ২টি নাউন বাক্যাংশ রয়েছে: **quick red fox** এবং **lazy brown dog**।
+
+### অনুভূতি বিশ্লেষণ
+
+একটি বাক্য বা পাঠ্য *ইতিবাচক* বা *নেতিবাচক* কতটা তা বিশ্লেষণ করা যায়। অনুভূতি *পোলারিটি* এবং *অবজেক্টিভিটি/সাবজেক্টিভিটি* দ্বারা পরিমাপ করা হয়। পোলারিটি -1.0 থেকে 1.0 (নেতিবাচক থেকে ইতিবাচক) এবং 0.0 থেকে 1.0 (সবচেয়ে অবজেক্টিভ থেকে সবচেয়ে সাবজেক্টিভ) দ্বারা পরিমাপ করা হয়।
+
+✅ পরে আপনি শিখবেন যে মেশিন লার্নিং ব্যবহার করে অনুভূতি নির্ধারণের বিভিন্ন উপায় রয়েছে, তবে একটি উপায় হলো মানুষের বিশেষজ্ঞ দ্বারা ইতিবাচক বা নেতিবাচক হিসেবে শ্রেণীবদ্ধ শব্দ এবং বাক্যাংশের একটি তালিকা থাকা এবং সেই মডেলটি পাঠ্যে প্রয়োগ করে একটি পোলারিটি স্কোর গণনা করা। আপনি কি দেখতে পাচ্ছেন এটি কিছু পরিস্থিতিতে কীভাবে কাজ করবে এবং অন্য কিছুতে কম কার্যকর হবে?
+
+### ইনফ্লেকশন
+
+ইনফ্লেকশন আপনাকে একটি শব্দের একবচন বা বহুবচন পেতে সক্ষম করে।
+
+### লেমাটাইজেশন
+
+একটি *লেমা* হলো একটি শব্দের মূল বা প্রধান শব্দ, যেমন *flew*, *flies*, *flying* এর লেমা হলো ক্রিয়া *fly*।
+
+এছাড়াও NLP গবেষকের জন্য কিছু দরকারী ডেটাবেস রয়েছে, বিশেষত:
+
+### ওয়ার্ডনেট
+
+[ওয়ার্ডনেট](https://wordnet.princeton.edu/) হলো বিভিন্ন ভাষার প্রতিটি শব্দের জন্য শব্দ, সমার্থক শব্দ, বিপরীত শব্দ এবং অন্যান্য অনেক বিশদ বিবরণের একটি ডেটাবেস। এটি অনুবাদ, বানান পরীক্ষক বা যেকোনো ধরনের ভাষা সরঞ্জাম তৈরি করার সময় অত্যন্ত কার্যকর।
+
+## NLP লাইব্রেরি
+
+সৌভাগ্যক্রমে, আপনাকে এই কৌশলগুলো নিজে তৈরি করতে হবে না, কারণ Python-এর চমৎকার লাইব্রেরিগুলো রয়েছে যা প্রাকৃতিক ভাষা প্রক্রিয়াকরণ বা মেশিন লার্নিংয়ে বিশেষজ্ঞ নয় এমন ডেভেলপারদের জন্য এটি আরও সহজলভ্য করে তোলে। পরবর্তী পাঠগুলোতে এর আরও উদাহরণ থাকবে, তবে এখানে আপনি কিছু দরকারী উদাহরণ শিখবেন যা আপনাকে পরবর্তী কাজে সাহায্য করবে।
+
+### অনুশীলন - `TextBlob` লাইব্রেরি ব্যবহার করা
+
+চলুন TextBlob নামক একটি লাইব্রেরি ব্যবহার করি কারণ এটি এই ধরনের কাজ মোকাবেলার জন্য সহায়ক API সরবরাহ করে। TextBlob "[NLTK](https://nltk.org) এবং [pattern](https://github.com/clips/pattern) এর উপর ভিত্তি করে তৈরি হয়েছে এবং উভয়ের সাথে সুন্দরভাবে কাজ করে।" এর API-তে উল্লেখযোগ্য পরিমাণে মেশিন লার্নিং অন্তর্ভুক্ত রয়েছে।
+
+> নোট: TextBlob-এর একটি দরকারী [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) গাইড রয়েছে যা অভিজ্ঞ Python ডেভেলপারদের জন্য সুপারিশ করা হয়।
+
+নাউন বাক্যাংশ চিহ্নিত করার চেষ্টা করার সময়, TextBlob নাউন বাক্যাংশ খুঁজে বের করার জন্য বিভিন্ন এক্সট্রাক্টর অফার করে।
+
+1. `ConllExtractor` দেখুন।
+
+ ```python
+ from textblob import TextBlob
+ from textblob.np_extractors import ConllExtractor
+ # import and create a Conll extractor to use later
+ extractor = ConllExtractor()
+
+ # later when you need a noun phrase extractor:
+ user_input = input("> ")
+ user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified
+ np = user_input_blob.noun_phrases
+ ```
+
+ > এখানে কী ঘটছে? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) হলো "একটি নাউন বাক্যাংশ এক্সট্রাক্টর যা ConLL-2000 প্রশিক্ষণ কর্পাস দিয়ে প্রশিক্ষিত চাঙ্ক পার্সিং ব্যবহার করে।" ConLL-2000 হলো Computational Natural Language Learning-এর ২০০০ সালের সম্মেলন। প্রতি বছর সম্মেলন একটি কঠিন NLP সমস্যার সমাধান করার জন্য একটি কর্মশালা আয়োজন করত, এবং ২০০০ সালে এটি ছিল নাউন চাঙ্কিং। একটি মডেল Wall Street Journal-এ প্রশিক্ষিত হয়েছিল, "sections 15-18 প্রশিক্ষণ ডেটা (211727 টোকেন) এবং section 20 পরীক্ষার ডেটা (47377 টোকেন)" হিসেবে। আপনি ব্যবহৃত পদ্ধতিগুলো [এখানে](https://www.clips.uantwerpen.be/conll2000/chunking/) এবং [ফলাফল](https://ifarm.nl/erikt/research/np-chunking.html) দেখতে পারেন।
+
+### চ্যালেঞ্জ - NLP দিয়ে আপনার বট উন্নত করা
+
+পূর্ববর্তী পাঠে আপনি একটি খুব সাধারণ Q&A বট তৈরি করেছিলেন। এখন, আপনি মারভিনকে আরও সহানুভূতিশীল করে তুলবেন আপনার ইনপুট বিশ্লেষণ করে এবং সেই অনুযায়ী একটি প্রতিক্রিয়া মুদ্রণ করে। আপনাকে একটি `noun_phrase` চিহ্নিত করতে হবে এবং সেই বিষয়ে আরও ইনপুট চাইতে হবে।
+
+আপনার বটকে আরও ভালোভাবে কথোপকথন করতে তৈরি করার ধাপগুলো:
+
+1. ব্যবহারকারীকে বটের সাথে কীভাবে যোগাযোগ করতে হবে তা নির্দেশনা মুদ্রণ করুন
+2. লুপ শুরু করুন
+ 1. ব্যবহারকারীর ইনপুট গ্রহণ করুন
+ 2. যদি ব্যবহারকারী প্রস্থান করতে চায়, তাহলে প্রস্থান করুন
+ 3. ব্যবহারকারীর ইনপুট প্রক্রিয়াকরণ করুন এবং উপযুক্ত অনুভূতি প্রতিক্রিয়া নির্ধারণ করুন
+ 4. যদি একটি নাউন বাক্যাংশ অনুভূতিতে সনাক্ত হয়, তাহলে এটি বহুবচন করুন এবং সেই বিষয়ে আরও ইনপুট চাইতে বলুন
+ 5. প্রতিক্রিয়া মুদ্রণ করুন
+3. ধাপ ২-এ ফিরে যান
+
+TextBlob ব্যবহার করে অনুভূতি নির্ধারণের জন্য কোড স্নিপেট এখানে রয়েছে। লক্ষ্য করুন যে শুধুমাত্র চারটি *গ্রেডিয়েন্ট* অনুভূতি প্রতিক্রিয়ার রয়েছে (আপনি চাইলে আরও যোগ করতে পারেন):
+
+```python
+if user_input_blob.polarity <= -0.5:
+ response = "Oh dear, that sounds bad. "
+elif user_input_blob.polarity <= 0:
+ response = "Hmm, that's not great. "
+elif user_input_blob.polarity <= 0.5:
+ response = "Well, that sounds positive. "
+elif user_input_blob.polarity <= 1:
+ response = "Wow, that sounds great. "
+```
+
+নিম্নলিখিত নমুনা আউটপুটটি আপনাকে গাইড করবে (ব্যবহারকারীর ইনপুট > দিয়ে শুরু হওয়া লাইনে):
+
+```output
+Hello, I am Marvin, the friendly robot.
+You can end this conversation at any time by typing 'bye'
+After typing each answer, press 'enter'
+How are you today?
+> I am ok
+Well, that sounds positive. Can you tell me more?
+> I went for a walk and saw a lovely cat
+Well, that sounds positive. Can you tell me more about lovely cats?
+> cats are the best. But I also have a cool dog
+Wow, that sounds great. Can you tell me more about cool dogs?
+> I have an old hounddog but he is sick
+Hmm, that's not great. Can you tell me more about old hounddogs?
+> bye
+It was nice talking to you, goodbye!
+```
+
+এই কাজের একটি সম্ভাব্য সমাধান [এখানে](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py)
+
+✅ জ্ঞান যাচাই
+
+1. আপনি কি মনে করেন সহানুভূতিশীল প্রতিক্রিয়াগুলো কাউকে 'প্রতারণা' করতে পারে যাতে তারা মনে করে যে বটটি তাদের আসলেই বুঝেছে?
+2. নাউন বাক্যাংশ চিহ্নিত করা কি বটকে আরও 'বিশ্বাসযোগ্য' করে তোলে?
+3. কেন একটি বাক্য থেকে 'নাউন বাক্যাংশ' বের করা একটি দরকারী কাজ হতে পারে?
+
+---
+
+পূর্ববর্তী জ্ঞান যাচাইয়ের বটটি বাস্তবায়ন করুন এবং এটি আপনার বন্ধুর উপর পরীক্ষা করুন। এটি কি তাদের প্রতারণা করতে পারে? আপনি কি আপনার বটকে আরও 'বিশ্বাসযোগ্য' করতে পারেন?
+
+## 🚀চ্যালেঞ্জ
+
+পূর্ববর্তী জ্ঞান যাচাইয়ের একটি কাজ নিন এবং এটি বাস্তবায়ন করার চেষ্টা করুন। বটটি আপনার বন্ধুর উপর পরীক্ষা করুন। এটি কি তাদের প্রতারণা করতে পারে? আপনি কি আপনার বটকে আরও 'বিশ্বাসযোগ্য' করতে পারেন?
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/34/)
+
+## পর্যালোচনা এবং স্ব-অধ্যয়ন
+
+পরবর্তী কয়েকটি পাঠে আপনি অনুভূতি বিশ্লেষণ সম্পর্কে আরও শিখবেন। [KDNuggets](https://www.kdnuggets.com/tag/nlp)-এর মতো প্রবন্ধে এই আকর্ষণীয় কৌশলটি গবেষণা করুন।
+
+## অ্যাসাইনমেন্ট
+
+[বটকে কথা বলাতে শেখান](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়বদ্ধ নই।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/2-Tasks/assignment.md b/translations/bn/6-NLP/2-Tasks/assignment.md
new file mode 100644
index 000000000..09983f7f6
--- /dev/null
+++ b/translations/bn/6-NLP/2-Tasks/assignment.md
@@ -0,0 +1,25 @@
+
+# একটি বটকে কথা বলানো
+
+## নির্দেশাবলী
+
+গত কয়েকটি পাঠে, আপনি একটি সাধারণ বট প্রোগ্রাম করেছেন যার সাথে চ্যাট করা যায়। এই বট এলোমেলো উত্তর দেয় যতক্ষণ না আপনি 'বিদায়' বলেন। আপনি কি উত্তরগুলোকে একটু কম এলোমেলো করতে পারেন এবং নির্দিষ্ট কিছু বললে, যেমন 'কেন' বা 'কিভাবে', সেই অনুযায়ী উত্তর দিতে পারেন? ভাবুন, মেশিন লার্নিং কীভাবে এই ধরনের কাজকে কম ম্যানুয়াল করতে পারে যখন আপনি আপনার বটকে আরও উন্নত করেন। আপনার কাজ সহজ করতে আপনি NLTK বা TextBlob লাইব্রেরি ব্যবহার করতে পারেন।
+
+## মূল্যায়ন
+
+| মানদণ্ড | চমৎকার | যথেষ্ট | উন্নতির প্রয়োজন |
+| -------- | --------------------------------------------- | ------------------------------------------------ | ----------------------- |
+| | একটি নতুন bot.py ফাইল উপস্থাপন করা হয়েছে এবং ডকুমেন্ট করা হয়েছে | একটি নতুন বট ফাইল উপস্থাপন করা হয়েছে কিন্তু এতে বাগ রয়েছে | কোনো ফাইল উপস্থাপন করা হয়নি |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/3-Translation-Sentiment/README.md b/translations/bn/6-NLP/3-Translation-Sentiment/README.md
new file mode 100644
index 000000000..6da8b3004
--- /dev/null
+++ b/translations/bn/6-NLP/3-Translation-Sentiment/README.md
@@ -0,0 +1,200 @@
+
+# মেশিন লার্নিং দিয়ে অনুবাদ এবং অনুভূতি বিশ্লেষণ
+
+পূর্ববর্তী পাঠে আপনি `TextBlob` ব্যবহার করে একটি সাধারণ বট তৈরি করতে শিখেছেন, যা একটি লাইব্রেরি যা মৌলিক NLP কাজ যেমন noun phrase extraction সম্পাদন করতে পর্দার আড়ালে মেশিন লার্নিং ব্যবহার করে। কম্পিউটেশনাল ভাষাতত্ত্বের আরেকটি গুরুত্বপূর্ণ চ্যালেঞ্জ হলো একটি ভাষা থেকে অন্য ভাষায় সঠিকভাবে _অনুবাদ_ করা।
+
+## [পূর্ব-পাঠ কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/35/)
+
+অনুবাদ একটি অত্যন্ত কঠিন সমস্যা, কারণ পৃথিবীতে হাজার হাজার ভাষা রয়েছে এবং প্রতিটির ব্যাকরণ নিয়ম ভিন্ন হতে পারে। একটি পদ্ধতি হলো একটি ভাষার (যেমন ইংরেজি) আনুষ্ঠানিক ব্যাকরণ নিয়মকে একটি ভাষা-নিরপেক্ষ কাঠামোতে রূপান্তর করা এবং তারপর অন্য ভাষায় রূপান্তর করা। এই পদ্ধতিতে নিম্নলিখিত ধাপগুলো সম্পন্ন করতে হয়:
+
+1. **সনাক্তকরণ**। ইনপুট ভাষার শব্দগুলোকে noun, verb ইত্যাদি হিসেবে চিহ্নিত বা ট্যাগ করা।
+2. **অনুবাদ তৈরি করা**। লক্ষ্য ভাষার ফরম্যাটে প্রতিটি শব্দের সরাসরি অনুবাদ তৈরি করা।
+
+### উদাহরণ বাক্য, ইংরেজি থেকে আইরিশ
+
+ইংরেজি ভাষায়, বাক্য _I feel happy_ তিনটি শব্দ নিয়ে গঠিত এবং এর ক্রম হলো:
+
+- **subject** (I)
+- **verb** (feel)
+- **adjective** (happy)
+
+তবে, আইরিশ ভাষায় একই বাক্যের ব্যাকরণ কাঠামো সম্পূর্ণ ভিন্ন - "*happy*" বা "*sad*" এর মতো আবেগগুলোকে *upon* (উপর) হিসেবে প্রকাশ করা হয়।
+
+ইংরেজি বাক্য `I feel happy` আইরিশ ভাষায় হবে `Tá athas orm`। একটি *শব্দগত* অনুবাদ হবে `Happy is upon me`।
+
+একজন আইরিশ ভাষাভাষী ইংরেজিতে অনুবাদ করলে বলবে `I feel happy`, `Happy is upon me` নয়, কারণ তারা বাক্যের অর্থ বুঝতে পারে, যদিও শব্দ এবং বাক্য কাঠামো ভিন্ন।
+
+আইরিশ ভাষায় বাক্যের আনুষ্ঠানিক ক্রম হলো:
+
+- **verb** (Tá বা is)
+- **adjective** (athas বা happy)
+- **subject** (orm বা upon me)
+
+## অনুবাদ
+
+একটি সরল অনুবাদ প্রোগ্রাম শুধুমাত্র শব্দ অনুবাদ করতে পারে, বাক্য কাঠামো উপেক্ষা করে।
+
+✅ যদি আপনি একজন প্রাপ্তবয়স্ক হিসেবে দ্বিতীয় (বা তৃতীয় বা আরও বেশি) ভাষা শিখে থাকেন, তাহলে আপনি হয়তো আপনার মাতৃভাষায় চিন্তা করে, শব্দ ধরে ধরে দ্বিতীয় ভাষায় অনুবাদ করে এবং তারপর আপনার অনুবাদটি উচ্চারণ করে শুরু করেছিলেন। এটি সরল অনুবাদ কম্পিউটার প্রোগ্রামগুলোর কাজের মতো। সাবলীলতা অর্জনের জন্য এই পর্যায়টি অতিক্রম করা গুরুত্বপূর্ণ!
+
+সরল অনুবাদ খারাপ (এবং কখনও কখনও হাস্যকর) ভুল অনুবাদ তৈরি করে: `I feel happy` আইরিশ ভাষায় শব্দগতভাবে অনুবাদ করলে হয় `Mise bhraitheann athas`। এর অর্থ (শব্দগতভাবে) `me feel happy` এবং এটি একটি বৈধ আইরিশ বাক্য নয়। যদিও ইংরেজি এবং আইরিশ দুটি ভাষা দুটি কাছাকাছি দ্বীপে কথিত হয়, এগুলো খুবই ভিন্ন ভাষা এবং ব্যাকরণ কাঠামোও ভিন্ন।
+
+> আপনি আইরিশ ভাষার ঐতিহ্য সম্পর্কে কিছু ভিডিও দেখতে পারেন যেমন [এই ভিডিওটি](https://www.youtube.com/watch?v=mRIaLSdRMMs)
+
+### মেশিন লার্নিং পদ্ধতি
+
+এখন পর্যন্ত, আপনি প্রাকৃতিক ভাষা প্রক্রিয়াকরণের আনুষ্ঠানিক নিয়ম পদ্ধতি সম্পর্কে শিখেছেন। আরেকটি পদ্ধতি হলো শব্দের অর্থ উপেক্ষা করা এবং _মেশিন লার্নিং ব্যবহার করে প্যাটার্ন সনাক্ত করা_। যদি আপনার কাছে প্রচুর টেক্সট (একটি *corpus*) বা টেক্সটসমূহ (*corpora*) থাকে উত্স এবং লক্ষ্য ভাষায়, তাহলে এটি অনুবাদে কাজ করতে পারে।
+
+উদাহরণস্বরূপ, *Pride and Prejudice*, একটি বিখ্যাত ইংরেজি উপন্যাস যা ১৮১৩ সালে জেন অস্টেন লিখেছেন। যদি আপনি বইটি ইংরেজিতে এবং এর একটি মানব অনুবাদ *ফরাসি* ভাষায় পরামর্শ করেন, তাহলে আপনি একটিতে এমন বাক্যাংশ সনাক্ত করতে পারেন যা অন্যটিতে _idiomatically_ অনুবাদ করা হয়েছে। আপনি এটি কিছুক্ষণের মধ্যে করবেন।
+
+উদাহরণস্বরূপ, যখন একটি ইংরেজি বাক্যাংশ `I have no money` শব্দগতভাবে ফরাসি ভাষায় অনুবাদ করা হয়, এটি হতে পারে `Je n'ai pas de monnaie`। "Monnaie" একটি জটিল ফরাসি 'false cognate', কারণ 'money' এবং 'monnaie' সমার্থক নয়। একজন মানব অনুবাদক একটি ভালো অনুবাদ করতে পারে `Je n'ai pas d'argent`, কারণ এটি ভালোভাবে বোঝায় যে আপনার কোনো টাকা নেই (বরং 'loose change' যা 'monnaie' এর অর্থ)।
+
+
+
+> ছবি: [Jen Looper](https://twitter.com/jenlooper)
+
+যদি একটি ML মডেলের কাছে পর্যাপ্ত মানব অনুবাদ থাকে যার উপর ভিত্তি করে একটি মডেল তৈরি করা যায়, এটি পূর্বে উভয় ভাষার দক্ষ মানব বক্তাদের দ্বারা অনুবাদিত টেক্সটগুলোর সাধারণ প্যাটার্ন সনাক্ত করে অনুবাদের সঠিকতা উন্নত করতে পারে।
+
+### অনুশীলন - অনুবাদ
+
+আপনি `TextBlob` ব্যবহার করে বাক্য অনুবাদ করতে পারেন। **Pride and Prejudice** এর বিখ্যাত প্রথম লাইনটি চেষ্টা করুন:
+
+```python
+from textblob import TextBlob
+
+blob = TextBlob(
+ "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!"
+)
+print(blob.translate(to="fr"))
+
+```
+
+`TextBlob` অনুবাদটি বেশ ভালোভাবে করে: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!".
+
+এটি বলা যেতে পারে যে TextBlob এর অনুবাদটি ১৯৩২ সালে V. Leconte এবং Ch. Pressoir এর ফরাসি অনুবাদের চেয়ে অনেক বেশি সঠিক:
+
+"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles."
+
+এই ক্ষেত্রে, ML দ্বারা পরিচালিত অনুবাদটি মানব অনুবাদকের চেয়ে ভালো কাজ করেছে, যিনি অপ্রয়োজনীয়ভাবে মূল লেখকের বক্তব্যে অতিরিক্ত শব্দ যোগ করেছেন 'স্পষ্টতার' জন্য।
+
+> এখানে কী ঘটছে? এবং কেন TextBlob অনুবাদে এত ভালো? আসলে, এটি Google Translate ব্যবহার করছে, একটি উন্নত AI যা লক্ষ লক্ষ বাক্যাংশ বিশ্লেষণ করতে পারে এবং নির্দিষ্ট কাজের জন্য সেরা স্ট্রিংগুলি পূর্বাভাস দিতে পারে। এখানে কিছুই ম্যানুয়াল নয় এবং `blob.translate` ব্যবহার করতে আপনার ইন্টারনেট সংযোগ প্রয়োজন।
+
+✅ আরও কিছু বাক্য চেষ্টা করুন। কোনটি ভালো, ML না মানব অনুবাদ? কোন ক্ষেত্রে?
+
+## অনুভূতি বিশ্লেষণ
+
+মেশিন লার্নিং খুব ভালোভাবে কাজ করতে পারে এমন আরেকটি ক্ষেত্র হলো অনুভূতি বিশ্লেষণ। একটি non-ML পদ্ধতি হলো 'positive' এবং 'negative' শব্দ এবং বাক্যাংশ সনাক্ত করা। তারপর, একটি নতুন টেক্সট দেওয়া হলে, positive, negative এবং neutral শব্দগুলোর মোট মান গণনা করে সামগ্রিক অনুভূতি সনাক্ত করা।
+
+এই পদ্ধতি সহজেই বিভ্রান্ত হতে পারে যেমন আপনি Marvin টাস্কে দেখেছেন - বাক্যটি `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` একটি ব্যঙ্গাত্মক, negative অনুভূতির বাক্য, কিন্তু সহজ অ্যালগরিদমটি 'great', 'wonderful', 'glad' কে positive এবং 'waste', 'lost' এবং 'dark' কে negative হিসেবে সনাক্ত করে। সামগ্রিক অনুভূতি এই বিরোধপূর্ণ শব্দগুলোর দ্বারা প্রভাবিত হয়।
+
+✅ এক মুহূর্ত থামুন এবং ভাবুন আমরা মানুষ হিসেবে কীভাবে ব্যঙ্গ প্রকাশ করি। স্বরের ওঠানামা একটি বড় ভূমিকা পালন করে। "Well, that film was awesome" বাক্যটি বিভিন্নভাবে বলার চেষ্টা করুন এবং দেখুন কীভাবে আপনার কণ্ঠ অর্থ প্রকাশ করে।
+
+### ML পদ্ধতি
+
+ML পদ্ধতি হলো negative এবং positive টেক্সটের সংগ্রহ - টুইট, বা মুভি রিভিউ, বা যেকোনো কিছু যেখানে মানুষ একটি স্কোর *এবং* একটি লিখিত মতামত দিয়েছে। তারপর NLP কৌশলগুলো মতামত এবং স্কোরের উপর প্রয়োগ করা যায়, যাতে প্যাটার্নগুলো প্রকাশ পায় (যেমন, positive মুভি রিভিউতে 'Oscar worthy' বাক্যাংশটি negative মুভি রিভিউয়ের চেয়ে বেশি থাকে, বা positive রেস্টুরেন্ট রিভিউতে 'gourmet' শব্দটি 'disgusting' এর চেয়ে বেশি থাকে)।
+
+> ⚖️ **উদাহরণ**: ধরুন আপনি একজন রাজনীতিবিদের অফিসে কাজ করছেন এবং একটি নতুন আইন নিয়ে বিতর্ক চলছে, জনগণ অফিসে ইমেইল লিখে আইনটির পক্ষে বা বিপক্ষে মতামত জানাচ্ছে। ধরুন আপনাকে ইমেইলগুলো পড়তে এবং দুটি ভাগে সাজাতে বলা হলো, *পক্ষে* এবং *বিপক্ষে*। যদি প্রচুর ইমেইল থাকে, তাহলে আপনি সবগুলো পড়তে গিয়ে অভিভূত হতে পারেন। যদি একটি বট সবগুলো ইমেইল পড়ে, বুঝতে পারে এবং কোন ভাগে ইমেইলটি রাখা উচিত তা বলে দেয়, তাহলে কি ভালো হতো না?
+>
+> এটি অর্জনের একটি উপায় হলো মেশিন লার্নিং ব্যবহার করা। আপনি মডেলটি কিছু *বিপক্ষে* ইমেইল এবং কিছু *পক্ষে* ইমেইল দিয়ে প্রশিক্ষণ দেবেন। মডেলটি শব্দ এবং প্যাটার্নগুলোকে বিপক্ষে বা পক্ষে ইমেইলের সাথে যুক্ত করতে পারে, *কিন্তু এটি কোনো বিষয়বস্তু বুঝবে না*, শুধুমাত্র নির্দিষ্ট শব্দ এবং প্যাটার্নগুলো বিপক্ষে বা পক্ষে ইমেইলে বেশি দেখা যায়। আপনি এটি এমন কিছু ইমেইল দিয়ে পরীক্ষা করতে পারেন যা আপনি মডেল প্রশিক্ষণে ব্যবহার করেননি এবং দেখুন এটি আপনার সিদ্ধান্তের সাথে একমত কিনা। তারপর, যখন আপনি মডেলের সঠিকতায় সন্তুষ্ট হবেন, তখন ভবিষ্যতের ইমেইলগুলো প্রক্রিয়া করতে পারবেন প্রতিটি ইমেইল না পড়ে।
+
+✅ এই প্রক্রিয়াটি কি আপনি পূর্ববর্তী পাঠে ব্যবহৃত কোনো প্রক্রিয়ার মতো মনে হয়?
+
+## অনুশীলন - অনুভূতিমূলক বাক্য
+
+অনুভূতি *polarity* -১ থেকে ১ এর মধ্যে পরিমাপ করা হয়, যেখানে -১ সবচেয়ে negative অনুভূতি এবং ১ সবচেয়ে positive। অনুভূতি ০ - ১ স্কোর দিয়ে objectivity (০) এবং subjectivity (১) হিসেবেও পরিমাপ করা হয়।
+
+জেন অস্টেনের *Pride and Prejudice* এর দিকে আবার তাকান। টেক্সটটি এখানে পাওয়া যাবে [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm)। নিচের নমুনাটি একটি ছোট প্রোগ্রাম দেখায় যা বইয়ের প্রথম এবং শেষ বাক্যের অনুভূতি বিশ্লেষণ করে এবং এর sentiment polarity এবং subjectivity/objectivity স্কোর প্রদর্শন করে।
+
+আপনাকে `TextBlob` লাইব্রেরি (উপরে বর্ণিত) ব্যবহার করে `sentiment` নির্ধারণ করতে হবে (আপনার নিজস্ব sentiment calculator লিখতে হবে না) নিম্নলিখিত কাজে।
+
+```python
+from textblob import TextBlob
+
+quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife."""
+
+quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them."""
+
+sentiment1 = TextBlob(quote1).sentiment
+sentiment2 = TextBlob(quote2).sentiment
+
+print(quote1 + " has a sentiment of " + str(sentiment1))
+print(quote2 + " has a sentiment of " + str(sentiment2))
+```
+
+আপনি নিম্নলিখিত আউটপুট দেখতে পাবেন:
+
+```output
+It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146)
+
+Darcy, as well as Elizabeth, really loved them; and they were
+ both ever sensible of the warmest gratitude towards the persons
+ who, by bringing her into Derbyshire, had been the means of
+ uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8)
+```
+
+## চ্যালেঞ্জ - sentiment polarity পরীক্ষা করুন
+
+আপনার কাজ হলো sentiment polarity ব্যবহার করে নির্ধারণ করা যে *Pride and Prejudice* এ absolutely positive বাক্যগুলো absolutely negative বাক্যগুলোর চেয়ে বেশি কিনা। এই কাজের জন্য, আপনি ধরে নিতে পারেন যে polarity স্কোর ১ বা -১ absolutely positive বা negative যথাক্রমে।
+
+**ধাপসমূহ:**
+
+1. [Pride and Prejudice](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) এর একটি কপি Project Gutenberg থেকে .txt ফাইল হিসেবে ডাউনলোড করুন। ফাইলের শুরু এবং শেষের মেটাডেটা সরিয়ে শুধুমাত্র মূল টেক্সট রেখে দিন।
+2. ফাইলটি Python এ খুলুন এবং এর বিষয়বস্তু একটি string হিসেবে বের করুন।
+3. বই string ব্যবহার করে একটি TextBlob তৈরি করুন।
+4. একটি লুপে বইয়ের প্রতিটি বাক্য বিশ্লেষণ করুন।
+ 1. যদি polarity ১ বা -১ হয়, তাহলে বাক্যটি positive বা negative বার্তাগুলোর একটি array বা list এ সংরক্ষণ করুন।
+5. শেষে, সমস্ত positive বাক্য এবং negative বাক্য (আলাদাভাবে) এবং প্রতিটির সংখ্যা প্রিন্ট করুন।
+
+এখানে একটি নমুনা [সমাধান](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb)।
+
+✅ জ্ঞান যাচাই
+
+1. অনুভূতি বাক্যে ব্যবহৃত শব্দের উপর ভিত্তি করে, কিন্তু কোড কি শব্দগুলো *বুঝতে* পারে?
+2. আপনি কি sentiment polarity এর সঠিকতা নিয়ে একমত, বা অন্যভাবে বললে, আপনি কি স্কোরগুলোর সাথে *একমত*?
+ 1. বিশেষ করে, আপনি কি নিম্নলিখিত বাক্যগুলোর absolute **positive** polarity এর সাথে একমত বা দ্বিমত?
+ * “What an excellent father you have, girls!” said she, when the door was shut.
+ * “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect.
+ * How wonderfully these sort of things occur!
+ * I have the greatest dislike in the world to that sort of thing.
+ * Charlotte is an excellent manager, I dare say.
+ * “This is delightful indeed!
+ * I am so happy!
+ * Your idea of the ponies is delightful.
+ 2. পরবর্তী ৩টি বাক্য absolute positive sentiment দিয়ে স্কোর করা হয়েছে, কিন্তু গভীরভাবে পড়লে, এগুলো positive বাক্য নয়। কেন sentiment analysis মনে করেছে এগুলো positive বাক্য?
+ * Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power.
+ * If I could but see you as happy!
+ * Our distress, my dear Lizzy, is very great.
+ 3. আপনি কি নিম্নলিখিত বাক্যগুলোর absolute **negative** polarity এর সাথে একমত বা দ্বিমত?
+ - Everybody is disgusted with his pride.
+ - “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful.
+ - The pause was to Elizabeth’s feelings dreadful.
+ - It would be dreadful!
+
+✅ জেন অস্টেনের কোনো অনুরাগী বুঝতে পারবেন যে তিনি প্রায়ই তার বইগুলোতে ইংরেজি রিজেন্সি সমাজের আরও হাস্যকর দিকগুলো সমালোচনা করেন। *Pride and Prejudice* এর প্রধান চরিত্র এলিজাবেথ বেনেট একজন তীক্ষ্ণ সামাজিক পর্যবেক্ষক (লেখকের মতো) এবং তার ভাষা প্রায়ই গভীরভাবে সূক্ষ্ম। এমনকি মিস্টার ডারসি (গল্পের প্রেমের চরিত্র) এলিজাবেথের খেলাধুলাপূর্ণ এবং ঠাট্টামূলক ভাষার ব্যবহার লক্ষ্য করেন: "I have had the pleasure of your acquaintance long enough to know that you find great enjoyment in occasionally professing opinions which in fact are not your own."
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+আপনি কি Marvin কে আরও ভালো করতে পারেন ব্যবহারকারীর ইনপুট থেকে অন্যান্য বৈশিষ্ট্য বের করে?
+
+## [পাঠ-পরবর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/36/)
+
+## পর্যালোচনা এবং স্ব-অধ্যয়ন
+টেক্সট থেকে অনুভূতি নির্ণয়ের অনেক পদ্ধতি রয়েছে। এই কৌশলটি ব্যবহার করে ব্যবসায়িক প্রয়োগগুলোর কথা ভাবুন। এটি কীভাবে ভুল পথে যেতে পারে, সেটাও চিন্তা করুন। উন্নত এবং এন্টারপ্রাইজ-প্রস্তুত সিস্টেম সম্পর্কে আরও জানুন, যা অনুভূতি বিশ্লেষণ করে, যেমন [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott)। উপরের "Pride and Prejudice" এর কিছু বাক্য পরীক্ষা করুন এবং দেখুন এটি সূক্ষ্মতা শনাক্ত করতে পারে কিনা।
+
+## অ্যাসাইনমেন্ট
+
+[Poetic license](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/3-Translation-Sentiment/assignment.md b/translations/bn/6-NLP/3-Translation-Sentiment/assignment.md
new file mode 100644
index 000000000..9253ce956
--- /dev/null
+++ b/translations/bn/6-NLP/3-Translation-Sentiment/assignment.md
@@ -0,0 +1,25 @@
+
+# কবিতার লাইসেন্স
+
+## নির্দেশাবলী
+
+[এই নোটবুকে](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) আপনি ৫০০টিরও বেশি এমিলি ডিকিনসনের কবিতা পাবেন, যা পূর্বে Azure টেক্সট অ্যানালিটিক্স ব্যবহার করে অনুভূতি বিশ্লেষণ করা হয়েছে। এই ডেটাসেটটি ব্যবহার করে, পাঠে বর্ণিত কৌশলগুলি ব্যবহার করে এটি বিশ্লেষণ করুন। একটি কবিতার প্রস্তাবিত অনুভূতি কি আরও উন্নত Azure পরিষেবার সিদ্ধান্তের সাথে মেলে? আপনার মতে কেন বা কেন নয়? কিছু কি আপনাকে অবাক করেছে?
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | -------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------ |
+| | একটি নোটবুক উপস্থাপন করা হয়েছে যা লেখকের নমুনা আউটপুটের একটি শক্তিশালী বিশ্লেষণ প্রদান করে | নোটবুক অসম্পূর্ণ বা বিশ্লেষণ সম্পাদন করে না | কোনো নোটবুক উপস্থাপন করা হয়নি |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/3-Translation-Sentiment/solution/Julia/README.md b/translations/bn/6-NLP/3-Translation-Sentiment/solution/Julia/README.md
new file mode 100644
index 000000000..6aac4c9b2
--- /dev/null
+++ b/translations/bn/6-NLP/3-Translation-Sentiment/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/3-Translation-Sentiment/solution/R/README.md b/translations/bn/6-NLP/3-Translation-Sentiment/solution/R/README.md
new file mode 100644
index 000000000..c654d56c3
--- /dev/null
+++ b/translations/bn/6-NLP/3-Translation-Sentiment/solution/R/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb b/translations/bn/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb
new file mode 100644
index 000000000..821f1371e
--- /dev/null
+++ b/translations/bn/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb
@@ -0,0 +1,100 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": 3
+ },
+ "orig_nbformat": 4,
+ "coopTranslator": {
+ "original_hash": "27de2abc0235ebd22080fc8f1107454d",
+ "translation_date": "2025-08-30T00:14:42+00:00",
+ "source_file": "6-NLP/3-Translation-Sentiment/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from textblob import TextBlob\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# You should download the book text, clean it, and import it here\n",
+ "with open(\"pride.txt\", encoding=\"utf8\") as f:\n",
+ " file_contents = f.read()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "book_pride = TextBlob(file_contents)\n",
+ "positive_sentiment_sentences = []\n",
+ "negative_sentiment_sentences = []"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for sentence in book_pride.sentences:\n",
+ " if sentence.sentiment.polarity == 1:\n",
+ " positive_sentiment_sentences.append(sentence)\n",
+ " if sentence.sentiment.polarity == -1:\n",
+ " negative_sentiment_sentences.append(sentence)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print(\"The \" + str(len(positive_sentiment_sentences)) + \" most positive sentences:\")\n",
+ "for sentence in positive_sentiment_sentences:\n",
+ " print(\"+ \" + str(sentence.replace(\"\\n\", \"\").replace(\" \", \" \")))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print(\"The \" + str(len(negative_sentiment_sentences)) + \" most negative sentences:\")\n",
+ "for sentence in negative_sentiment_sentences:\n",
+ " print(\"- \" + str(sentence.replace(\"\\n\", \"\").replace(\" \", \" \")))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/6-NLP/4-Hotel-Reviews-1/README.md b/translations/bn/6-NLP/4-Hotel-Reviews-1/README.md
new file mode 100644
index 000000000..980ef4ecc
--- /dev/null
+++ b/translations/bn/6-NLP/4-Hotel-Reviews-1/README.md
@@ -0,0 +1,418 @@
+
+# হোটেল রিভিউ দিয়ে সেন্টিমেন্ট অ্যানালাইসিস - ডেটা প্রক্রিয়াকরণ
+
+এই সেকশনে আপনি আগের পাঠে শেখা কৌশলগুলো ব্যবহার করে একটি বড় ডেটাসেটের উপর কিছু অনুসন্ধানমূলক ডেটা বিশ্লেষণ করবেন। বিভিন্ন কলামের কার্যকারিতা সম্পর্কে ভালো ধারণা পাওয়ার পর, আপনি শিখবেন:
+
+- কীভাবে অপ্রয়োজনীয় কলামগুলো সরানো যায়
+- কীভাবে বিদ্যমান কলাম থেকে নতুন ডেটা গণনা করা যায়
+- কীভাবে চূড়ান্ত চ্যালেঞ্জের জন্য ডেটাসেট সংরক্ষণ করা যায়
+
+## [পূর্ব-পাঠ কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/37/)
+
+### ভূমিকা
+
+এখন পর্যন্ত আপনি শিখেছেন যে টেক্সট ডেটা সংখ্যাসূচক ডেটার মতো নয়। যদি এটি মানুষের লেখা বা বলা টেক্সট হয়, তবে এটি বিশ্লেষণ করে প্যাটার্ন, ফ্রিকোয়েন্সি, সেন্টিমেন্ট এবং অর্থ খুঁজে বের করা যায়। এই পাঠে আপনাকে একটি বাস্তব ডেটাসেট এবং একটি বাস্তব চ্যালেঞ্জের সাথে পরিচয় করানো হবে: **[ইউরোপের ৫১৫ হাজার হোটেল রিভিউ ডেটা](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)**, যা [CC0: পাবলিক ডোমেইন লাইসেন্স](https://creativecommons.org/publicdomain/zero/1.0/) এর অধীনে রয়েছে। এটি Booking.com থেকে পাবলিক সোর্স থেকে সংগ্রহ করা হয়েছে। ডেটাসেটটি তৈরি করেছেন জিয়াশেন লিউ।
+
+### প্রস্তুতি
+
+আপনার প্রয়োজন হবে:
+
+* Python 3 ব্যবহার করে .ipynb নোটবুক চালানোর সক্ষমতা
+* pandas
+* NLTK, [যা আপনাকে লোকালভাবে ইন্সটল করতে হবে](https://www.nltk.org/install.html)
+* ডেটাসেট, যা Kaggle-এ পাওয়া যাবে [ইউরোপের ৫১৫ হাজার হোটেল রিভিউ ডেটা](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)। আনজিপ করার পর এটি প্রায় ২৩০ এমবি। এটি এই NLP পাঠগুলোর সাথে সম্পর্কিত `/data` ফোল্ডারে ডাউনলোড করুন।
+
+## অনুসন্ধানমূলক ডেটা বিশ্লেষণ
+
+এই চ্যালেঞ্জটি ধরে নেয় যে আপনি সেন্টিমেন্ট অ্যানালাইসিস এবং অতিথিদের রিভিউ স্কোর ব্যবহার করে একটি হোটেল রিকমেন্ডেশন বট তৈরি করছেন। আপনি যে ডেটাসেটটি ব্যবহার করবেন, তাতে ৬টি শহরের ১৪৯৩টি ভিন্ন হোটেলের রিভিউ অন্তর্ভুক্ত রয়েছে।
+
+Python, হোটেল রিভিউ ডেটাসেট এবং NLTK-এর সেন্টিমেন্ট অ্যানালাইসিস ব্যবহার করে আপনি জানতে পারবেন:
+
+* রিভিউতে সবচেয়ে বেশি ব্যবহৃত শব্দ এবং বাক্যাংশ কী কী?
+* হোটেল বর্ণনা করার জন্য ব্যবহৃত *ট্যাগ* গুলো কি রিভিউ স্কোরের সাথে সম্পর্কিত (যেমন, *Family with young children* এর জন্য কি কোনো নির্দিষ্ট হোটেলে বেশি নেতিবাচক রিভিউ রয়েছে, যা হয়তো ইঙ্গিত করে যে এটি *Solo traveller* এর জন্য বেশি উপযুক্ত)?
+* NLTK সেন্টিমেন্ট স্কোর কি হোটেল রিভিউয়ারের সংখ্যাসূচক স্কোরের সাথে মিলে যায়?
+
+#### ডেটাসেট
+
+চলুন ডেটাসেটটি এক্সপ্লোর করি, যা আপনি লোকালভাবে ডাউনলোড এবং সংরক্ষণ করেছেন। ফাইলটি VS Code বা এমনকি Excel-এর মতো কোনো এডিটরে খুলুন।
+
+ডেটাসেটের হেডারগুলো নিম্নরূপ:
+
+*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng*
+
+এগুলোকে এমনভাবে গ্রুপ করা হয়েছে, যা পরীক্ষা করা সহজ হতে পারে:
+##### হোটেল কলাম
+
+* `Hotel_Name`, `Hotel_Address`, `lat` (অক্ষাংশ), `lng` (দ্রাঘিমাংশ)
+ * *lat* এবং *lng* ব্যবহার করে আপনি Python দিয়ে একটি মানচিত্র তৈরি করতে পারেন, যেখানে হোটেলের অবস্থানগুলো দেখানো হবে (সম্ভবত নেতিবাচক এবং ইতিবাচক রিভিউয়ের জন্য ভিন্ন রঙে চিহ্নিত)
+ * Hotel_Address আমাদের জন্য সরাসরি খুব একটা উপকারী নয়, এবং আমরা সম্ভবত এটি একটি দেশের সাথে প্রতিস্থাপন করব, যাতে সহজে সাজানো এবং অনুসন্ধান করা যায়।
+
+**হোটেল মেটা-রিভিউ কলাম**
+
+* `Average_Score`
+ * ডেটাসেটের নির্মাতা অনুযায়ী, এই কলামটি হলো *হোটেলের গড় স্কোর, যা গত বছরের সর্বশেষ মন্তব্যের উপর ভিত্তি করে গণনা করা হয়েছে*। এটি একটি অস্বাভাবিক পদ্ধতি মনে হতে পারে, তবে এটি স্ক্র্যাপ করা ডেটা, তাই আপাতত আমরা এটিকে গ্রহণ করতে পারি।
+
+ ✅ এই ডেটার অন্যান্য কলামের উপর ভিত্তি করে গড় স্কোর গণনা করার আরেকটি উপায় কি আপনি ভাবতে পারেন?
+
+* `Total_Number_of_Reviews`
+ * এই হোটেলটি কতগুলো রিভিউ পেয়েছে তার মোট সংখ্যা - এটি স্পষ্ট নয় (কোড না লিখে) যে এটি ডেটাসেটে থাকা রিভিউগুলোকে বোঝায় কিনা।
+* `Additional_Number_of_Scoring`
+ * এর মানে হলো রিভিউ স্কোর দেওয়া হয়েছে, কিন্তু রিভিউয়ার কোনো ইতিবাচক বা নেতিবাচক রিভিউ লেখেননি।
+
+**রিভিউ কলাম**
+
+- `Reviewer_Score`
+ - এটি একটি সংখ্যাসূচক মান, যা সর্বাধিক ১ দশমিক স্থান পর্যন্ত হতে পারে এবং এর সর্বনিম্ন এবং সর্বোচ্চ মান যথাক্রমে ২.৫ এবং ১০।
+ - কেন ২.৫ সর্বনিম্ন স্কোর তা ব্যাখ্যা করা হয়নি।
+- `Negative_Review`
+ - যদি কোনো রিভিউয়ার কিছু না লেখেন, তবে এই ফিল্ডে "**No Negative**" থাকবে।
+ - লক্ষ্য করুন যে, রিভিউয়ার নেতিবাচক রিভিউ কলামে ইতিবাচক কিছু লিখতে পারেন (যেমন, "এই হোটেলে খারাপ কিছু নেই")।
+- `Review_Total_Negative_Word_Counts`
+ - বেশি নেতিবাচক শব্দের সংখ্যা কম স্কোর নির্দেশ করে (সেন্টিমেন্টালিটি যাচাই না করেই)।
+- `Positive_Review`
+ - যদি কোনো রিভিউয়ার কিছু না লেখেন, তবে এই ফিল্ডে "**No Positive**" থাকবে।
+ - লক্ষ্য করুন যে, রিভিউয়ার ইতিবাচক রিভিউ কলামে নেতিবাচক কিছু লিখতে পারেন (যেমন, "এই হোটেলে মোটেও ভালো কিছু নেই")।
+- `Review_Total_Positive_Word_Counts`
+ - বেশি ইতিবাচক শব্দের সংখ্যা বেশি স্কোর নির্দেশ করে (সেন্টিমেন্টালিটি যাচাই না করেই)।
+- `Review_Date` এবং `days_since_review`
+ - একটি রিভিউয়ের সতেজতা বা পুরনো হওয়ার পরিমাপ প্রয়োগ করা যেতে পারে (পুরনো রিভিউগুলো নতুনগুলোর মতো সঠিক নাও হতে পারে, কারণ হোটেল ম্যানেজমেন্ট পরিবর্তিত হয়েছে, সংস্কার করা হয়েছে, বা একটি সুইমিং পুল যোগ করা হয়েছে ইত্যাদি)।
+- `Tags`
+ - এগুলো ছোট বর্ণনা, যা রিভিউয়ার তাদের অতিথি হিসেবে ধরণ (যেমন, একা বা পরিবার), রুমের ধরণ, থাকার সময়কাল এবং কীভাবে রিভিউ জমা দেওয়া হয়েছে তা বর্ণনা করতে নির্বাচন করতে পারেন।
+ - দুর্ভাগ্যবশত, এই ট্যাগগুলো ব্যবহার করা সমস্যাজনক, নিচের সেকশনে এদের কার্যকারিতা নিয়ে আলোচনা করা হয়েছে।
+
+**রিভিউয়ার কলাম**
+
+- `Total_Number_of_Reviews_Reviewer_Has_Given`
+ - এটি একটি রিকমেন্ডেশন মডেলে একটি ফ্যাক্টর হতে পারে, উদাহরণস্বরূপ, আপনি যদি নির্ধারণ করতে পারেন যে শতাধিক রিভিউ দেওয়া বেশি সক্রিয় রিভিউয়াররা নেতিবাচক হওয়ার চেয়ে ইতিবাচক হওয়ার সম্ভাবনা বেশি। তবে, কোনো নির্দিষ্ট রিভিউয়ের রিভিউয়ারকে একটি ইউনিক কোড দিয়ে চিহ্নিত করা হয়নি, এবং তাই এটি একটি সেট রিভিউয়ের সাথে সংযুক্ত করা সম্ভব নয়। ১০০ বা তার বেশি রিভিউ দেওয়া ৩০ জন রিভিউয়ার রয়েছে, তবে এটি রিকমেন্ডেশন মডেলে কীভাবে সহায়তা করতে পারে তা বোঝা কঠিন।
+- `Reviewer_Nationality`
+ - কিছু মানুষ মনে করতে পারেন যে নির্দিষ্ট জাতীয়তার লোকেরা ইতিবাচক বা নেতিবাচক রিভিউ দেওয়ার প্রবণতা বেশি। তবে, এমন অনুমানমূলক দৃষ্টিভঙ্গি আপনার মডেলে অন্তর্ভুক্ত করার সময় সতর্ক থাকুন। এগুলো জাতীয় (এবং কখনও কখনও জাতিগত) স্টেরিওটাইপ, এবং প্রতিটি রিভিউয়ার তাদের অভিজ্ঞতার ভিত্তিতে একটি রিভিউ লিখেছেন। এটি তাদের পূর্ববর্তী হোটেল থাকার অভিজ্ঞতা, ভ্রমণের দূরত্ব এবং তাদের ব্যক্তিগত মেজাজের মতো অনেক দৃষ্টিকোণ থেকে ফিল্টার হতে পারে। তাদের জাতীয়তাই রিভিউ স্কোরের কারণ ছিল এমনটি ভাবা কঠিন।
+
+##### উদাহরণ
+
+| Average Score | Total Number Reviews | Reviewer Score | Negative Review | Positive Review | Tags |
+| -------------- | ---------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- |
+| 7.8 | 1945 | 2.5 | This is currently not a hotel but a construction site I was terrorized from early morning and all day with unacceptable building noise while resting after a long trip and working in the room People were working all day i e with jackhammers in the adjacent rooms I asked for a room change but no silent room was available To make things worse I was overcharged I checked out in the evening since I had to leave very early flight and received an appropriate bill A day later the hotel made another charge without my consent in excess of booked price It's a terrible place Don't punish yourself by booking here | Nothing Terrible place Stay away | Business trip Couple Standard Double Room Stayed 2 nights |
+
+যেমনটি দেখা যাচ্ছে, এই অতিথি হোটেলে খুবই খারাপ অভিজ্ঞতা পেয়েছেন। হোটেলের গড় স্কোর ৭.৮ এবং ১৯৪৫টি রিভিউ রয়েছে, কিন্তু এই রিভিউয়ার ২.৫ স্কোর দিয়েছেন এবং তাদের নেতিবাচক অভিজ্ঞতা নিয়ে ১১৫টি শব্দ লিখেছেন। যদি তারা Positive_Review কলামে কিছুই না লিখতেন, তবে আপনি অনুমান করতে পারতেন যে সেখানে কিছুই ইতিবাচক ছিল না, কিন্তু তারা সতর্কবার্তা হিসেবে ৭টি শব্দ লিখেছেন। যদি আমরা শব্দ গণনা করি অর্থ বা শব্দের সেন্টিমেন্টের পরিবর্তে, তবে আমরা রিভিউয়ারের উদ্দেশ্য সম্পর্কে একটি বিকৃত ধারণা পেতে পারি। অদ্ভুতভাবে, তাদের ২.৫ স্কোর বিভ্রান্তিকর, কারণ যদি হোটেলে থাকার অভিজ্ঞতা এতটাই খারাপ হয়, তবে কেন কোনো পয়েন্ট দেওয়া হলো? ডেটাসেটটি ঘনিষ্ঠভাবে পরীক্ষা করলে, আপনি দেখবেন যে সর্বনিম্ন স্কোর সম্ভবত ২.৫, ০ নয়। সর্বোচ্চ স্কোর সম্ভবত ১০।
+
+##### ট্যাগ
+
+উপরোক্ত আলোচনায় উল্লেখ করা হয়েছে যে, প্রথম নজরে `Tags` ব্যবহার করে ডেটা শ্রেণীবদ্ধ করার ধারণাটি যৌক্তিক মনে হয়। দুর্ভাগ্যবশত, এই ট্যাগগুলো স্ট্যান্ডার্ডাইজড নয়, যার মানে একটি নির্দিষ্ট হোটেলে অপশনগুলো হতে পারে *Single room*, *Twin room*, এবং *Double room*, কিন্তু অন্য একটি হোটেলে এগুলো হতে পারে *Deluxe Single Room*, *Classic Queen Room*, এবং *Executive King Room*। এগুলো একই জিনিস হতে পারে, কিন্তু এত বেশি বৈচিত্র্য রয়েছে যে পছন্দগুলো হয়ে যায়:
+
+1. সমস্ত টার্মকে একটি একক স্ট্যান্ডার্ডে পরিবর্তন করার চেষ্টা করা, যা খুবই কঠিন, কারণ প্রতিটি ক্ষেত্রে রূপান্তরের পথ কী হবে তা স্পষ্ট নয় (যেমন, *Classic single room* কে *Single room* এ ম্যাপ করা যায়, কিন্তু *Superior Queen Room with Courtyard Garden or City View* কে ম্যাপ করা অনেক কঠিন)।
+
+1. আমরা একটি NLP পদ্ধতি নিতে পারি এবং প্রতিটি হোটেলের ক্ষেত্রে *Solo*, *Business Traveller*, বা *Family with young kids* এর মতো নির্দিষ্ট টার্মগুলোর ফ্রিকোয়েন্সি পরিমাপ করতে পারি এবং এটি রিকমেন্ডেশনে অন্তর্ভুক্ত করতে পারি।
+
+ট্যাগগুলো সাধারণত (কিন্তু সবসময় নয়) একটি একক ফিল্ড, যা ৫ থেকে ৬টি কমা দ্বারা পৃথক মানের তালিকা ধারণ করে, যা *Type of trip*, *Type of guests*, *Type of room*, *Number of nights*, এবং *Type of device review was submitted on* এর সাথে সামঞ্জস্যপূর্ণ। তবে, কিছু রিভিউয়ার প্রতিটি ফিল্ড পূরণ করেন না (তারা একটি ফিল্ড ফাঁকা রাখতে পারেন), তাই মানগুলো সবসময় একই ক্রমে থাকে না।
+
+উদাহরণস্বরূপ, *Type of group* নিন। এই ফিল্ডে `Tags` কলামে ১০২৫টি ইউনিক সম্ভাবনা রয়েছে, এবং দুর্ভাগ্যবশত এর মধ্যে কেবল কিছু গ্রুপকে বোঝায় (কিছু রুমের ধরণ ইত্যাদি)। যদি আপনি শুধুমাত্র সেই মানগুলো ফিল্টার করেন যা পরিবার উল্লেখ করে, তবে ফলাফলে অনেক *Family room* টাইপের মান অন্তর্ভুক্ত থাকে। যদি আপনি *with* টার্মটি অন্তর্ভুক্ত করেন, অর্থাৎ *Family with* মানগুলো গণনা করেন, তবে ফলাফলগুলো আরও ভালো হয়, যেখানে ৫১৫,০০০ ফলাফলের মধ্যে ৮০,০০০ এর বেশি "Family with young children" বা "Family with older children" বাক্যাংশ অন্তর্ভুক্ত থাকে।
+
+এর মানে হলো ট্যাগ কলামটি আমাদের জন্য পুরোপুরি অপ্রয়োজনীয় নয়, তবে এটি কার্যকর করতে কিছু কাজ করতে হবে।
+
+##### গড় হোটেল স্কোর
+
+ডেটাসেটের সাথে কিছু অদ্ভুততা বা অসঙ্গতি রয়েছে, যা আমি বুঝতে পারিনি, তবে এখানে সেগুলো চিত্রিত করা হয়েছে যাতে আপনি মডেল তৈরি করার সময় সেগুলো সম্পর্কে সচেতন থাকেন। আপনি যদি এটি বের করতে পারেন, তবে আমাদের আলোচনা সেকশনে জানান!
+
+ডেটাসেটে গড় স্কোর এবং রিভিউয়ের সংখ্যার সাথে সম্পর্কিত নিম্নলিখিত কলামগুলো রয়েছে:
+
+1. Hotel_Name
+2. Additional_Number_of_Scoring
+3. Average_Score
+4. Total_Number_of_Reviews
+5. Reviewer_Score
+
+এই ডেটাসেটে সবচেয়ে বেশি রিভিউ থাকা একক হোটেল হলো *Britannia International Hotel Canary Wharf*, যার ৪৭৮৯টি রিভিউ রয়েছে ৫১৫,০০০ এর মধ্যে। কিন্তু যদি আমরা এই হোটেলের জন্য `Total_Number_of_Reviews` মানটি দেখি, এটি ৯০৮৬। আপনি অনুমান করতে পারেন যে আরও অনেক স্কোর রিভিউ ছাড়াই রয়েছে, তাই সম্ভবত আমাদের `Additional_Number_of_Scoring` কলামের মান যোগ করা উচিত। সেই মানটি ২৬৮২, এবং এটি ৪৭৮৯ এর সাথে যোগ করলে ৭৪৭১ হয়, যা এখনও `Total_Number_of_Reviews` এর চেয়ে ১৬১৫ কম।
+
+যদি আপনি `Average_Score` কলামটি নেন, আপনি অনুমান করতে পারেন এটি ডেটাসেটে থাকা রিভিউয়ের গড়, কিন্তু Kaggle-এর বর্ণনা অনুযায়ী এটি "*গত বছরের সর্বশেষ মন্তব্যের উপর ভিত্তি করে হোটেলের গড় স্কোর*"। এটি খুব একটা কার্যকর মনে হয় না, তবে আমরা ডেটাসেটে থাকা রিভিউ স্কোরের উপর ভিত্তি করে আমাদের নিজস্ব গড় স্কোর গণনা করতে পারি। একই হোটেলকে উদাহরণ হিসেবে ব্যবহার করে, গড় হোটেল স্কোর দেওয়া হয়েছে ৭.১, কিন্তু ডেটাসেটে থাকা রিভিউ স্কোরের গড় (গণনা করা) হলো ৬.৮। এটি কাছাকাছি, কিন্তু একই মান নয়, এবং আমরা কেবল অনুমান করতে পারি যে `Additional_Number_of_Scoring` রিভিউগুলো গড়কে ৭.১-এ উন্নীত করেছে। দুর্ভাগ্যবশত, সেই অনুমান পরীক্ষা বা প্রমাণ করার কোনো উপায় না থাকায়, `Average_Score`, `Additional_Number_of_Scoring` এবং `Total_Number_of_Reviews` ব্যবহার বা বিশ্বাস করা কঠিন, কারণ সেগুলো এমন ডেটার উপর ভিত্তি করে তৈরি, যা আমাদের কাছে নেই।
+
+বিষয়টিকে আরও জটিল করে তুলতে, ডেটাসেটে দ্বিতীয় সর্বাধিক রিভিউ থাকা হোটেলের গণিত অনুযায়ী গড় স্কোর ৮.১২ এবং ডেটাসেটের `Average_Score` হলো ৮.১। এটি কি সঠিক স্কোরের একটি কাকতালীয় ঘটনা, নাকি প্রথম হোটেলটি একটি অসঙ্গতি?
+এই হোটেলটি যদি একটি ব্যতিক্রম হয় এবং হয়তো বেশিরভাগ মানগুলি সঠিকভাবে মিলে যায় (কিন্তু কিছু কারণে কিছু মান মিলে না), তাহলে আমরা একটি ছোট প্রোগ্রাম লিখব যা ডেটাসেটে মানগুলি পরীক্ষা করবে এবং সঠিক ব্যবহার (বা অ-ব্যবহার) নির্ধারণ করবে।
+
+> 🚨 সতর্কতার একটি নোট
+>
+> এই ডেটাসেট নিয়ে কাজ করার সময় আপনি এমন কোড লিখবেন যা টেক্সট থেকে কিছু গণনা করে, টেক্সট নিজে পড়া বা বিশ্লেষণ করার প্রয়োজন ছাড়াই। এটি NLP-এর মূল বিষয়, অর্থ বা অনুভূতি ব্যাখ্যা করা যা একজন মানুষের দ্বারা না করেও সম্ভব। তবে, এটি সম্ভব যে আপনি কিছু নেতিবাচক রিভিউ পড়বেন। আমি আপনাকে এটি না করার পরামর্শ দেব, কারণ এটি করার প্রয়োজন নেই। কিছু রিভিউ হাস্যকর বা অপ্রাসঙ্গিক নেতিবাচক হোটেল রিভিউ হতে পারে, যেমন "আবহাওয়া ভালো ছিল না", যা হোটেলের বা কারো নিয়ন্ত্রণের বাইরে। তবে কিছু রিভিউয়ের একটি অন্ধকার দিকও রয়েছে। কখনও কখনও নেতিবাচক রিভিউগুলো বর্ণবাদী, লিঙ্গবাদী বা বয়সবাদী হতে পারে। এটি দুর্ভাগ্যজনক, তবে একটি পাবলিক ওয়েবসাইট থেকে স্ক্র্যাপ করা ডেটাসেটে এটি প্রত্যাশিত। কিছু রিভিউয়ার এমন রিভিউ রেখে যান যা আপনি অপ্রীতিকর, অস্বস্তিকর বা বিরক্তিকর মনে করতে পারেন। কোডকে অনুভূতি পরিমাপ করতে দিন, নিজে পড়ে বিরক্ত হওয়ার চেয়ে। তবে, এটি একটি সংখ্যালঘু যারা এমন জিনিস লিখে, কিন্তু তারা সবসময়ই থাকে।
+
+## অনুশীলন - ডেটা অনুসন্ধান
+### ডেটা লোড করুন
+
+ডেটা ভিজ্যুয়ালি পরীক্ষা করা যথেষ্ট হয়েছে, এখন আপনি কিছু কোড লিখবেন এবং কিছু উত্তর পাবেন! এই অংশে pandas লাইব্রেরি ব্যবহার করা হয়েছে। আপনার প্রথম কাজ হল নিশ্চিত করা যে আপনি CSV ডেটা লোড এবং পড়তে পারেন। pandas লাইব্রেরির একটি দ্রুত CSV লোডার রয়েছে, এবং ফলাফলটি একটি ডেটাফ্রেমে রাখা হয়, যেমন আগের পাঠে। আমরা যে CSV লোড করছি তাতে অর্ধ মিলিয়নেরও বেশি সারি রয়েছে, কিন্তু মাত্র ১৭টি কলাম। pandas আপনাকে ডেটাফ্রেমের সাথে ইন্টারঅ্যাক্ট করার জন্য অনেক শক্তিশালী উপায় দেয়, যার মধ্যে প্রতিটি সারিতে অপারেশন করার ক্ষমতা রয়েছে।
+
+এই পাঠের পর থেকে কোড স্নিপেট এবং কোডের কিছু ব্যাখ্যা এবং ফলাফল সম্পর্কে কিছু আলোচনা থাকবে। আপনার কোডের জন্য অন্তর্ভুক্ত _notebook.ipynb_ ব্যবহার করুন।
+
+চলুন শুরু করি আপনি যে ডেটা ফাইলটি ব্যবহার করবেন তা লোড করার মাধ্যমে:
+
+```python
+# Load the hotel reviews from CSV
+import pandas as pd
+import time
+# importing time so the start and end time can be used to calculate file loading time
+print("Loading data file now, this could take a while depending on file size")
+start = time.time()
+# df is 'DataFrame' - make sure you downloaded the file to the data folder
+df = pd.read_csv('../../data/Hotel_Reviews.csv')
+end = time.time()
+print("Loading took " + str(round(end - start, 2)) + " seconds")
+```
+
+ডেটা লোড হয়ে গেলে, আমরা এর উপর কিছু অপারেশন করতে পারি। আপনার প্রোগ্রামের পরবর্তী অংশের জন্য এই কোডটি উপরে রাখুন।
+
+## ডেটা অনুসন্ধান
+
+এই ক্ষেত্রে, ডেটা ইতিমধ্যেই *পরিষ্কার*, অর্থাৎ এটি কাজ করার জন্য প্রস্তুত এবং এতে অন্য ভাষার অক্ষর নেই যা শুধুমাত্র ইংরেজি অক্ষর প্রত্যাশা করা অ্যালগরিদমকে বিভ্রান্ত করতে পারে।
+
+✅ আপনাকে এমন ডেটার সাথে কাজ করতে হতে পারে যা NLP কৌশল প্রয়োগ করার আগে কিছু প্রাথমিক প্রক্রিয়াকরণ প্রয়োজন, তবে এই সময় নয়। যদি প্রয়োজন হয়, আপনি কীভাবে অ-ইংরেজি অক্ষর পরিচালনা করবেন?
+
+এক মুহূর্ত সময় নিন নিশ্চিত করতে যে ডেটা লোড হওয়ার পরে আপনি কোড দিয়ে এটি অনুসন্ধান করতে পারেন। `Negative_Review` এবং `Positive_Review` কলামগুলিতে ফোকাস করতে চাওয়া খুব সহজ। এগুলো আপনার NLP অ্যালগরিদমের জন্য প্রাকৃতিক টেক্সট দিয়ে পূর্ণ। কিন্তু অপেক্ষা করুন! NLP এবং অনুভূতির দিকে ঝাঁপ দেওয়ার আগে, আপনাকে নিচের কোডটি অনুসরণ করতে হবে যাতে ডেটাসেটে দেওয়া মানগুলি pandas দিয়ে গণনা করা মানগুলির সাথে মিলে কিনা তা নিশ্চিত করা যায়।
+
+## ডেটাফ্রেম অপারেশন
+
+এই পাঠের প্রথম কাজ হল কিছু কোড লিখে ডেটাফ্রেম পরীক্ষা করা (এটি পরিবর্তন না করে) এবং নিচের দাবিগুলি সঠিক কিনা তা যাচাই করা।
+
+> অনেক প্রোগ্রামিং কাজের মতো, এটি সম্পন্ন করার জন্য বেশ কয়েকটি উপায় রয়েছে, তবে ভালো পরামর্শ হল এটি যতটা সম্ভব সহজ এবং সহজ উপায়ে করা, বিশেষত যদি এটি ভবিষ্যতে এই কোডে ফিরে আসার সময় বুঝতে সহজ হয়। ডেটাফ্রেমের সাথে, একটি বিস্তৃত API রয়েছে যা প্রায়শই আপনি যা চান তা দক্ষতার সাথে করার একটি উপায় থাকবে।
+
+নিচের প্রশ্নগুলোকে কোডিং টাস্ক হিসেবে বিবেচনা করুন এবং সমাধান না দেখে উত্তর দেওয়ার চেষ্টা করুন।
+
+1. আপনি যে ডেটাফ্রেমটি লোড করেছেন তার *shape* প্রিন্ট করুন (shape হল সারি এবং কলামের সংখ্যা)
+2. রিভিউয়ার জাতীয়তার ফ্রিকোয়েন্সি গণনা করুন:
+ 1. `Reviewer_Nationality` কলামের জন্য কতটি স্বতন্ত্র মান রয়েছে এবং সেগুলো কী কী?
+ 2. ডেটাসেটে সবচেয়ে সাধারণ রিভিউয়ার জাতীয়তা কোনটি (দেশ এবং রিভিউ সংখ্যা প্রিন্ট করুন)?
+ 3. পরবর্তী শীর্ষ ১০টি সবচেয়ে বেশি পাওয়া জাতীয়তা এবং তাদের ফ্রিকোয়েন্সি গণনা কী কী?
+3. শীর্ষ ১০টি রিভিউয়ার জাতীয়তার জন্য সবচেয়ে বেশি রিভিউ করা হোটেল কোনটি?
+4. ডেটাসেটে প্রতি হোটেলের জন্য কতটি রিভিউ রয়েছে (হোটেলের ফ্রিকোয়েন্সি গণনা)?
+5. যদিও ডেটাসেটে প্রতিটি হোটেলের জন্য একটি `Average_Score` কলাম রয়েছে, আপনি একটি গড় স্কোরও গণনা করতে পারেন (ডেটাসেটে প্রতিটি হোটেলের জন্য সমস্ত রিভিউয়ার স্কোরের গড় পাওয়া)। আপনার ডেটাফ্রেমে `Calc_Average_Score` শিরোনামের একটি নতুন কলাম যোগ করুন যা সেই গণিত গড় ধারণ করে।
+6. কোনও হোটেলের `Average_Score` এবং `Calc_Average_Score` (১ দশমিক স্থানে রাউন্ড করা) একই আছে কিনা?
+ 1. একটি Python ফাংশন লিখে দেখুন যা একটি Series (সারি) আর্গুমেন্ট হিসেবে নেয় এবং মানগুলো তুলনা করে, যখন মানগুলো সমান নয় তখন একটি বার্তা প্রিন্ট করে। তারপর `.apply()` পদ্ধতি ব্যবহার করে প্রতিটি সারি ফাংশন দিয়ে প্রক্রিয়া করুন।
+7. `Negative_Review` কলামের "No Negative" মানের কতটি সারি রয়েছে তা গণনা এবং প্রিন্ট করুন।
+8. `Positive_Review` কলামের "No Positive" মানের কতটি সারি রয়েছে তা গণনা এবং প্রিন্ট করুন।
+9. `Positive_Review` কলামের "No Positive" **এবং** `Negative_Review` কলামের "No Negative" মানের কতটি সারি রয়েছে তা গণনা এবং প্রিন্ট করুন।
+
+### কোড উত্তর
+
+1. আপনি যে ডেটাফ্রেমটি লোড করেছেন তার *shape* প্রিন্ট করুন (shape হল সারি এবং কলামের সংখ্যা)
+
+ ```python
+ print("The shape of the data (rows, cols) is " + str(df.shape))
+ > The shape of the data (rows, cols) is (515738, 17)
+ ```
+
+2. রিভিউয়ার জাতীয়তার ফ্রিকোয়েন্সি গণনা করুন:
+
+ 1. `Reviewer_Nationality` কলামের জন্য কতটি স্বতন্ত্র মান রয়েছে এবং সেগুলো কী কী?
+ 2. ডেটাসেটে সবচেয়ে সাধারণ রিভিউয়ার জাতীয়তা কোনটি (দেশ এবং রিভিউ সংখ্যা প্রিন্ট করুন)?
+
+ ```python
+ # value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality
+ nationality_freq = df["Reviewer_Nationality"].value_counts()
+ print("There are " + str(nationality_freq.size) + " different nationalities")
+ # print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data
+ print(nationality_freq)
+
+ There are 227 different nationalities
+ United Kingdom 245246
+ United States of America 35437
+ Australia 21686
+ Ireland 14827
+ United Arab Emirates 10235
+ ...
+ Comoros 1
+ Palau 1
+ Northern Mariana Islands 1
+ Cape Verde 1
+ Guinea 1
+ Name: Reviewer_Nationality, Length: 227, dtype: int64
+ ```
+
+ 3. পরবর্তী শীর্ষ ১০টি সবচেয়ে বেশি পাওয়া জাতীয়তা এবং তাদের ফ্রিকোয়েন্সি গণনা কী কী?
+
+ ```python
+ print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.")
+ # Notice there is a leading space on the values, strip() removes that for printing
+ # What is the top 10 most common nationalities and their frequencies?
+ print("The next 10 highest frequency reviewer nationalities are:")
+ print(nationality_freq[1:11].to_string())
+
+ The highest frequency reviewer nationality is United Kingdom with 245246 reviews.
+ The next 10 highest frequency reviewer nationalities are:
+ United States of America 35437
+ Australia 21686
+ Ireland 14827
+ United Arab Emirates 10235
+ Saudi Arabia 8951
+ Netherlands 8772
+ Switzerland 8678
+ Germany 7941
+ Canada 7894
+ France 7296
+ ```
+
+3. শীর্ষ ১০টি রিভিউয়ার জাতীয়তার জন্য সবচেয়ে বেশি রিভিউ করা হোটেল কোনটি?
+
+ ```python
+ # What was the most frequently reviewed hotel for the top 10 nationalities
+ # Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow)
+ for nat in nationality_freq[:10].index:
+ # First, extract all the rows that match the criteria into a new dataframe
+ nat_df = df[df["Reviewer_Nationality"] == nat]
+ # Now get the hotel freq
+ freq = nat_df["Hotel_Name"].value_counts()
+ print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.")
+
+ The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews.
+ The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews.
+ The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews.
+ The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews.
+ The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews.
+ The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews.
+ The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews.
+ The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews.
+ The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews.
+ The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews.
+ ```
+
+4. ডেটাসেটে প্রতি হোটেলের জন্য কতটি রিভিউ রয়েছে (হোটেলের ফ্রিকোয়েন্সি গণনা)?
+
+ ```python
+ # First create a new dataframe based on the old one, removing the uneeded columns
+ hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1)
+
+ # Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found
+ hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')
+
+ # Get rid of all the duplicated rows
+ hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"])
+ display(hotel_freq_df)
+ ```
+ | Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found |
+ | :----------------------------------------: | :---------------------: | :-----------------: |
+ | Britannia International Hotel Canary Wharf | 9086 | 4789 |
+ | Park Plaza Westminster Bridge London | 12158 | 4169 |
+ | Copthorne Tara Hotel London Kensington | 7105 | 3578 |
+ | ... | ... | ... |
+ | Mercure Paris Porte d Orleans | 110 | 10 |
+ | Hotel Wagner | 135 | 10 |
+ | Hotel Gallitzinberg | 173 | 8 |
+
+ আপনি লক্ষ্য করতে পারেন যে *ডেটাসেটে গণনা করা* ফলাফল `Total_Number_of_Reviews` মানের সাথে মেলে না। এটি স্পষ্ট নয় যে এই মানটি ডেটাসেটে হোটেলের মোট রিভিউ সংখ্যা প্রতিনিধিত্ব করেছিল, কিন্তু সবগুলো স্ক্র্যাপ করা হয়নি, বা অন্য কোনও গণনা। `Total_Number_of_Reviews` মডেলে ব্যবহার করা হয় না কারণ এই অস্পষ্টতার কারণে।
+
+5. যদিও ডেটাসেটে প্রতিটি হোটেলের জন্য একটি `Average_Score` কলাম রয়েছে, আপনি একটি গড় স্কোরও গণনা করতে পারেন (ডেটাসেটে প্রতিটি হোটেলের জন্য সমস্ত রিভিউয়ার স্কোরের গড় পাওয়া)। আপনার ডেটাফ্রেমে `Calc_Average_Score` শিরোনামের একটি নতুন কলাম যোগ করুন যা সেই গণিত গড় ধারণ করে। `Hotel_Name`, `Average_Score`, এবং `Calc_Average_Score` কলামগুলো প্রিন্ট করুন।
+
+ ```python
+ # define a function that takes a row and performs some calculation with it
+ def get_difference_review_avg(row):
+ return row["Average_Score"] - row["Calc_Average_Score"]
+
+ # 'mean' is mathematical word for 'average'
+ df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
+
+ # Add a new column with the difference between the two average scores
+ df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1)
+
+ # Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel)
+ review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"])
+
+ # Sort the dataframe to find the lowest and highest average score difference
+ review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"])
+
+ display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]])
+ ```
+
+ আপনি `Average_Score` মান এবং কেন এটি কখনও কখনও গণিত গড় স্কোর থেকে আলাদা তা নিয়ে ভাবতে পারেন। যেহেতু আমরা জানি না কেন কিছু মান মিলে যায়, কিন্তু অন্যগুলোর মধ্যে পার্থক্য রয়েছে, এই ক্ষেত্রে আমাদের কাছে থাকা রিভিউ স্কোর ব্যবহার করে গড় নিজে গণনা করা নিরাপদ। তবে, পার্থক্যগুলো সাধারণত খুব ছোট হয়, এখানে ডেটাসেট গড় এবং গণিত গড়ের মধ্যে সবচেয়ে বেশি বিচ্যুতি থাকা হোটেলগুলো:
+
+ | Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name |
+ | :----------------------: | :-----------: | :----------------: | ------------------------------------------: |
+ | -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria |
+ | -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery |
+ | -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans |
+ | -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel |
+ | -0.5 | 7.0 | 7.5 | Hotel Royal Elys es |
+ | ... | ... | ... | ... |
+ | 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre |
+ | 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur |
+ | 0.9 | 6.8 | 5.9 | Villa Eugenie |
+ | 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux |
+ | 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar |
+
+ মাত্র ১টি হোটেলের স্কোরের পার্থক্য ১-এর বেশি, এর মানে আমরা সম্ভবত পার্থক্যটি উপেক্ষা করতে পারি এবং গণিত গড় স্কোর ব্যবহার করতে পারি।
+
+6. `Negative_Review` কলামের "No Negative" মানের কতটি সারি রয়েছে তা গণনা এবং প্রিন্ট করুন।
+
+7. `Positive_Review` কলামের "No Positive" মানের কতটি সারি রয়েছে তা গণনা এবং প্রিন্ট করুন।
+
+8. `Positive_Review` কলামের "No Positive" **এবং** `Negative_Review` কলামের "No Negative" মানের কতটি সারি রয়েছে তা গণনা এবং প্রিন্ট করুন।
+
+ ```python
+ # with lambdas:
+ start = time.time()
+ no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1)
+ print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index)))
+
+ no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1)
+ print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index)))
+
+ both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1)
+ print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index)))
+ end = time.time()
+ print("Lambdas took " + str(round(end - start, 2)) + " seconds")
+
+ Number of No Negative reviews: 127890
+ Number of No Positive reviews: 35946
+ Number of both No Negative and No Positive reviews: 127
+ Lambdas took 9.64 seconds
+ ```
+
+## অন্য একটি উপায়
+
+Lambda ছাড়া আইটেম গণনা করার আরেকটি উপায় এবং সারি গণনা করতে sum ব্যবহার করুন:
+
+ ```python
+ # without lambdas (using a mixture of notations to show you can use both)
+ start = time.time()
+ no_negative_reviews = sum(df.Negative_Review == "No Negative")
+ print("Number of No Negative reviews: " + str(no_negative_reviews))
+
+ no_positive_reviews = sum(df["Positive_Review"] == "No Positive")
+ print("Number of No Positive reviews: " + str(no_positive_reviews))
+
+ both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive"))
+ print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews))
+
+ end = time.time()
+ print("Sum took " + str(round(end - start, 2)) + " seconds")
+
+ Number of No Negative reviews: 127890
+ Number of No Positive reviews: 35946
+ Number of both No Negative and No Positive reviews: 127
+ Sum took 0.19 seconds
+ ```
+
+ আপনি লক্ষ্য করতে পারেন যে `Negative_Review` এবং `Positive_Review` কলামের "No Negative" এবং "No Positive" মানের ১২৭টি সারি রয়েছে। এর মানে রিভিউয়ার হোটেলকে একটি সংখ্যাসূচক স্কোর দিয়েছেন, কিন্তু কোনও ইতিবাচক বা নেতিবাচক রিভিউ লিখতে অস্বীকার করেছেন। সৌভাগ্যক্রমে এটি একটি ছোট পরিমাণ সারি (৫১৫৭৩৮-এর মধ্যে ১২৭, বা ০.০২%), তাই এটি সম্ভবত আমাদের মডেল বা ফলাফলকে কোনও নির্দিষ্ট দিকে প্রভাবিত করবে না, তবে আপনি একটি রিভিউ ডেটাসেটে কোনও রিভিউ ছাড়া সারি থাকতে পারে তা আশা করেননি, তাই এটি অনুসন্ধান করা মূল্যবান।
+
+এখন আপনি ডেটাসেটটি অনুসন্ধান করেছেন, পরবর্তী পাঠে আপনি ডেটা ফিল্টার করবেন এবং কিছু অনুভূতি বিশ্লেষণ যোগ করবেন।
+
+---
+## 🚀চ্যালেঞ্জ
+
+এই পাঠটি দেখায়, যেমন আমরা আগের পাঠে দেখেছি, যে আপনার ডেটা এবং এর ত্রুটি বুঝতে কতটা গুরুত্বপূর্ণ। বিশেষত টেক্সট-ভিত্তিক ডেটা সাবধানে পরীক্ষা করা প্রয়োজন। বিভিন্ন টেক্সট-ভারী ডেটাসেট খনন করুন এবং দেখুন আপনি এমন ক্ষেত্রগুলি আবিষ্কার করতে পারেন কিনা যা একটি মডেলে পক্ষপাত বা বিকৃত অনুভূতি প্রবর্তন করতে পারে।
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/38/)
+
+## পর্যালোচনা এবং স্ব-অধ্যয়ন
+
+[NLP নিয়ে এই লার্নিং পাথটি](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) গ্রহণ করুন এবং টেক্সট-ভারী মডেল তৈরি করার সময় চেষ্টা করার জন্য টুলগুলি আবিষ্কার করুন।
+
+## অ্যাসাইনমেন্ট
+
+[NLTK](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/4-Hotel-Reviews-1/assignment.md b/translations/bn/6-NLP/4-Hotel-Reviews-1/assignment.md
new file mode 100644
index 000000000..c1e295be0
--- /dev/null
+++ b/translations/bn/6-NLP/4-Hotel-Reviews-1/assignment.md
@@ -0,0 +1,19 @@
+
+# এনএলটিকে
+
+## নির্দেশাবলী
+
+এনএলটিকে কম্পিউটেশনাল ভাষাতত্ত্ব এবং এনএলপি-তে ব্যবহারের জন্য একটি সুপরিচিত লাইব্রেরি। এই সুযোগটি কাজে লাগিয়ে '[এনএলটিকে বই](https://www.nltk.org/book/)' পড়ুন এবং এর অনুশীলনগুলো চেষ্টা করুন। এই গ্রেডবিহীন অ্যাসাইনমেন্টে, আপনি এই লাইব্রেরি সম্পর্কে আরও গভীরভাবে জানতে পারবেন।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/4-Hotel-Reviews-1/notebook.ipynb b/translations/bn/6-NLP/4-Hotel-Reviews-1/notebook.ipynb
new file mode 100644
index 000000000..e69de29bb
diff --git a/translations/bn/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md b/translations/bn/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md
new file mode 100644
index 000000000..2d6b40095
--- /dev/null
+++ b/translations/bn/6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/4-Hotel-Reviews-1/solution/R/README.md b/translations/bn/6-NLP/4-Hotel-Reviews-1/solution/R/README.md
new file mode 100644
index 000000000..195cbbd78
--- /dev/null
+++ b/translations/bn/6-NLP/4-Hotel-Reviews-1/solution/R/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb b/translations/bn/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb
new file mode 100644
index 000000000..6ff85ff17
--- /dev/null
+++ b/translations/bn/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb
@@ -0,0 +1,174 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": 3
+ },
+ "orig_nbformat": 4,
+ "coopTranslator": {
+ "original_hash": "2d05e7db439376aa824f4b387f8324ca",
+ "translation_date": "2025-08-30T00:14:30+00:00",
+ "source_file": "6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# EDA\n",
+ "import pandas as pd\n",
+ "import time"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def get_difference_review_avg(row):\n",
+ " return row[\"Average_Score\"] - row[\"Calc_Average_Score\"]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load the hotel reviews from CSV\n",
+ "print(\"Loading data file now, this could take a while depending on file size\")\n",
+ "start = time.time()\n",
+ "df = pd.read_csv('../../data/Hotel_Reviews.csv')\n",
+ "end = time.time()\n",
+ "print(\"Loading took \" + str(round(end - start, 2)) + \" seconds\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# What shape is the data (rows, columns)?\n",
+ "print(\"The shape of the data (rows, cols) is \" + str(df.shape))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# value_counts() creates a Series object that has index and values\n",
+ "# in this case, the country and the frequency they occur in reviewer nationality\n",
+ "nationality_freq = df[\"Reviewer_Nationality\"].value_counts()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# What reviewer nationality is the most common in the dataset?\n",
+ "print(\"The highest frequency reviewer nationality is \" + str(nationality_freq.index[0]).strip() + \" with \" + str(nationality_freq[0]) + \" reviews.\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# What is the top 10 most common nationalities and their frequencies?\n",
+ "print(\"The top 10 highest frequency reviewer nationalities are:\")\n",
+ "print(nationality_freq[0:10].to_string())\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# How many unique nationalities are there?\n",
+ "print(\"There are \" + str(nationality_freq.index.size) + \" unique nationalities in the dataset\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# What was the most frequently reviewed hotel for the top 10 nationalities - print the hotel and number of reviews\n",
+ "for nat in nationality_freq[:10].index:\n",
+ " # First, extract all the rows that match the criteria into a new dataframe\n",
+ " nat_df = df[df[\"Reviewer_Nationality\"] == nat] \n",
+ " # Now get the hotel freq\n",
+ " freq = nat_df[\"Hotel_Name\"].value_counts()\n",
+ " print(\"The most reviewed hotel for \" + str(nat).strip() + \" was \" + str(freq.index[0]) + \" with \" + str(freq[0]) + \" reviews.\") \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# How many reviews are there per hotel (frequency count of hotel) and do the results match the value in `Total_Number_of_Reviews`?\n",
+ "# First create a new dataframe based on the old one, removing the uneeded columns\n",
+ "hotel_freq_df = df.drop([\"Hotel_Address\", \"Additional_Number_of_Scoring\", \"Review_Date\", \"Average_Score\", \"Reviewer_Nationality\", \"Negative_Review\", \"Review_Total_Negative_Word_Counts\", \"Positive_Review\", \"Review_Total_Positive_Word_Counts\", \"Total_Number_of_Reviews_Reviewer_Has_Given\", \"Reviewer_Score\", \"Tags\", \"days_since_review\", \"lat\", \"lng\"], axis = 1)\n",
+ "# Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found\n",
+ "hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')\n",
+ "# Get rid of all the duplicated rows\n",
+ "hotel_freq_df = hotel_freq_df.drop_duplicates(subset = [\"Hotel_Name\"])\n",
+ "print()\n",
+ "print(hotel_freq_df.to_string())\n",
+ "print(str(hotel_freq_df.shape))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# While there is an `Average_Score` for each hotel according to the dataset, \n",
+ "# you can also calculate an average score (getting the average of all reviewer scores in the dataset for each hotel)\n",
+ "# Add a new column to your dataframe with the column header `Calc_Average_Score` that contains that calculated average. \n",
+ "df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)\n",
+ "# Add a new column with the difference between the two average scores\n",
+ "df[\"Average_Score_Difference\"] = df.apply(get_difference_review_avg, axis = 1)\n",
+ "# Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel)\n",
+ "review_scores_df = df.drop_duplicates(subset = [\"Hotel_Name\"])\n",
+ "# Sort the dataframe to find the lowest and highest average score difference\n",
+ "review_scores_df = review_scores_df.sort_values(by=[\"Average_Score_Difference\"])\n",
+ "print(review_scores_df[[\"Average_Score_Difference\", \"Average_Score\", \"Calc_Average_Score\", \"Hotel_Name\"]])\n",
+ "# Do any hotels have the same (rounded to 1 decimal place) `Average_Score` and `Calc_Average_Score`?\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/6-NLP/5-Hotel-Reviews-2/README.md b/translations/bn/6-NLP/5-Hotel-Reviews-2/README.md
new file mode 100644
index 000000000..ead54e5ea
--- /dev/null
+++ b/translations/bn/6-NLP/5-Hotel-Reviews-2/README.md
@@ -0,0 +1,389 @@
+
+# হোটেল রিভিউ দিয়ে সেন্টিমেন্ট অ্যানালাইসিস
+
+আপনি ইতিমধ্যে ডেটাসেটটি বিস্তারিতভাবে অন্বেষণ করেছেন, এখন সময় এসেছে কলামগুলো ফিল্টার করার এবং NLP প্রযুক্তি ব্যবহার করে হোটেল সম্পর্কে নতুন অন্তর্দৃষ্টি লাভ করার।
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/39/)
+
+### ফিল্টারিং এবং সেন্টিমেন্ট অ্যানালাইসিস অপারেশন
+
+আপনি হয়তো লক্ষ্য করেছেন, ডেটাসেটে কিছু সমস্যা রয়েছে। কিছু কলামে অপ্রয়োজনীয় তথ্য রয়েছে, অন্যগুলো ভুল মনে হচ্ছে। যদি সেগুলো সঠিকও হয়, তাহলে কীভাবে সেগুলো গণনা করা হয়েছে তা অস্পষ্ট, এবং আপনার নিজস্ব গণনার মাধ্যমে উত্তরগুলো স্বাধীনভাবে যাচাই করা সম্ভব নয়।
+
+## অনুশীলন: আরও কিছু ডেটা প্রসেসিং
+
+ডেটা আরও একটু পরিষ্কার করুন। এমন কলাম যোগ করুন যা পরে কাজে লাগবে, অন্য কলামের মান পরিবর্তন করুন, এবং কিছু কলাম সম্পূর্ণভাবে বাদ দিন।
+
+1. প্রাথমিক কলাম প্রসেসিং
+
+ 1. `lat` এবং `lng` বাদ দিন
+
+ 2. `Hotel_Address` এর মানগুলো নিম্নলিখিত মানগুলো দিয়ে প্রতিস্থাপন করুন (যদি ঠিকানায় শহর এবং দেশের নাম থাকে, তাহলে শুধুমাত্র শহর এবং দেশ রাখুন)।
+
+ ডেটাসেটে শুধুমাত্র এই শহর এবং দেশগুলো রয়েছে:
+
+ আমস্টারডাম, নেদারল্যান্ডস
+
+ বার্সেলোনা, স্পেন
+
+ লন্ডন, যুক্তরাজ্য
+
+ মিলান, ইতালি
+
+ প্যারিস, ফ্রান্স
+
+ ভিয়েনা, অস্ট্রিয়া
+
+ ```python
+ def replace_address(row):
+ if "Netherlands" in row["Hotel_Address"]:
+ return "Amsterdam, Netherlands"
+ elif "Barcelona" in row["Hotel_Address"]:
+ return "Barcelona, Spain"
+ elif "United Kingdom" in row["Hotel_Address"]:
+ return "London, United Kingdom"
+ elif "Milan" in row["Hotel_Address"]:
+ return "Milan, Italy"
+ elif "France" in row["Hotel_Address"]:
+ return "Paris, France"
+ elif "Vienna" in row["Hotel_Address"]:
+ return "Vienna, Austria"
+
+ # Replace all the addresses with a shortened, more useful form
+ df["Hotel_Address"] = df.apply(replace_address, axis = 1)
+ # The sum of the value_counts() should add up to the total number of reviews
+ print(df["Hotel_Address"].value_counts())
+ ```
+
+ এখন আপনি দেশ-স্তরের ডেটা কুয়েরি করতে পারেন:
+
+ ```python
+ display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"}))
+ ```
+
+ | Hotel_Address | Hotel_Name |
+ | :--------------------- | :--------: |
+ | Amsterdam, Netherlands | 105 |
+ | Barcelona, Spain | 211 |
+ | London, United Kingdom | 400 |
+ | Milan, Italy | 162 |
+ | Paris, France | 458 |
+ | Vienna, Austria | 158 |
+
+2. হোটেল মেটা-রিভিউ কলাম প্রসেসিং
+
+ 1. `Additional_Number_of_Scoring` বাদ দিন
+
+ 1. `Total_Number_of_Reviews` প্রতিস্থাপন করুন সেই হোটেলের জন্য ডেটাসেটে থাকা মোট রিভিউ সংখ্যা দিয়ে
+
+ 1. `Average_Score` আমাদের নিজস্ব গণনা করা স্কোর দিয়ে প্রতিস্থাপন করুন
+
+ ```python
+ # Drop `Additional_Number_of_Scoring`
+ df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True)
+ # Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values
+ df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')
+ df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
+ ```
+
+3. রিভিউ কলাম প্রসেসিং
+
+ 1. `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` এবং `days_since_review` বাদ দিন
+
+ 2. `Reviewer_Score`, `Negative_Review`, এবং `Positive_Review` যেমন আছে তেমনই রাখুন,
+
+ 3. `Tags` আপাতত রাখুন
+
+ - আমরা পরবর্তী অংশে ট্যাগগুলোর উপর আরও কিছু ফিল্টারিং অপারেশন করব এবং তারপর ট্যাগগুলো বাদ দেওয়া হবে
+
+4. রিভিউয়ার কলাম প্রসেসিং
+
+ 1. `Total_Number_of_Reviews_Reviewer_Has_Given` বাদ দিন
+
+ 2. `Reviewer_Nationality` রাখুন
+
+### ট্যাগ কলাম
+
+`Tag` কলামটি সমস্যাযুক্ত কারণ এটি একটি তালিকা (টেক্সট আকারে) যা কলামে সংরক্ষিত। দুর্ভাগ্যবশত এই কলামের উপ-অংশগুলোর ক্রম এবং সংখ্যা সবসময় একই থাকে না। ৫১৫,০০০টি সারি এবং ১৪২৭টি হোটেল রয়েছে, এবং প্রতিটি রিভিউয়ারের জন্য কিছুটা ভিন্ন অপশন থাকে, যা মানুষের জন্য সঠিক বাক্যাংশ চিহ্নিত করা কঠিন করে তোলে। এখানেই NLP কার্যকর। আপনি টেক্সট স্ক্যান করতে পারেন এবং সবচেয়ে সাধারণ বাক্যাংশগুলো খুঁজে বের করতে পারেন এবং সেগুলো গণনা করতে পারেন।
+
+দুর্ভাগ্যবশত, আমরা একক শব্দে আগ্রহী নই, বরং বহু-শব্দের বাক্যাংশে (যেমন *Business trip*)। এত বড় ডেটাতে (৬৭৬২৬৪৬টি শব্দ) একটি বহু-শব্দের ফ্রিকোয়েন্সি ডিস্ট্রিবিউশন অ্যালগরিদম চালানো অত্যন্ত সময়সাপেক্ষ হতে পারে, তবে ডেটা না দেখে মনে হবে এটি একটি প্রয়োজনীয় ব্যয়। এখানেই এক্সপ্লোরেটরি ডেটা অ্যানালাইসিস কাজে আসে, কারণ আপনি ট্যাগগুলোর একটি নমুনা যেমন `[' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device ']` দেখেছেন, আপনি প্রশ্ন করতে পারেন যে প্রক্রিয়াটি উল্লেখযোগ্যভাবে কমানো সম্ভব কিনা। সৌভাগ্যক্রমে, এটি সম্ভব - তবে প্রথমে আপনাকে কিছু ধাপ অনুসরণ করতে হবে যাতে আগ্রহের ট্যাগগুলো নিশ্চিত করা যায়।
+
+### ট্যাগ ফিল্টারিং
+
+মনে রাখবেন যে ডেটাসেটের লক্ষ্য হলো সেন্টিমেন্ট এবং এমন কলাম যোগ করা যা আপনাকে সেরা হোটেল বেছে নিতে সাহায্য করবে (আপনার জন্য বা হয়তো কোনো ক্লায়েন্টের জন্য যে আপনাকে একটি হোটেল রিকমেন্ডেশন বট তৈরি করতে বলেছে)। আপনাকে নিজেকে জিজ্ঞাসা করতে হবে যে ট্যাগগুলো চূড়ান্ত ডেটাসেটে উপযোগী কিনা। এখানে একটি ব্যাখ্যা দেওয়া হলো (যদি আপনার ডেটাসেটের প্রয়োজন অন্য কারণে হয়, তাহলে ভিন্ন ট্যাগগুলো থাকতে পারে/বাদ দেওয়া হতে পারে):
+
+1. ট্রিপের ধরন প্রাসঙ্গিক, এবং এটি রাখা উচিত
+2. অতিথি দলের ধরন গুরুত্বপূর্ণ, এবং এটি রাখা উচিত
+3. অতিথি যে রুম, স্যুট, বা স্টুডিওতে থেকেছে তা অপ্রাসঙ্গিক (সব হোটেলে মূলত একই রকম রুম থাকে)
+4. রিভিউ যে ডিভাইসে জমা দেওয়া হয়েছে তা অপ্রাসঙ্গিক
+5. রিভিউয়ার কত রাত থেকেছেন তা *প্রাসঙ্গিক* হতে পারে যদি আপনি দীর্ঘ সময় থাকার সঙ্গে হোটেল পছন্দ করার সম্পর্ক স্থাপন করেন, তবে এটি একটি অনুমান, এবং সম্ভবত অপ্রাসঙ্গিক
+
+সংক্ষেপে, **২ ধরনের ট্যাগ রাখুন এবং অন্যগুলো সরিয়ে দিন**।
+
+প্রথমে, আপনি ট্যাগগুলো গণনা করতে চান না যতক্ষণ না সেগুলো আরও ভালো ফরম্যাটে থাকে, তাই স্কয়ার ব্র্যাকেট এবং কোটেশন চিহ্ন সরিয়ে ফেলুন। এটি করার জন্য বিভিন্ন উপায় রয়েছে, তবে আপনি দ্রুততম উপায়টি চান কারণ এটি অনেক ডেটা প্রক্রিয়া করতে দীর্ঘ সময় নিতে পারে। সৌভাগ্যক্রমে, pandas-এর একটি সহজ উপায় রয়েছে প্রতিটি ধাপ সম্পন্ন করার।
+
+```Python
+# Remove opening and closing brackets
+df.Tags = df.Tags.str.strip("[']")
+# remove all quotes too
+df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)
+```
+
+প্রতিটি ট্যাগ এমন কিছু হয়ে যায়: `Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device`।
+
+এরপর একটি সমস্যা দেখা দেয়। কিছু রিভিউ বা সারিতে ৫টি কলাম থাকে, কিছুতে ৩টি, কিছুতে ৬টি। এটি ডেটাসেট তৈরির ফলাফল এবং এটি ঠিক করা কঠিন। আপনি প্রতিটি বাক্যাংশের ফ্রিকোয়েন্সি গণনা করতে চান, তবে সেগুলো প্রতিটি রিভিউতে ভিন্ন ক্রমে থাকে, তাই গণনা ভুল হতে পারে, এবং একটি হোটেল একটি ট্যাগ পেতে পারে না যা এটি প্রাপ্য ছিল।
+
+এর পরিবর্তে আপনি ভিন্ন ক্রমকে আমাদের সুবিধায় ব্যবহার করবেন, কারণ প্রতিটি ট্যাগ বহু-শব্দের হলেও কমা দিয়ে পৃথক করা হয়েছে! এর সহজতম উপায় হলো ৬টি অস্থায়ী কলাম তৈরি করা যেখানে প্রতিটি ট্যাগ তার ক্রম অনুযায়ী কলামে প্রবেশ করানো হবে। এরপর আপনি ৬টি কলাম একত্রিত করে একটি বড় কলামে পরিণত করবেন এবং `value_counts()` পদ্ধতি চালাবেন। এটি প্রিন্ট করলে আপনি দেখতে পাবেন ২৪২৮টি ইউনিক ট্যাগ ছিল। এখানে একটি ছোট নমুনা:
+
+| Tag | Count |
+| ------------------------------ | ------ |
+| Leisure trip | 417778 |
+| Submitted from a mobile device | 307640 |
+| Couple | 252294 |
+| Stayed 1 night | 193645 |
+| Stayed 2 nights | 133937 |
+| Solo traveler | 108545 |
+| Stayed 3 nights | 95821 |
+| Business trip | 82939 |
+| Group | 65392 |
+| Family with young children | 61015 |
+| Stayed 4 nights | 47817 |
+| Double Room | 35207 |
+| Standard Double Room | 32248 |
+| Superior Double Room | 31393 |
+| Family with older children | 26349 |
+| Deluxe Double Room | 24823 |
+| Double or Twin Room | 22393 |
+| Stayed 5 nights | 20845 |
+| Standard Double or Twin Room | 17483 |
+| Classic Double Room | 16989 |
+| Superior Double or Twin Room | 13570 |
+| 2 rooms | 12393 |
+
+`Submitted from a mobile device` এর মতো কিছু সাধারণ ট্যাগ আমাদের কোনো কাজে আসে না, তাই এটি গণনা করার আগে সরিয়ে দেওয়া বুদ্ধিমানের কাজ হতে পারে, তবে এটি এত দ্রুত অপারেশন যে আপনি সেগুলো রেখে দিতে পারেন এবং উপেক্ষা করতে পারেন।
+
+### থাকার সময়ের ট্যাগ সরানো
+
+এই ট্যাগগুলো সরানো প্রথম ধাপ, এটি বিবেচনার জন্য ট্যাগের মোট সংখ্যা সামান্য কমিয়ে দেয়। মনে রাখবেন আপনি সেগুলো ডেটাসেট থেকে সরাচ্ছেন না, শুধু রিভিউ ডেটাসেটে গণনা/রাখার জন্য বিবেচনা থেকে সরাচ্ছেন।
+
+| Length of stay | Count |
+| ---------------- | ------ |
+| Stayed 1 night | 193645 |
+| Stayed 2 nights | 133937 |
+| Stayed 3 nights | 95821 |
+| Stayed 4 nights | 47817 |
+| Stayed 5 nights | 20845 |
+| Stayed 6 nights | 9776 |
+| Stayed 7 nights | 7399 |
+| Stayed 8 nights | 2502 |
+| Stayed 9 nights | 1293 |
+| ... | ... |
+
+রুম, স্যুট, স্টুডিও, অ্যাপার্টমেন্ট ইত্যাদির একটি বিশাল বৈচিত্র্য রয়েছে। এগুলো সবই মূলত একই জিনিস বোঝায় এবং আপনার জন্য প্রাসঙ্গিক নয়, তাই সেগুলো বিবেচনা থেকে সরিয়ে দিন।
+
+| Type of room | Count |
+| ----------------------------- | ----- |
+| Double Room | 35207 |
+| Standard Double Room | 32248 |
+| Superior Double Room | 31393 |
+| Deluxe Double Room | 24823 |
+| Double or Twin Room | 22393 |
+| Standard Double or Twin Room | 17483 |
+| Classic Double Room | 16989 |
+| Superior Double or Twin Room | 13570 |
+
+শেষে, এবং এটি আনন্দদায়ক (কারণ এটি খুব বেশি প্রসেসিং নেয়নি), আপনি নিম্নলিখিত *উপযোগী* ট্যাগগুলো পাবেন:
+
+| Tag | Count |
+| --------------------------------------------- | ------ |
+| Leisure trip | 417778 |
+| Couple | 252294 |
+| Solo traveler | 108545 |
+| Business trip | 82939 |
+| Group (combined with Travellers with friends) | 67535 |
+| Family with young children | 61015 |
+| Family with older children | 26349 |
+| With a pet | 1405 |
+
+আপনি যুক্তি দিতে পারেন যে `Travellers with friends` মূলত `Group` এর সমান এবং এটি একত্রিত করা উচিত, এবং এটি উপরের মতো একত্রিত করা ন্যায্য হবে। সঠিক ট্যাগ চিহ্নিত করার কোডটি [Tags notebook](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) এ রয়েছে।
+
+শেষ ধাপ হলো প্রতিটি ট্যাগের জন্য নতুন কলাম তৈরি করা। এরপর, প্রতিটি রিভিউ সারির জন্য, যদি `Tag` কলামটি নতুন কলামের একটির সঙ্গে মিলে যায়, তাহলে ১ যোগ করুন, যদি না মিলে, তাহলে ০ যোগ করুন। চূড়ান্ত ফলাফল হবে কতজন রিভিউয়ার এই হোটেলটি (সমষ্টিগতভাবে) ব্যবসা বনাম অবসর, বা একটি পোষা প্রাণী নিয়ে আসার জন্য বেছে নিয়েছেন তার একটি গণনা, এবং এটি একটি হোটেল সুপারিশ করার সময় উপযোগী তথ্য।
+
+```python
+# Process the Tags into new columns
+# The file Hotel_Reviews_Tags.py, identifies the most important tags
+# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends,
+# Family with young children, Family with older children, With a pet
+df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0)
+df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0)
+df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0)
+df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0)
+df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0)
+df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0)
+df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0)
+df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0)
+
+```
+
+### আপনার ফাইল সংরক্ষণ করুন
+
+শেষে, ডেটাসেটটি এখন যেমন আছে তেমনই একটি নতুন নামে সংরক্ষণ করুন।
+
+```python
+df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True)
+
+# Saving new data file with calculated columns
+print("Saving results to Hotel_Reviews_Filtered.csv")
+df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False)
+```
+
+## সেন্টিমেন্ট অ্যানালাইসিস অপারেশন
+
+এই চূড়ান্ত অংশে, আপনি রিভিউ কলামগুলোর উপর সেন্টিমেন্ট অ্যানালাইসিস প্রয়োগ করবেন এবং ফলাফলগুলো একটি ডেটাসেটে সংরক্ষণ করবেন।
+
+## অনুশীলন: ফিল্টার করা ডেটা লোড এবং সংরক্ষণ করুন
+
+মনে রাখবেন এখন আপনি পূর্ববর্তী অংশে সংরক্ষিত ফিল্টার করা ডেটাসেটটি লোড করছেন, **মূল ডেটাসেটটি নয়**।
+
+```python
+import time
+import pandas as pd
+import nltk as nltk
+from nltk.corpus import stopwords
+from nltk.sentiment.vader import SentimentIntensityAnalyzer
+nltk.download('vader_lexicon')
+
+# Load the filtered hotel reviews from CSV
+df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')
+
+# You code will be added here
+
+
+# Finally remember to save the hotel reviews with new NLP data added
+print("Saving results to Hotel_Reviews_NLP.csv")
+df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False)
+```
+
+### স্টপ ওয়ার্ড সরানো
+
+যদি আপনি `Negative` এবং `Positive` রিভিউ কলামগুলোর উপর সেন্টিমেন্ট অ্যানালাইসিস চালান, এটি দীর্ঘ সময় নিতে পারে। একটি শক্তিশালী টেস্ট ল্যাপটপে দ্রুত CPU সহ পরীক্ষা করা হলে, এটি ১২ - ১৪ মিনিট সময় নিয়েছে, নির্ভর করে কোন সেন্টিমেন্ট লাইব্রেরি ব্যবহার করা হয়েছে। এটি একটি (আপেক্ষিকভাবে) দীর্ঘ সময়, তাই এটি দ্রুত করা সম্ভব কিনা তা তদন্ত করা মূল্যবান।
+
+স্টপ ওয়ার্ড সরানো, বা সাধারণ ইংরেজি শব্দগুলো যা একটি বাক্যের সেন্টিমেন্ট পরিবর্তন করে না, প্রথম ধাপ। এগুলো সরিয়ে দিলে সেন্টিমেন্ট অ্যানালাইসিস দ্রুত চলা উচিত, তবে কম সঠিক হবে না (কারণ স্টপ ওয়ার্ডগুলো সেন্টিমেন্টকে প্রভাবিত করে না, তবে সেগুলো অ্যানালাইসিসকে ধীর করে দেয়)।
+
+সবচেয়ে দীর্ঘ `Negative` রিভিউ ছিল ৩৯৫টি শব্দ, তবে স্টপ ওয়ার্ড সরানোর পর এটি ১৯৫টি শব্দ।
+
+স্টপ ওয়ার্ড সরানো একটি দ্রুত অপারেশন, ২টি রিভিউ কলাম থেকে ৫১৫,০০০টি সারির স্টপ ওয়ার্ড সরাতে টেস্ট ডিভাইসে ৩.৩ সেকেন্ড সময় লেগেছে। আপনার ডিভাইসের CPU স্পিড, RAM, SSD আছে কিনা, এবং অন্যান্য কিছু ফ্যাক্টরের উপর নির্ভর করে এটি সামান্য বেশি বা কম সময় নিতে পারে। অপারেশনটি আপেক্ষিকভাবে সংক্ষিপ্ত হওয়ায়, যদি এটি সেন্টিমেন্ট অ্যানালাইসিসের সময় উন্নত করে, তাহলে এটি করা মূল্যবান।
+
+```python
+from nltk.corpus import stopwords
+
+# Load the hotel reviews from CSV
+df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv")
+
+# Remove stop words - can be slow for a lot of text!
+# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches
+# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends
+start = time.time()
+cache = set(stopwords.words("english"))
+def remove_stopwords(review):
+ text = " ".join([word for word in review.split() if word not in cache])
+ return text
+
+# Remove the stop words from both columns
+df.Negative_Review = df.Negative_Review.apply(remove_stopwords)
+df.Positive_Review = df.Positive_Review.apply(remove_stopwords)
+```
+
+### সেন্টিমেন্ট অ্যানালাইসিস সম্পাদন করা
+এখন আপনাকে নেতিবাচক এবং ইতিবাচক রিভিউ কলামগুলোর জন্য সেন্টিমেন্ট বিশ্লেষণ গণনা করতে হবে এবং ফলাফল দুটি নতুন কলামে সংরক্ষণ করতে হবে। সেন্টিমেন্টের পরীক্ষা হবে এটি রিভিউয়ারের স্কোরের সাথে তুলনা করা। উদাহরণস্বরূপ, যদি সেন্টিমেন্ট বিশ্লেষণ নেতিবাচক রিভিউতে ১ (অত্যন্ত ইতিবাচক সেন্টিমেন্ট) এবং ইতিবাচক রিভিউতে ১ দেখায়, কিন্তু রিভিউয়ার হোটেলকে সর্বনিম্ন স্কোর দেয়, তাহলে হয় রিভিউ টেক্সট স্কোরের সাথে মেলে না, অথবা সেন্টিমেন্ট বিশ্লেষক সঠিকভাবে সেন্টিমেন্ট চিনতে পারেনি। কিছু সেন্টিমেন্ট স্কোর সম্পূর্ণ ভুল হতে পারে, এবং তা ব্যাখ্যা করা সম্ভব হবে, যেমন রিভিউটি অত্যন্ত ব্যঙ্গাত্মক হতে পারে "অবশ্যই আমি গরম ছাড়া একটি রুমে ঘুমাতে ভালোবাসি" এবং সেন্টিমেন্ট বিশ্লেষক এটিকে ইতিবাচক সেন্টিমেন্ট মনে করে, যদিও একজন মানুষ এটি পড়লে বুঝতে পারবে এটি ব্যঙ্গ।
+
+NLTK বিভিন্ন সেন্টিমেন্ট বিশ্লেষক সরবরাহ করে যা দিয়ে শিখতে পারেন, এবং আপনি সেগুলো পরিবর্তন করে দেখতে পারেন সেন্টিমেন্ট আরও সঠিক কিনা। এখানে VADER সেন্টিমেন্ট বিশ্লেষণ ব্যবহার করা হয়েছে।
+
+> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
+
+```python
+from nltk.sentiment.vader import SentimentIntensityAnalyzer
+
+# Create the vader sentiment analyser (there are others in NLTK you can try too)
+vader_sentiment = SentimentIntensityAnalyzer()
+# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
+
+# There are 3 possibilities of input for a review:
+# It could be "No Negative", in which case, return 0
+# It could be "No Positive", in which case, return 0
+# It could be a review, in which case calculate the sentiment
+def calc_sentiment(review):
+ if review == "No Negative" or review == "No Positive":
+ return 0
+ return vader_sentiment.polarity_scores(review)["compound"]
+```
+
+পরবর্তীতে আপনার প্রোগ্রামে যখন সেন্টিমেন্ট গণনা করতে প্রস্তুত হবেন, তখন এটি প্রতিটি রিভিউতে প্রয়োগ করতে পারেন নিম্নলিখিতভাবে:
+
+```python
+# Add a negative sentiment and positive sentiment column
+print("Calculating sentiment columns for both positive and negative reviews")
+start = time.time()
+df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment)
+df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment)
+end = time.time()
+print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds")
+```
+
+এটি আমার কম্পিউটারে প্রায় ১২০ সেকেন্ড সময় নেয়, তবে এটি প্রতিটি কম্পিউটারে ভিন্ন হতে পারে। যদি আপনি ফলাফল প্রিন্ট করতে চান এবং দেখতে চান সেন্টিমেন্ট রিভিউয়ের সাথে মেলে কিনা:
+
+```python
+df = df.sort_values(by=["Negative_Sentiment"], ascending=True)
+print(df[["Negative_Review", "Negative_Sentiment"]])
+df = df.sort_values(by=["Positive_Sentiment"], ascending=True)
+print(df[["Positive_Review", "Positive_Sentiment"]])
+```
+
+চ্যালেঞ্জে ব্যবহারের আগে ফাইলটির সাথে করার শেষ কাজটি হলো এটি সংরক্ষণ করা! আপনার নতুন কলামগুলো পুনরায় সাজানোর কথাও বিবেচনা করা উচিত যাতে সেগুলো কাজ করার জন্য সহজ হয় (মানুষের জন্য, এটি একটি কসমেটিক পরিবর্তন)।
+
+```python
+# Reorder the columns (This is cosmetic, but to make it easier to explore the data later)
+df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1)
+
+print("Saving results to Hotel_Reviews_NLP.csv")
+df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False)
+```
+
+আপনার পুরো কোডটি চালানো উচিত [বিশ্লেষণ নোটবুকের](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) জন্য (যখন আপনি [ফিল্টারিং নোটবুকটি](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) চালিয়েছেন Hotel_Reviews_Filtered.csv ফাইলটি তৈরি করতে)।
+
+পুনরায় দেখুন, ধাপগুলো হলো:
+
+1. মূল ডেটাসেট ফাইল **Hotel_Reviews.csv** আগের পাঠে [এক্সপ্লোরার নোটবুকের](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb) মাধ্যমে অন্বেষণ করা হয়েছে।
+2. Hotel_Reviews.csv ফাইলটি [ফিল্টারিং নোটবুকের](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) মাধ্যমে ফিল্টার করা হয়েছে, যার ফলে **Hotel_Reviews_Filtered.csv** তৈরি হয়েছে।
+3. Hotel_Reviews_Filtered.csv ফাইলটি [সেন্টিমেন্ট বিশ্লেষণ নোটবুকের](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) মাধ্যমে প্রক্রিয়াজাত করা হয়েছে, যার ফলে **Hotel_Reviews_NLP.csv** তৈরি হয়েছে।
+4. NLP চ্যালেঞ্জে নিচে Hotel_Reviews_NLP.csv ব্যবহার করুন।
+
+### উপসংহার
+
+যখন আপনি শুরু করেছিলেন, তখন আপনার কাছে কলাম এবং ডেটাসহ একটি ডেটাসেট ছিল, কিন্তু এর সবকিছু যাচাই বা ব্যবহার করা সম্ভব ছিল না। আপনি ডেটা অন্বেষণ করেছেন, যা প্রয়োজন নেই তা ফিল্টার করেছেন, ট্যাগগুলোকে কিছু উপযোগী জিনিসে রূপান্তর করেছেন, নিজের গড় গণনা করেছেন, কিছু সেন্টিমেন্ট কলাম যোগ করেছেন এবং আশা করি, প্রাকৃতিক টেক্সট প্রক্রিয়াকরণ সম্পর্কে কিছু আকর্ষণীয় জিনিস শিখেছেন।
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/40/)
+
+## চ্যালেঞ্জ
+
+এখন যেহেতু আপনার ডেটাসেট সেন্টিমেন্টের জন্য বিশ্লেষণ করা হয়েছে, দেখুন আপনি এই পাঠ্যক্রমে শেখা কৌশলগুলো (সম্ভবত ক্লাস্টারিং?) ব্যবহার করে সেন্টিমেন্টের চারপাশে প্যাটার্ন নির্ধারণ করতে পারেন কিনা।
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+[এই লার্ন মডিউলটি](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) নিন আরও জানতে এবং টেক্সটে সেন্টিমেন্ট অন্বেষণ করতে বিভিন্ন টুল ব্যবহার করতে।
+
+## অ্যাসাইনমেন্ট
+
+[একটি ভিন্ন ডেটাসেট চেষ্টা করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/5-Hotel-Reviews-2/assignment.md b/translations/bn/6-NLP/5-Hotel-Reviews-2/assignment.md
new file mode 100644
index 000000000..515a03868
--- /dev/null
+++ b/translations/bn/6-NLP/5-Hotel-Reviews-2/assignment.md
@@ -0,0 +1,25 @@
+
+# একটি ভিন্ন ডেটাসেট চেষ্টা করুন
+
+## নির্দেশাবলী
+
+এখন যেহেতু আপনি NLTK ব্যবহার করে টেক্সটে অনুভূতি নির্ধারণ করার পদ্ধতি শিখেছেন, একটি ভিন্ন ডেটাসেট চেষ্টা করুন। সম্ভবত আপনাকে এটি নিয়ে কিছু ডেটা প্রক্রিয়াকরণ করতে হবে, তাই একটি নোটবুক তৈরি করুন এবং আপনার চিন্তার প্রক্রিয়া নথিভুক্ত করুন। আপনি কী আবিষ্কার করেন?
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ---------------------- |
+| | একটি সম্পূর্ণ নোটবুক এবং ডেটাসেট উপস্থাপন করা হয়েছে, যেখানে সেলগুলো ভালোভাবে নথিভুক্ত করা হয়েছে এবং অনুভূতি কীভাবে নির্ধারণ করা হয়েছে তা ব্যাখ্যা করা হয়েছে | নোটবুকে ভালো ব্যাখ্যার অভাব রয়েছে | নোটবুকটি ত্রুটিপূর্ণ |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/5-Hotel-Reviews-2/notebook.ipynb b/translations/bn/6-NLP/5-Hotel-Reviews-2/notebook.ipynb
new file mode 100644
index 000000000..e69de29bb
diff --git a/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb
new file mode 100644
index 000000000..27bebb7f2
--- /dev/null
+++ b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb
@@ -0,0 +1,172 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 4,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "coopTranslator": {
+ "original_hash": "033cb89c85500224b3c63fd04f49b4aa",
+ "translation_date": "2025-08-30T00:14:55+00:00",
+ "source_file": "6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import time\n",
+ "import ast"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def replace_address(row):\n",
+ " if \"Netherlands\" in row[\"Hotel_Address\"]:\n",
+ " return \"Amsterdam, Netherlands\"\n",
+ " elif \"Barcelona\" in row[\"Hotel_Address\"]:\n",
+ " return \"Barcelona, Spain\"\n",
+ " elif \"United Kingdom\" in row[\"Hotel_Address\"]:\n",
+ " return \"London, United Kingdom\"\n",
+ " elif \"Milan\" in row[\"Hotel_Address\"]: \n",
+ " return \"Milan, Italy\"\n",
+ " elif \"France\" in row[\"Hotel_Address\"]:\n",
+ " return \"Paris, France\"\n",
+ " elif \"Vienna\" in row[\"Hotel_Address\"]:\n",
+ " return \"Vienna, Austria\" \n",
+ " else:\n",
+ " return row.Hotel_Address\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load the hotel reviews from CSV\n",
+ "start = time.time()\n",
+ "df = pd.read_csv('../../data/Hotel_Reviews.csv')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# dropping columns we will not use:\n",
+ "df.drop([\"lat\", \"lng\"], axis = 1, inplace=True)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Replace all the addresses with a shortened, more useful form\n",
+ "df[\"Hotel_Address\"] = df.apply(replace_address, axis = 1)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Drop `Additional_Number_of_Scoring`\n",
+ "df.drop([\"Additional_Number_of_Scoring\"], axis = 1, inplace=True)\n",
+ "# Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values\n",
+ "df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')\n",
+ "df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Process the Tags into new columns\n",
+ "# The file Hotel_Reviews_Tags.py, identifies the most important tags\n",
+ "# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends, \n",
+ "# Family with young children, Family with older children, With a pet\n",
+ "df[\"Leisure_trip\"] = df.Tags.apply(lambda tag: 1 if \"Leisure trip\" in tag else 0)\n",
+ "df[\"Couple\"] = df.Tags.apply(lambda tag: 1 if \"Couple\" in tag else 0)\n",
+ "df[\"Solo_traveler\"] = df.Tags.apply(lambda tag: 1 if \"Solo traveler\" in tag else 0)\n",
+ "df[\"Business_trip\"] = df.Tags.apply(lambda tag: 1 if \"Business trip\" in tag else 0)\n",
+ "df[\"Group\"] = df.Tags.apply(lambda tag: 1 if \"Group\" in tag or \"Travelers with friends\" in tag else 0)\n",
+ "df[\"Family_with_young_children\"] = df.Tags.apply(lambda tag: 1 if \"Family with young children\" in tag else 0)\n",
+ "df[\"Family_with_older_children\"] = df.Tags.apply(lambda tag: 1 if \"Family with older children\" in tag else 0)\n",
+ "df[\"With_a_pet\"] = df.Tags.apply(lambda tag: 1 if \"With a pet\" in tag else 0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# No longer need any of these columns\n",
+ "df.drop([\"Review_Date\", \"Review_Total_Negative_Word_Counts\", \"Review_Total_Positive_Word_Counts\", \"days_since_review\", \"Total_Number_of_Reviews_Reviewer_Has_Given\"], axis = 1, inplace=True)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Saving results to Hotel_Reviews_Filtered.csv\n",
+ "Filtering took 23.74 seconds\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Saving new data file with calculated columns\n",
+ "print(\"Saving results to Hotel_Reviews_Filtered.csv\")\n",
+ "df.to_csv(r'../../data/Hotel_Reviews_Filtered.csv', index = False)\n",
+ "end = time.time()\n",
+ "print(\"Filtering took \" + str(round(end - start, 2)) + \" seconds\")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/2-notebook.ipynb b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/2-notebook.ipynb
new file mode 100644
index 000000000..9aebc1876
--- /dev/null
+++ b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/2-notebook.ipynb
@@ -0,0 +1,137 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 4,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "coopTranslator": {
+ "original_hash": "341efc86325ec2a214f682f57a189dfd",
+ "translation_date": "2025-08-30T00:15:08+00:00",
+ "source_file": "6-NLP/5-Hotel-Reviews-2/solution/2-notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load the hotel reviews from CSV (you can )\n",
+ "import pandas as pd \n",
+ "\n",
+ "df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# We want to find the most useful tags to keep\n",
+ "# Remove opening and closing brackets\n",
+ "df.Tags = df.Tags.str.strip(\"[']\")\n",
+ "# remove all quotes too\n",
+ "df.Tags = df.Tags.str.replace(\" ', '\", \",\", regex = False)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# removing this to take advantage of the 'already a phrase' fact of the dataset \n",
+ "# Now split the strings into a list\n",
+ "tag_list_df = df.Tags.str.split(',', expand = True)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Remove leading and trailing spaces\n",
+ "df[\"Tag_1\"] = tag_list_df[0].str.strip()\n",
+ "df[\"Tag_2\"] = tag_list_df[1].str.strip()\n",
+ "df[\"Tag_3\"] = tag_list_df[2].str.strip()\n",
+ "df[\"Tag_4\"] = tag_list_df[3].str.strip()\n",
+ "df[\"Tag_5\"] = tag_list_df[4].str.strip()\n",
+ "df[\"Tag_6\"] = tag_list_df[5].str.strip()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Merge the 6 columns into one with melt\n",
+ "df_tags = df.melt(value_vars=[\"Tag_1\", \"Tag_2\", \"Tag_3\", \"Tag_4\", \"Tag_5\", \"Tag_6\"])\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "The shape of the tags with no filtering: (2514684, 2)\n",
+ " index count\n",
+ "0 Leisure trip 338423\n",
+ "1 Couple 205305\n",
+ "2 Solo traveler 89779\n",
+ "3 Business trip 68176\n",
+ "4 Group 51593\n",
+ "5 Family with young children 49318\n",
+ "6 Family with older children 21509\n",
+ "7 Travelers with friends 1610\n",
+ "8 With a pet 1078\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Get the value counts\n",
+ "tag_vc = df_tags.value.value_counts()\n",
+ "# print(tag_vc)\n",
+ "print(\"The shape of the tags with no filtering:\", str(df_tags.shape))\n",
+ "# Drop rooms, suites, and length of stay, mobile device and anything with less count than a 1000\n",
+ "df_tags = df_tags[~df_tags.value.str.contains(\"Standard|room|Stayed|device|Beds|Suite|Studio|King|Superior|Double\", na=False, case=False)]\n",
+ "tag_vc = df_tags.value.value_counts().reset_index(name=\"count\").query(\"count > 1000\")\n",
+ "# Print the top 10 (there should only be 9 and we'll use these in the filtering section)\n",
+ "print(tag_vc[:10])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb
new file mode 100644
index 000000000..b02c73ef4
--- /dev/null
+++ b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb
@@ -0,0 +1,260 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 4,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "coopTranslator": {
+ "original_hash": "705bf02633759f689abc37b19749a16d",
+ "translation_date": "2025-08-30T00:15:21+00:00",
+ "source_file": "6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "[nltk_data] Downloading package vader_lexicon to\n[nltk_data] /Users/jenlooper/nltk_data...\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 9
+ }
+ ],
+ "source": [
+ "import time\n",
+ "import pandas as pd\n",
+ "import nltk as nltk\n",
+ "from nltk.corpus import stopwords\n",
+ "from nltk.sentiment.vader import SentimentIntensityAnalyzer\n",
+ "nltk.download('vader_lexicon')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "vader_sentiment = SentimentIntensityAnalyzer()\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# There are 3 possibilities of input for a review:\n",
+ "# It could be \"No Negative\", in which case, return 0\n",
+ "# It could be \"No Positive\", in which case, return 0\n",
+ "# It could be a review, in which case calculate the sentiment\n",
+ "def calc_sentiment(review): \n",
+ " if review == \"No Negative\" or review == \"No Positive\":\n",
+ " return 0\n",
+ " return vader_sentiment.polarity_scores(review)[\"compound\"] \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load the hotel reviews from CSV\n",
+ "df = pd.read_csv(\"../../data/Hotel_Reviews_Filtered.csv\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Remove stop words - can be slow for a lot of text!\n",
+ "# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches\n",
+ "# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends\n",
+ "start = time.time()\n",
+ "cache = set(stopwords.words(\"english\"))\n",
+ "def remove_stopwords(review):\n",
+ " text = \" \".join([word for word in review.split() if word not in cache])\n",
+ " return text\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Remove the stop words from both columns\n",
+ "df.Negative_Review = df.Negative_Review.apply(remove_stopwords) \n",
+ "df.Positive_Review = df.Positive_Review.apply(remove_stopwords)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Removing stop words took 5.77 seconds\n"
+ ]
+ }
+ ],
+ "source": [
+ "end = time.time()\n",
+ "print(\"Removing stop words took \" + str(round(end - start, 2)) + \" seconds\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Calculating sentiment columns for both positive and negative reviews\n",
+ "Calculating sentiment took 201.07 seconds\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Add a negative sentiment and positive sentiment column\n",
+ "print(\"Calculating sentiment columns for both positive and negative reviews\")\n",
+ "start = time.time()\n",
+ "df[\"Negative_Sentiment\"] = df.Negative_Review.apply(calc_sentiment)\n",
+ "df[\"Positive_Sentiment\"] = df.Positive_Review.apply(calc_sentiment)\n",
+ "end = time.time()\n",
+ "print(\"Calculating sentiment took \" + str(round(end - start, 2)) + \" seconds\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ " Negative_Review Negative_Sentiment\n",
+ "186584 So bad experience memories I hotel The first n... -0.9920\n",
+ "129503 First charged twice room booked booking second... -0.9896\n",
+ "307286 The staff Had bad experience even booking Janu... -0.9889\n",
+ "452092 No WLAN room Incredibly rude restaurant staff ... -0.9884\n",
+ "201293 We usually traveling Paris 2 3 times year busi... -0.9873\n",
+ "... ... ...\n",
+ "26899 I would say however one night expensive even d... 0.9933\n",
+ "138365 Wifi terribly slow I speed test network upload... 0.9938\n",
+ "79215 I find anything hotel first I walked past hote... 0.9938\n",
+ "278506 The property great location There bakery next ... 0.9945\n",
+ "339189 Guys I like hotel I wish return next year Howe... 0.9948\n",
+ "\n",
+ "[515738 rows x 2 columns]\n",
+ " Positive_Review Positive_Sentiment\n",
+ "137893 Bathroom Shower We going stay twice hotel 2 ni... -0.9820\n",
+ "5839 I completely disappointed mad since reception ... -0.9780\n",
+ "64158 get everything extra internet parking breakfas... -0.9751\n",
+ "124178 I didnt like anythig Room small Asked upgrade ... -0.9721\n",
+ "489137 Very rude manager abusive staff reception Dirt... -0.9703\n",
+ "... ... ...\n",
+ "331570 Everything This recently renovated hotel class... 0.9984\n",
+ "322920 From moment stepped doors Guesthouse Hotel sta... 0.9985\n",
+ "293710 This place surprise expected good actually gre... 0.9985\n",
+ "417442 We celebrated wedding night Langham I commend ... 0.9985\n",
+ "132492 We arrived super cute boutique hotel area expl... 0.9987\n",
+ "\n",
+ "[515738 rows x 2 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "df = df.sort_values(by=[\"Negative_Sentiment\"], ascending=True)\n",
+ "print(df[[\"Negative_Review\", \"Negative_Sentiment\"]])\n",
+ "df = df.sort_values(by=[\"Positive_Sentiment\"], ascending=True)\n",
+ "print(df[[\"Positive_Review\", \"Positive_Sentiment\"]])\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Reorder the columns (This is cosmetic, but to make it easier to explore the data later)\n",
+ "df = df.reindex([\"Hotel_Name\", \"Hotel_Address\", \"Total_Number_of_Reviews\", \"Average_Score\", \"Reviewer_Score\", \"Negative_Sentiment\", \"Positive_Sentiment\", \"Reviewer_Nationality\", \"Leisure_trip\", \"Couple\", \"Solo_traveler\", \"Business_trip\", \"Group\", \"Family_with_young_children\", \"Family_with_older_children\", \"With_a_pet\", \"Negative_Review\", \"Positive_Review\"], axis=1)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Saving results to Hotel_Reviews_NLP.csv\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Saving results to Hotel_Reviews_NLP.csv\")\n",
+ "df.to_csv(r\"../../data/Hotel_Reviews_NLP.csv\", index = False)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md
new file mode 100644
index 000000000..d5cab112d
--- /dev/null
+++ b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/R/README.md b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/R/README.md
new file mode 100644
index 000000000..2027e2342
--- /dev/null
+++ b/translations/bn/6-NLP/5-Hotel-Reviews-2/solution/R/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়বদ্ধ নই।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/README.md b/translations/bn/6-NLP/README.md
new file mode 100644
index 000000000..2250b5a21
--- /dev/null
+++ b/translations/bn/6-NLP/README.md
@@ -0,0 +1,38 @@
+
+# প্রাকৃতিক ভাষা প্রক্রিয়াকরণ শুরু করা
+
+প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (NLP) হল একটি কম্পিউটার প্রোগ্রামের মানুষের ভাষা বুঝতে পারার ক্ষমতা, যেভাবে এটি বলা এবং লেখা হয় — যাকে প্রাকৃতিক ভাষা বলা হয়। এটি কৃত্রিম বুদ্ধিমত্তার (AI) একটি উপাদান। NLP ৫০ বছরেরও বেশি সময় ধরে বিদ্যমান এবং এর শিকড় ভাষাতত্ত্বের ক্ষেত্রে রয়েছে। পুরো ক্ষেত্রটি মেশিনকে মানুষের ভাষা বুঝতে এবং প্রক্রিয়া করতে সাহায্য করার দিকে পরিচালিত। এটি তারপর বানান পরীক্ষা বা মেশিন অনুবাদের মতো কাজ সম্পাদনে ব্যবহার করা যেতে পারে। এটি চিকিৎসা গবেষণা, সার্চ ইঞ্জিন এবং ব্যবসায়িক বুদ্ধিমত্তাসহ বিভিন্ন ক্ষেত্রে বাস্তব জীবনের প্রয়োগ রয়েছে।
+
+## আঞ্চলিক বিষয়: ইউরোপীয় ভাষা ও সাহিত্য এবং ইউরোপের রোমান্টিক হোটেল ❤️
+
+এই পাঠ্যক্রমের এই অংশে, আপনি মেশিন লার্নিংয়ের অন্যতম বিস্তৃত ব্যবহার সম্পর্কে পরিচিত হবেন: প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (NLP)। কম্পিউটেশনাল ভাষাতত্ত্ব থেকে উদ্ভূত, কৃত্রিম বুদ্ধিমত্তার এই বিভাগটি মানুষের এবং মেশিনের মধ্যে ভয়েস বা পাঠ্য যোগাযোগের মাধ্যমে সেতুবন্ধন তৈরি করে।
+
+এই পাঠগুলোতে আমরা ছোট ছোট কথোপকথনকারী বট তৈরি করে NLP-এর মৌলিক বিষয়গুলো শিখব, যাতে মেশিন লার্নিং কীভাবে এই কথোপকথনগুলোকে আরও 'স্মার্ট' করে তুলতে সাহায্য করে তা বোঝা যায়। আপনি সময়ের পিছনে ভ্রমণ করবেন, জেন অস্টেনের ক্লাসিক উপন্যাস **Pride and Prejudice**, যা ১৮১৩ সালে প্রকাশিত হয়েছিল, থেকে এলিজাবেথ বেনেট এবং মিস্টার ডার্সির সাথে কথা বলবেন। এরপর, ইউরোপের হোটেল রিভিউয়ের মাধ্যমে অনুভূতি বিশ্লেষণ সম্পর্কে শিখে আপনার জ্ঞান আরও বাড়াবেন।
+
+
+> ছবি Elaine Howlin এর তোলা Unsplash এ
+
+## পাঠসমূহ
+
+1. [প্রাকৃতিক ভাষা প্রক্রিয়াকরণের পরিচিতি](1-Introduction-to-NLP/README.md)
+2. [সাধারণ NLP কাজ এবং কৌশল](2-Tasks/README.md)
+3. [মেশিন লার্নিং দিয়ে অনুবাদ এবং অনুভূতি বিশ্লেষণ](3-Translation-Sentiment/README.md)
+4. [আপনার ডেটা প্রস্তুত করা](4-Hotel-Reviews-1/README.md)
+5. [NLTK দিয়ে অনুভূতি বিশ্লেষণ](5-Hotel-Reviews-2/README.md)
+
+## কৃতজ্ঞতা
+
+এই প্রাকৃতিক ভাষা প্রক্রিয়াকরণের পাঠগুলো ☕ দিয়ে লিখেছেন [Stephen Howell](https://twitter.com/Howell_MSFT)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/6-NLP/data/README.md b/translations/bn/6-NLP/data/README.md
new file mode 100644
index 000000000..3c510d05e
--- /dev/null
+++ b/translations/bn/6-NLP/data/README.md
@@ -0,0 +1,15 @@
+
+হোটেল পর্যালোচনা ডেটা এই ফোল্ডারে ডাউনলোড করুন।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/1-Introduction/README.md b/translations/bn/7-TimeSeries/1-Introduction/README.md
new file mode 100644
index 000000000..ba55d6114
--- /dev/null
+++ b/translations/bn/7-TimeSeries/1-Introduction/README.md
@@ -0,0 +1,199 @@
+
+# টাইম সিরিজ পূর্বাভাসের পরিচিতি
+
+
+
+> স্কেচনোট: [Tomomi Imura](https://www.twitter.com/girlie_mac)
+
+এই পাঠ এবং পরবর্তী পাঠে, আপনি টাইম সিরিজ পূর্বাভাস সম্পর্কে কিছু শিখবেন, যা একটি মেশিন লার্নিং বিজ্ঞানীর দক্ষতার একটি আকর্ষণীয় এবং মূল্যবান অংশ। এটি অন্যান্য বিষয়ের তুলনায় কিছুটা কম পরিচিত। টাইম সিরিজ পূর্বাভাস একটি ধরনের 'ক্রিস্টাল বল': পূর্বের পারফরম্যান্সের উপর ভিত্তি করে, যেমন মূল্য, আপনি এর ভবিষ্যৎ সম্ভাব্য মান পূর্বাভাস দিতে পারেন।
+
+[](https://youtu.be/cBojo1hsHiI "টাইম সিরিজ পূর্বাভাসের পরিচিতি")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন টাইম সিরিজ পূর্বাভাস সম্পর্কে একটি ভিডিও দেখার জন্য
+
+## [পাঠ-পূর্ব কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/41/)
+
+এটি একটি কার্যকর এবং আকর্ষণীয় ক্ষেত্র যা ব্যবসার জন্য বাস্তব মূল্য প্রদান করে, কারণ এটি মূল্য নির্ধারণ, ইনভেন্টরি এবং সাপ্লাই চেইন সমস্যার সরাসরি প্রয়োগের সাথে সম্পর্কিত। যদিও গভীর শিক্ষণ (ডিপ লার্নিং) কৌশলগুলি ভবিষ্যৎ পারফরম্যান্স আরও ভালোভাবে পূর্বাভাস দেওয়ার জন্য ব্যবহার করা শুরু হয়েছে, টাইম সিরিজ পূর্বাভাস এখনও ক্লাসিক মেশিন লার্নিং কৌশল দ্বারা ব্যাপকভাবে প্রভাবিত।
+
+> পেন স্টেটের কার্যকর টাইম সিরিজ পাঠ্যক্রম [এখানে](https://online.stat.psu.edu/stat510/lesson/1) পাওয়া যাবে।
+
+## পরিচিতি
+
+ধরুন আপনি একটি স্মার্ট পার্কিং মিটার নেটওয়ার্ক পরিচালনা করেন যা সময়ের সাথে সাথে কতবার এবং কতক্ষণ ব্যবহৃত হয় তার ডেটা প্রদান করে।
+
+> যদি আপনি মিটারের পূর্বের পারফরম্যান্সের উপর ভিত্তি করে ভবিষ্যৎ মান পূর্বাভাস দিতে পারেন, তাহলে কী হবে?
+
+যখন কাজ করার সঠিক সময় পূর্বাভাস দেওয়া একটি চ্যালেঞ্জ, তখন টাইম সিরিজ পূর্বাভাস এই সমস্যার সমাধান করতে পারে। ব্যস্ত সময়ে পার্কিং স্পট খুঁজতে গিয়ে বেশি চার্জ করা লোকদের খুশি করবে না, তবে এটি রাস্তা পরিষ্কার করার জন্য রাজস্ব তৈরি করার একটি নিশ্চিত উপায় হতে পারে!
+
+চলুন টাইম সিরিজ অ্যালগরিদমের কিছু ধরন অন্বেষণ করি এবং কিছু ডেটা পরিষ্কার ও প্রস্তুত করার জন্য একটি নোটবুক শুরু করি। আপনি যে ডেটা বিশ্লেষণ করবেন তা GEFCom2014 পূর্বাভাস প্রতিযোগিতা থেকে নেওয়া হয়েছে। এটি ২০১২ থেকে ২০১৪ সালের মধ্যে ৩ বছরের ঘণ্টাভিত্তিক বিদ্যুৎ লোড এবং তাপমাত্রার মান নিয়ে গঠিত। বিদ্যুৎ লোড এবং তাপমাত্রার ঐতিহাসিক প্যাটার্নের ভিত্তিতে, আপনি ভবিষ্যৎ বিদ্যুৎ লোডের মান পূর্বাভাস দিতে পারেন।
+
+এই উদাহরণে, আপনি শুধুমাত্র ঐতিহাসিক লোড ডেটা ব্যবহার করে এক সময় ধাপ পূর্বাভাস দেওয়া শিখবেন। তবে শুরু করার আগে, পর্দার পিছনে কী ঘটছে তা বোঝা দরকার।
+
+## কিছু সংজ্ঞা
+
+'টাইম সিরিজ' শব্দটি যখন শুনবেন, তখন এর বিভিন্ন প্রসঙ্গে ব্যবহারের অর্থ বুঝতে হবে।
+
+🎓 **টাইম সিরিজ**
+
+গণিতের ভাষায়, "টাইম সিরিজ হল সময়ক্রমে সূচিবদ্ধ (বা তালিকাভুক্ত বা গ্রাফ করা) ডেটা পয়েন্টের একটি সিরিজ। সাধারণত, টাইম সিরিজ হল সমানভাবে ব্যবধানে সময়ের পয়েন্টে নেওয়া একটি ক্রম।" টাইম সিরিজের একটি উদাহরণ হল [ডাউ জোন্স ইন্ডাস্ট্রিয়াল অ্যাভারেজ](https://wikipedia.org/wiki/Time_series)-এর দৈনিক ক্লোজিং মান। টাইম সিরিজ প্লট এবং পরিসংখ্যানগত মডেলিং সিগন্যাল প্রসেসিং, আবহাওয়া পূর্বাভাস, ভূমিকম্প পূর্বাভাস এবং অন্যান্য ক্ষেত্রে প্রায়ই দেখা যায় যেখানে ঘটনা ঘটে এবং ডেটা পয়েন্ট সময়ের সাথে প্লট করা যায়।
+
+🎓 **টাইম সিরিজ বিশ্লেষণ**
+
+টাইম সিরিজ বিশ্লেষণ হল উপরে উল্লেখিত টাইম সিরিজ ডেটার বিশ্লেষণ। টাইম সিরিজ ডেটা বিভিন্ন রূপ নিতে পারে, যার মধ্যে 'ইন্টারাপ্টেড টাইম সিরিজ' অন্তর্ভুক্ত, যা একটি টাইম সিরিজের বিবর্তনে একটি বাধা ঘটনার আগে এবং পরে প্যাটার্ন সনাক্ত করে। টাইম সিরিজের জন্য প্রয়োজনীয় বিশ্লেষণ ডেটার প্রকৃতির উপর নির্ভর করে। টাইম সিরিজ ডেটা নিজেই সংখ্যা বা অক্ষরের সিরিজের রূপ নিতে পারে।
+
+এই বিশ্লেষণ বিভিন্ন পদ্ধতি ব্যবহার করে সম্পন্ন হয়, যার মধ্যে রয়েছে ফ্রিকোয়েন্সি-ডোমেইন এবং টাইম-ডোমেইন, লিনিয়ার এবং নন-লিনিয়ার, এবং আরও অনেক কিছু। [আরও জানুন](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) এই ধরনের ডেটা বিশ্লেষণের বিভিন্ন উপায় সম্পর্কে।
+
+🎓 **টাইম সিরিজ পূর্বাভাস**
+
+টাইম সিরিজ পূর্বাভাস হল একটি মডেল ব্যবহার করে পূর্বে সংগৃহীত ডেটার প্যাটার্নের ভিত্তিতে ভবিষ্যৎ মান পূর্বাভাস দেওয়া। যদিও টাইম সিরিজ ডেটা অন্বেষণ করতে রিগ্রেশন মডেল ব্যবহার করা সম্ভব, টাইম সিরিজ ডেটা বিশেষ ধরনের মডেল ব্যবহার করে বিশ্লেষণ করা সবচেয়ে ভালো।
+
+টাইম সিরিজ ডেটা হল একটি ক্রমবদ্ধ পর্যবেক্ষণের তালিকা, যা লিনিয়ার রিগ্রেশন দ্বারা বিশ্লেষণযোগ্য ডেটার মতো নয়। সবচেয়ে সাধারণ মডেল হল ARIMA, যার পূর্ণরূপ "Autoregressive Integrated Moving Average"।
+
+[ARIMA মডেল](https://online.stat.psu.edu/stat510/lesson/1/1.1) "বর্তমান মানকে পূর্বের মান এবং পূর্বাভাসের ত্রুটির সাথে সম্পর্কিত করে।" এটি টাইম-ডোমেইন ডেটা বিশ্লেষণের জন্য সবচেয়ে উপযুক্ত, যেখানে ডেটা সময়ের সাথে ক্রমানুসারে সাজানো থাকে।
+
+> ARIMA মডেলের বিভিন্ন ধরন রয়েছে, যা আপনি [এখানে](https://people.duke.edu/~rnau/411arim.htm) শিখতে পারেন এবং যা আপনি পরবর্তী পাঠে স্পর্শ করবেন।
+
+পরবর্তী পাঠে, আপনি [Univariate Time Series](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm) ব্যবহার করে একটি ARIMA মডেল তৈরি করবেন, যা একটি পরিবর্তনশীলকে কেন্দ্র করে যা সময়ের সাথে তার মান পরিবর্তন করে। এই ধরনের ডেটার একটি উদাহরণ হল [এই ডেটাসেট](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm), যা Mauna Loa Observatory-তে মাসিক CO2 ঘনত্ব রেকর্ড করে:
+
+| CO2 | YearMonth | Year | Month |
+| :----: | :-------: | :---: | :---: |
+| 330.62 | 1975.04 | 1975 | 1 |
+| 331.40 | 1975.13 | 1975 | 2 |
+| 331.87 | 1975.21 | 1975 | 3 |
+| 333.18 | 1975.29 | 1975 | 4 |
+| 333.92 | 1975.38 | 1975 | 5 |
+| 333.43 | 1975.46 | 1975 | 6 |
+| 331.85 | 1975.54 | 1975 | 7 |
+| 330.01 | 1975.63 | 1975 | 8 |
+| 328.51 | 1975.71 | 1975 | 9 |
+| 328.41 | 1975.79 | 1975 | 10 |
+| 329.25 | 1975.88 | 1975 | 11 |
+| 330.97 | 1975.96 | 1975 | 12 |
+
+✅ এই ডেটাসেটে সময়ের সাথে পরিবর্তিত পরিবর্তনশীলটি সনাক্ত করুন।
+
+## টাইম সিরিজ ডেটার বৈশিষ্ট্য বিবেচনা করা
+
+টাইম সিরিজ ডেটা দেখার সময়, আপনি লক্ষ্য করতে পারেন যে এতে [কিছু বৈশিষ্ট্য](https://online.stat.psu.edu/stat510/lesson/1/1.1) রয়েছে যা এর প্যাটার্নগুলি আরও ভালোভাবে বুঝতে এবং বিশ্লেষণ করতে আপনাকে বিবেচনা করতে হবে। যদি আপনি টাইম সিরিজ ডেটাকে একটি 'সিগন্যাল' হিসাবে ভাবেন যা আপনি বিশ্লেষণ করতে চান, তবে এই বৈশিষ্ট্যগুলি 'নয়েজ' হিসাবে বিবেচিত হতে পারে। এই 'নয়েজ' কমানোর জন্য কিছু পরিসংখ্যানগত কৌশল ব্যবহার করতে হতে পারে।
+
+টাইম সিরিজ নিয়ে কাজ করার জন্য এখানে কিছু ধারণা রয়েছে যা আপনাকে জানতে হবে:
+
+🎓 **ট্রেন্ড**
+
+ট্রেন্ড হল সময়ের সাথে পরিমাপযোগ্য বৃদ্ধি এবং হ্রাস। [আরও পড়ুন](https://machinelearningmastery.com/time-series-trends-in-python)। টাইম সিরিজের প্রসঙ্গে, এটি ট্রেন্ড ব্যবহার এবং প্রয়োজনে টাইম সিরিজ থেকে ট্রেন্ড সরানোর বিষয়ে।
+
+🎓 **[সিজনালিটি](https://machinelearningmastery.com/time-series-seasonality-with-python/)**
+
+সিজনালিটি হল পর্যায়ক্রমিক ওঠানামা, যেমন ছুটির সময় বিক্রয়ে প্রভাব। [দেখুন](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) কীভাবে বিভিন্ন ধরনের প্লট ডেটায় সিজনালিটি প্রদর্শন করে।
+
+🎓 **আউটলায়ার**
+
+আউটলায়ার হল ডেটার সাধারণ বৈচিত্র্যের থেকে অনেক দূরে থাকা মান।
+
+🎓 **দীর্ঘমেয়াদী চক্র**
+
+সিজনালিটির বাইরে, ডেটা দীর্ঘমেয়াদী চক্র প্রদর্শন করতে পারে, যেমন এক বছরের বেশি সময় ধরে চলা অর্থনৈতিক মন্দা।
+
+🎓 **স্থির বৈচিত্র্য**
+
+সময়ের সাথে, কিছু ডেটা স্থির ওঠানামা প্রদর্শন করে, যেমন দিনের এবং রাতের শক্তি ব্যবহারের পরিমাণ।
+
+🎓 **হঠাৎ পরিবর্তন**
+
+ডেটা হঠাৎ পরিবর্তন প্রদর্শন করতে পারে যা আরও বিশ্লেষণের প্রয়োজন হতে পারে। উদাহরণস্বরূপ, COVID-এর কারণে ব্যবসা বন্ধ হয়ে যাওয়া ডেটায় পরিবর্তন ঘটিয়েছে।
+
+✅ এখানে একটি [নমুনা টাইম সিরিজ প্লট](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) রয়েছে যা কয়েক বছরের মধ্যে দৈনিক ইন-গেম কারেন্সি ব্যয়ের প্রদর্শন করে। আপনি কি এই ডেটায় উপরে তালিকাভুক্ত বৈশিষ্ট্যগুলির মধ্যে কোনোটি সনাক্ত করতে পারেন?
+
+
+
+## অনুশীলন - বিদ্যুৎ ব্যবহারের ডেটা দিয়ে শুরু করা
+
+চলুন একটি টাইম সিরিজ মডেল তৈরি করা শুরু করি যা পূর্বের ব্যবহারের ভিত্তিতে ভবিষ্যৎ বিদ্যুৎ ব্যবহারের পূর্বাভাস দেয়।
+
+> এই উদাহরণে ব্যবহৃত ডেটা GEFCom2014 পূর্বাভাস প্রতিযোগিতা থেকে নেওয়া হয়েছে। এটি ২০১২ থেকে ২০১৪ সালের মধ্যে ৩ বছরের ঘণ্টাভিত্তিক বিদ্যুৎ লোড এবং তাপমাত্রার মান নিয়ে গঠিত।
+>
+> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli এবং Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016।
+
+1. এই পাঠের `working` ফোল্ডারে, _notebook.ipynb_ ফাইলটি খুলুন। ডেটা লোড এবং ভিজ্যুয়ালাইজ করতে সাহায্যকারী লাইব্রেরি যোগ করে শুরু করুন:
+
+ ```python
+ import os
+ import matplotlib.pyplot as plt
+ from common.utils import load_data
+ %matplotlib inline
+ ```
+
+ লক্ষ্য করুন, আপনি অন্তর্ভুক্ত `common` ফোল্ডারের ফাইলগুলি ব্যবহার করছেন যা আপনার পরিবেশ সেট আপ করে এবং ডেটা ডাউনলোড পরিচালনা করে।
+
+2. এরপর, `load_data()` এবং `head()` কল করে ডেটাকে একটি ডেটাফ্রেম হিসেবে পরীক্ষা করুন:
+
+ ```python
+ data_dir = './data'
+ energy = load_data(data_dir)[['load']]
+ energy.head()
+ ```
+
+ আপনি দেখতে পাবেন যে দুটি কলাম রয়েছে যা তারিখ এবং লোড উপস্থাপন করে:
+
+ | | load |
+ | :-----------------: | :----: |
+ | 2012-01-01 00:00:00 | 2698.0 |
+ | 2012-01-01 01:00:00 | 2558.0 |
+ | 2012-01-01 02:00:00 | 2444.0 |
+ | 2012-01-01 03:00:00 | 2402.0 |
+ | 2012-01-01 04:00:00 | 2403.0 |
+
+3. এখন, `plot()` কল করে ডেটা প্লট করুন:
+
+ ```python
+ energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
+ plt.xlabel('timestamp', fontsize=12)
+ plt.ylabel('load', fontsize=12)
+ plt.show()
+ ```
+
+ 
+
+4. এখন, ২০১৪ সালের জুলাই মাসের প্রথম সপ্তাহের ডেটা `[from date]: [to date]` প্যাটার্নে `energy`-তে ইনপুট দিয়ে প্লট করুন:
+
+ ```python
+ energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
+ plt.xlabel('timestamp', fontsize=12)
+ plt.ylabel('load', fontsize=12)
+ plt.show()
+ ```
+
+ 
+
+ একটি সুন্দর প্লট! এই প্লটগুলি দেখুন এবং উপরে তালিকাভুক্ত বৈশিষ্ট্যগুলির মধ্যে কোনোটি নির্ধারণ করতে পারেন কিনা তা দেখুন। ডেটা ভিজ্যুয়ালাইজ করে আমরা কী অনুমান করতে পারি?
+
+পরবর্তী পাঠে, আপনি একটি ARIMA মডেল তৈরি করবেন যা কিছু পূর্বাভাস তৈরি করবে।
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+আপনার মনে আসা সমস্ত শিল্প এবং গবেষণার ক্ষেত্রের একটি তালিকা তৈরি করুন যা টাইম সিরিজ পূর্বাভাস থেকে উপকৃত হতে পারে। আপনি কি এই কৌশলগুলির কোনো প্রয়োগ শিল্পকলায়, অর্থনীতিতে, পরিবেশবিদ্যায়, খুচরা ব্যবসায়, শিল্পে, আর্থিক ক্ষেত্রে কল্পনা করতে পারেন? আর কোথায়?
+
+## [পাঠ-পরবর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/42/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+যদিও আমরা এখানে আলোচনা করব না, নিউরাল নেটওয়ার্ক কখনও কখনও টাইম সিরিজ পূর্বাভাসের ক্লাসিক পদ্ধতিগুলিকে উন্নত করতে ব্যবহৃত হয়। [এই নিবন্ধে](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412) তাদের সম্পর্কে আরও পড়ুন।
+
+## অ্যাসাইনমেন্ট
+
+[আরও টাইম সিরিজ ভিজ্যুয়ালাইজ করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/1-Introduction/assignment.md b/translations/bn/7-TimeSeries/1-Introduction/assignment.md
new file mode 100644
index 000000000..4416660d7
--- /dev/null
+++ b/translations/bn/7-TimeSeries/1-Introduction/assignment.md
@@ -0,0 +1,25 @@
+
+# কিছু অতিরিক্ত টাইম সিরিজ ভিজুয়ালাইজ করুন
+
+## নির্দেশাবলী
+
+আপনি টাইম সিরিজ পূর্বাভাস সম্পর্কে শিখতে শুরু করেছেন, যেখানে বিশেষ মডেলিং প্রয়োজন এমন ডেটার ধরন নিয়ে আলোচনা করা হয়েছে। আপনি ইতিমধ্যে শক্তি সম্পর্কিত কিছু ডেটা ভিজুয়ালাইজ করেছেন। এখন, টাইম সিরিজ পূর্বাভাস থেকে উপকৃত হতে পারে এমন অন্য কিছু ডেটা খুঁজে বের করুন। তিনটি উদাহরণ খুঁজুন (চেষ্টা করুন [Kaggle](https://kaggle.com) এবং [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott) থেকে) এবং সেগুলো ভিজুয়ালাইজ করার জন্য একটি নোটবুক তৈরি করুন। নোটবুকে তাদের যেকোনো বিশেষ বৈশিষ্ট্য (যেমন ঋতুভিত্তিক প্যাটার্ন, আকস্মিক পরিবর্তন, বা অন্যান্য প্রবণতা) উল্লেখ করুন।
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ------------------------------------------------------ | ---------------------------------------------------- | ----------------------------------------------------------------------------------------- |
+| | তিনটি ডেটাসেট একটি নোটবুকে প্লট এবং ব্যাখ্যা করা হয়েছে | দুটি ডেটাসেট একটি নোটবুকে প্লট এবং ব্যাখ্যা করা হয়েছে | খুব কম ডেটাসেট প্লট বা ব্যাখ্যা করা হয়েছে, অথবা উপস্থাপিত ডেটা অপর্যাপ্ত |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/1-Introduction/solution/Julia/README.md b/translations/bn/7-TimeSeries/1-Introduction/solution/Julia/README.md
new file mode 100644
index 000000000..b4193a035
--- /dev/null
+++ b/translations/bn/7-TimeSeries/1-Introduction/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/1-Introduction/solution/R/README.md b/translations/bn/7-TimeSeries/1-Introduction/solution/R/README.md
new file mode 100644
index 000000000..01cbf6509
--- /dev/null
+++ b/translations/bn/7-TimeSeries/1-Introduction/solution/R/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/1-Introduction/solution/notebook.ipynb b/translations/bn/7-TimeSeries/1-Introduction/solution/notebook.ipynb
new file mode 100644
index 000000000..0149b6457
--- /dev/null
+++ b/translations/bn/7-TimeSeries/1-Introduction/solution/notebook.ipynb
@@ -0,0 +1,164 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "তাও হং, পিয়ের পিনসন, শু ফ্যান, হামিদরেজা জারেইপুর, আলবার্তো ট্রোকোলি এবং রব জে. হাইন্ডম্যান, \"সম্ভাব্য শক্তি পূর্বাভাস: গ্লোবাল এনার্জি ফোরকাস্টিং প্রতিযোগিতা ২০১৪ এবং তার পরবর্তী\", ইন্টারন্যাশনাল জার্নাল অফ ফোরকাস্টিং, ভলিউম ৩২, নং ৩, পৃষ্ঠা ৮৯৬-৯১৩, জুলাই-সেপ্টেম্বর, ২০১৬।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import matplotlib.pyplot as plt\n",
+ "from common.utils import load_data\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "ডেটা csv থেকে একটি Pandas ডেটাফ্রেমে লোড করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " load\n",
+ "2012-01-01 00:00:00 2698.0\n",
+ "2012-01-01 01:00:00 2558.0\n",
+ "2012-01-01 02:00:00 2444.0\n",
+ "2012-01-01 03:00:00 2402.0\n",
+ "2012-01-01 04:00:00 2403.0"
+ ],
+ "text/html": "
",
+ "image/svg+xml": "\n\n\n\n",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA4kAAAHiCAYAAABFgonlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdeXhb5ZU/8O+r3bYkO7bl3YljZ3dCnJBASCCQFkqBgUDpBrRMZ6YLMJ2l26/TTjtDmelMp09nOtNOaUt31tKFtRToQAkpSUhIiJPY2Z14X+VFkiVL1vL+/pBkjHESL5Ku7r3fz/P4IbF07z1Gsa1z3/OeI6SUICIiIiIiIgIAg9IBEBERERERUfZgkkhEREREREQTmCQSERERERHRBCaJRERERERENIFJIhEREREREU1gkkhEREREREQTTEoHoITi4mJZU1OjdBhERERERESKOHDggFtK6ZruMV0miTU1Ndi/f7/SYRARERERESlCCNF2rsdYbkpEREREREQTmCQSERERERHRBCaJRERERERENEGXexKJiIiIiIgAIBwOo7OzE8FgUOlQ0sJms6Gqqgpms3nGxzBJJCIiIiIi3ers7ITD4UBNTQ2EEEqHk1JSSgwODqKzsxOLFy+e8XEsNyUiIiIiIt0KBoMoKirSXIIIAEIIFBUVzXqVlEkiERERERHpmhYTxKS5fG1MEomIiIiIiBRkt9tTcp57770X3/rWt+Z9HiaJRERERERENIFJIhERERERURaQUuILX/gCVq9ejTVr1uDxxx8HAIyOjuLd73431q9fjzVr1uDpp5+eOObrX/86li1bhssvvxwnTpxISRzsbkpERERERATga88242i3N6XnXFXhxD/fWD+j5z7xxBNobGzEoUOH4Ha7sXHjRmzduhUulwtPPvkknE4n3G43Nm3ahJtuuglvvvkmfvnLX6KxsRGRSATr16/HxRdfPO+YuZJIRERERESUBV577TXcdtttMBqNKC0txZVXXok33ngDUkp8+ctfxkUXXYSrr74aXV1d6Ovrw5/+9CfccsstyM3NhdPpxE033ZSSOLiSSEREREREBMx4xS/THnnkEQwMDODAgQMwm82oqamZ9ViL2eBKIhERERERURa44oor8PjjjyMajWJgYAA7d+7EJZdcAo/Hg5KSEpjNZrzy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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)\n",
+ "plt.xlabel('timestamp', fontsize=12)\n",
+ "plt.ylabel('load', fontsize=12)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernel_info": {
+ "name": "python3"
+ },
+ "kernelspec": {
+ "name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "nteract": {
+ "version": "nteract-front-end@1.0.0"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "dddca9ad9e34435494e0933c218e1579",
+ "translation_date": "2025-08-29T23:20:40+00:00",
+ "source_file": "7-TimeSeries/1-Introduction/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/1-Introduction/working/notebook.ipynb b/translations/bn/7-TimeSeries/1-Introduction/working/notebook.ipynb
new file mode 100644
index 000000000..a6b801603
--- /dev/null
+++ b/translations/bn/7-TimeSeries/1-Introduction/working/notebook.ipynb
@@ -0,0 +1,63 @@
+{
+ "cells": [
+ {
+ "source": [
+ "# ডেটা সেটআপ\n",
+ "\n",
+ "এই নোটবুকে, আমরা দেখাবো কীভাবে:\n",
+ "\n",
+ "এই মডিউলের জন্য টাইম সিরিজ ডেটা সেটআপ করতে হয় \n",
+ "ডেটা ভিজুয়ালাইজ করতে হয় \n",
+ "এই উদাহরণে ব্যবহৃত ডেটা GEFCom2014 পূর্বাভাস প্রতিযোগিতা থেকে নেওয়া হয়েছে। এটি ২০১২ থেকে ২০১৪ সালের মধ্যে ৩ বছরের ঘণ্টাভিত্তিক বিদ্যুৎ লোড এবং তাপমাত্রার মান নিয়ে গঠিত।\n",
+ "\n",
+ "1তাও হং, পিয়েরে পিনসন, শু ফ্যান, হামিদরেজা জারেইপুর, আলবার্তো ট্রোকোলি এবং রব জে. হাইন্ডম্যান, \"সম্ভাব্য শক্তি পূর্বাভাস: গ্লোবাল এনার্জি ফোরকাস্টিং কম্পিটিশন ২০১৪ এবং তার পরবর্তী সময়\", ইন্টারন্যাশনাল জার্নাল অফ ফোরকাস্টিং, ভলিউম ৩২, নং ৩, পৃষ্ঠা ৮৯৬-৯১৩, জুলাই-সেপ্টেম্বর, ২০১৬।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় রচিত সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernel_info": {
+ "name": "python3"
+ },
+ "kernelspec": {
+ "name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "nteract": {
+ "version": "nteract-front-end@1.0.0"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "5e2bbe594906dce3aaaa736d6dac6683",
+ "translation_date": "2025-08-29T23:21:24+00:00",
+ "source_file": "7-TimeSeries/1-Introduction/working/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/2-ARIMA/README.md b/translations/bn/7-TimeSeries/2-ARIMA/README.md
new file mode 100644
index 000000000..44005b414
--- /dev/null
+++ b/translations/bn/7-TimeSeries/2-ARIMA/README.md
@@ -0,0 +1,407 @@
+
+# ARIMA দিয়ে টাইম সিরিজ পূর্বাভাস
+
+পূর্ববর্তী পাঠে, আপনি টাইম সিরিজ পূর্বাভাস সম্পর্কে কিছু শিখেছেন এবং একটি ডেটাসেট লোড করেছেন যা একটি নির্দিষ্ট সময়কালে বৈদ্যুতিক লোডের ওঠানামা দেখায়।
+
+[](https://youtu.be/IUSk-YDau10 "ARIMA মডেলের পরিচিতি")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন একটি ভিডিওর জন্য: ARIMA মডেলের সংক্ষিপ্ত পরিচিতি। উদাহরণটি R-এ করা হয়েছে, তবে ধারণাগুলি সার্বজনীন।
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/43/)
+
+## পরিচিতি
+
+এই পাঠে, আপনি [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average) ব্যবহার করে মডেল তৈরি করার একটি নির্দিষ্ট পদ্ধতি আবিষ্কার করবেন। ARIMA মডেলগুলি বিশেষভাবে উপযুক্ত এমন ডেটার জন্য যা [non-stationarity](https://wikipedia.org/wiki/Stationary_process) প্রদর্শন করে।
+
+## সাধারণ ধারণা
+
+ARIMA নিয়ে কাজ করতে হলে কিছু ধারণা সম্পর্কে জানা দরকার:
+
+- 🎓 **Stationarity**। পরিসংখ্যানগত প্রেক্ষাপটে, স্টেশনারিটি এমন ডেটাকে বোঝায় যার বিতরণ সময়ের সাথে পরিবর্তিত হয় না। Non-stationary ডেটা, তখন প্রবণতার কারণে ওঠানামা দেখায় যা বিশ্লেষণ করার জন্য রূপান্তরিত করতে হয়। উদাহরণস্বরূপ, মৌসুমীতা ডেটায় ওঠানামা আনতে পারে এবং এটি 'seasonal-differencing' প্রক্রিয়ার মাধ্যমে দূর করা যেতে পারে।
+
+- 🎓 **[Differencing](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**। পরিসংখ্যানগত প্রেক্ষাপটে, ডেটাকে ডিফারেন্সিং করা বলতে non-stationary ডেটাকে রূপান্তরিত করে স্টেশনারি করা বোঝায়, এর non-constant প্রবণতা সরিয়ে। "ডিফারেন্সিং টাইম সিরিজের স্তরের পরিবর্তনগুলি সরিয়ে দেয়, প্রবণতা এবং মৌসুমীতা দূর করে এবং ফলস্বরূপ টাইম সিরিজের গড়কে স্থিতিশীল করে।" [Shixiong et al-এর পেপার](https://arxiv.org/abs/1904.07632)
+
+## টাইম সিরিজের প্রেক্ষাপটে ARIMA
+
+ARIMA-এর অংশগুলো বিশ্লেষণ করে দেখা যাক কীভাবে এটি টাইম সিরিজ মডেল করতে এবং পূর্বাভাস দিতে সাহায্য করে।
+
+- **AR - AutoRegressive**। Autoregressive মডেলগুলি, নাম অনুসারে, ডেটার পূর্ববর্তী মানগুলিকে বিশ্লেষণ করতে এবং সেগুলোর উপর ভিত্তি করে অনুমান করতে 'পেছনে' তাকায়। এই পূর্ববর্তী মানগুলোকে 'lags' বলা হয়। উদাহরণস্বরূপ, মাসিক পেন্সিল বিক্রির ডেটা। প্রতিটি মাসের বিক্রির মোট পরিমাণ ডেটাসেটে একটি 'evolving variable' হিসেবে বিবেচিত হবে। এই মডেলটি তৈরি হয় যেখানে "evolving variable of interest তার নিজস্ব lagged (অর্থাৎ, পূর্ববর্তী) মানগুলোর উপর ভিত্তি করে রিগ্রেস করা হয়।" [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)
+
+- **I - Integrated**। 'ARMA' মডেলের সাথে তুলনামূলকভাবে, ARIMA-তে 'I' তার *[integrated](https://wikipedia.org/wiki/Order_of_integration)* দিকটি বোঝায়। ডিফারেন্সিং ধাপগুলো প্রয়োগ করে ডেটাকে 'ইন্টিগ্রেটেড' করা হয় যাতে non-stationarity দূর করা যায়।
+
+- **MA - Moving Average**। এই মডেলের [moving-average](https://wikipedia.org/wiki/Moving-average_model) দিকটি বর্তমান এবং পূর্ববর্তী lag মানগুলো পর্যবেক্ষণ করে আউটপুট ভেরিয়েবল নির্ধারণ করে।
+
+মূল কথা: ARIMA ব্যবহার করা হয় টাইম সিরিজ ডেটার বিশেষ ফর্মের সাথে যতটা সম্ভব ঘনিষ্ঠভাবে মডেল ফিট করার জন্য।
+
+## অনুশীলন - একটি ARIMA মডেল তৈরি করুন
+
+এই পাঠের [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) ফোল্ডার খুলুন এবং [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb) ফাইলটি খুঁজুন।
+
+1. `statsmodels` Python লাইব্রেরি লোড করতে নোটবুক চালান; ARIMA মডেলের জন্য এটি প্রয়োজন।
+
+1. প্রয়োজনীয় লাইব্রেরি লোড করুন।
+
+1. এখন, ডেটা প্লট করার জন্য আরও কিছু দরকারী লাইব্রেরি লোড করুন:
+
+ ```python
+ import os
+ import warnings
+ import matplotlib.pyplot as plt
+ import numpy as np
+ import pandas as pd
+ import datetime as dt
+ import math
+
+ from pandas.plotting import autocorrelation_plot
+ from statsmodels.tsa.statespace.sarimax import SARIMAX
+ from sklearn.preprocessing import MinMaxScaler
+ from common.utils import load_data, mape
+ from IPython.display import Image
+
+ %matplotlib inline
+ pd.options.display.float_format = '{:,.2f}'.format
+ np.set_printoptions(precision=2)
+ warnings.filterwarnings("ignore") # specify to ignore warning messages
+ ```
+
+1. `/data/energy.csv` ফাইল থেকে ডেটা একটি Pandas ডেটাফ্রেমে লোড করুন এবং দেখুন:
+
+ ```python
+ energy = load_data('./data')[['load']]
+ energy.head(10)
+ ```
+
+1. জানুয়ারি 2012 থেকে ডিসেম্বর 2014 পর্যন্ত সমস্ত উপলব্ধ এনার্জি ডেটা প্লট করুন। এখানে কোনো চমক থাকবে না কারণ আমরা এই ডেটা আগের পাঠে দেখেছি:
+
+ ```python
+ energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
+ plt.xlabel('timestamp', fontsize=12)
+ plt.ylabel('load', fontsize=12)
+ plt.show()
+ ```
+
+ এখন, একটি মডেল তৈরি করা যাক!
+
+### ট্রেনিং এবং টেস্টিং ডেটাসেট তৈরি করুন
+
+এখন আপনার ডেটা লোড হয়েছে, তাই আপনি এটি ট্রেন এবং টেস্ট সেটে ভাগ করতে পারেন। আপনি আপনার মডেলটি ট্রেন সেটে প্রশিক্ষণ দেবেন। সাধারণত, মডেলটি প্রশিক্ষণ শেষ করার পরে, আপনি টেস্ট সেট ব্যবহার করে এর সঠিকতা মূল্যায়ন করবেন। নিশ্চিত করুন যে টেস্ট সেটটি ট্রেন সেটের চেয়ে পরবর্তী সময়কালকে কভার করে যাতে মডেল ভবিষ্যতের সময়কাল থেকে তথ্য না পায়।
+
+1. সেপ্টেম্বর 1 থেকে অক্টোবর 31, 2014 পর্যন্ত দুই মাসের সময়কাল ট্রেন সেটে বরাদ্দ করুন। টেস্ট সেটে নভেম্বর 1 থেকে ডিসেম্বর 31, 2014 পর্যন্ত দুই মাসের সময়কাল অন্তর্ভুক্ত থাকবে:
+
+ ```python
+ train_start_dt = '2014-11-01 00:00:00'
+ test_start_dt = '2014-12-30 00:00:00'
+ ```
+
+ যেহেতু এই ডেটা দৈনিক এনার্জি ব্যবহারের প্রতিফলন করে, তাই এখানে একটি শক্তিশালী মৌসুমী প্যাটার্ন রয়েছে, তবে সাম্প্রতিক দিনের ব্যবহারের সাথে সবচেয়ে বেশি মিল রয়েছে।
+
+1. পার্থক্যগুলো ভিজ্যুয়ালাইজ করুন:
+
+ ```python
+ energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
+ .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
+ .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
+ plt.xlabel('timestamp', fontsize=12)
+ plt.ylabel('load', fontsize=12)
+ plt.show()
+ ```
+
+ 
+
+ সুতরাং, ডেটা প্রশিক্ষণের জন্য একটি তুলনামূলকভাবে ছোট সময় উইন্ডো ব্যবহার করা যথেষ্ট হওয়া উচিত।
+
+ > নোট: যেহেতু আমরা ARIMA মডেল ফিট করার জন্য যে ফাংশনটি ব্যবহার করি তা ফিটিংয়ের সময় ইন-স্যাম্পল ভ্যালিডেশন ব্যবহার করে, আমরা ভ্যালিডেশন ডেটা বাদ দেব।
+
+### ট্রেনিংয়ের জন্য ডেটা প্রস্তুত করুন
+
+এখন, আপনাকে ডেটা ফিল্টারিং এবং স্কেলিংয়ের মাধ্যমে ট্রেনিংয়ের জন্য প্রস্তুত করতে হবে। আপনার ডেটাসেটটি শুধুমাত্র প্রয়োজনীয় সময়কাল এবং কলামগুলো অন্তর্ভুক্ত করতে ফিল্টার করুন এবং ডেটাকে 0,1 এর মধ্যে প্রজেক্ট করার জন্য স্কেলিং করুন।
+
+1. মূল ডেটাসেটটি শুধুমাত্র উল্লেখিত সময়কাল এবং সেট অনুযায়ী প্রয়োজনীয় কলাম 'load' এবং তারিখ অন্তর্ভুক্ত করতে ফিল্টার করুন:
+
+ ```python
+ train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
+ test = energy.copy()[energy.index >= test_start_dt][['load']]
+
+ print('Training data shape: ', train.shape)
+ print('Test data shape: ', test.shape)
+ ```
+
+ আপনি ডেটার আকার দেখতে পারেন:
+
+ ```output
+ Training data shape: (1416, 1)
+ Test data shape: (48, 1)
+ ```
+
+1. ডেটাকে (0, 1) পরিসরে স্কেল করুন।
+
+ ```python
+ scaler = MinMaxScaler()
+ train['load'] = scaler.fit_transform(train)
+ train.head(10)
+ ```
+
+1. মূল বনাম স্কেল করা ডেটা ভিজ্যুয়ালাইজ করুন:
+
+ ```python
+ energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12)
+ train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12)
+ plt.show()
+ ```
+
+ 
+
+ > মূল ডেটা
+
+ 
+
+ > স্কেল করা ডেটা
+
+1. এখন আপনি স্কেল করা ডেটা ক্যালিব্রেট করেছেন, আপনি টেস্ট ডেটা স্কেল করতে পারেন:
+
+ ```python
+ test['load'] = scaler.transform(test)
+ test.head()
+ ```
+
+### ARIMA বাস্তবায়ন করুন
+
+এখন ARIMA বাস্তবায়নের সময়! আপনি আগে ইনস্টল করা `statsmodels` লাইব্রেরি ব্যবহার করবেন।
+
+এখন আপনাকে কয়েকটি ধাপ অনুসরণ করতে হবে:
+
+ 1. `SARIMAX()` কল করে এবং মডেল প্যারামিটারগুলো: p, d, এবং q প্যারামিটার, এবং P, D, এবং Q প্যারামিটার পাস করে মডেলটি সংজ্ঞায়িত করুন।
+ 2. `fit()` ফাংশন কল করে ট্রেনিং ডেটার জন্য মডেল প্রস্তুত করুন।
+ 3. `forecast()` ফাংশন কল করে এবং পূর্বাভাসের ধাপের সংখ্যা (হরাইজন) নির্দিষ্ট করে পূর্বাভাস তৈরি করুন।
+
+> 🎓 এই প্যারামিটারগুলো কী জন্য? একটি ARIMA মডেলে 3টি প্যারামিটার থাকে যা টাইম সিরিজের প্রধান দিকগুলো মডেল করতে সাহায্য করে: মৌসুমীতা, প্রবণতা, এবং শব্দ। এই প্যারামিটারগুলো হলো:
+
+`p`: মডেলের auto-regressive অংশের সাথে সম্পর্কিত প্যারামিটার, যা *পূর্ববর্তী* মানগুলো অন্তর্ভুক্ত করে।
+`d`: মডেলের integrated অংশের সাথে সম্পর্কিত প্যারামিটার, যা টাইম সিরিজে *differencing* (🎓 ডিফারেন্সিং মনে আছে 👆?) প্রয়োগের পরিমাণকে প্রভাবিত করে।
+`q`: মডেলের moving-average অংশের সাথে সম্পর্কিত প্যারামিটার।
+
+> নোট: যদি আপনার ডেটায় মৌসুমী দিক থাকে - যেমন এই ডেটায় আছে - , তাহলে আমরা একটি seasonal ARIMA মডেল (SARIMA) ব্যবহার করি। এই ক্ষেত্রে আপনাকে আরেকটি প্যারামিটার সেট ব্যবহার করতে হবে: `P`, `D`, এবং `Q` যা `p`, `d`, এবং `q` এর মতো একই সম্পর্ক বর্ণনা করে, তবে মডেলের মৌসুমী উপাদানগুলোর সাথে সম্পর্কিত।
+
+1. আপনার পছন্দের হরাইজন মান সেট করুন। চলুন 3 ঘণ্টা চেষ্টা করি:
+
+ ```python
+ # Specify the number of steps to forecast ahead
+ HORIZON = 3
+ print('Forecasting horizon:', HORIZON, 'hours')
+ ```
+
+ ARIMA মডেলের প্যারামিটারগুলোর সেরা মান নির্বাচন করা চ্যালেঞ্জিং হতে পারে কারণ এটি কিছুটা বিষয়ভিত্তিক এবং সময়সাপেক্ষ। আপনি [`pyramid` লাইব্রেরি](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html) থেকে `auto_arima()` ফাংশন ব্যবহার করার কথা বিবেচনা করতে পারেন।
+
+1. আপাতত কিছু ম্যানুয়াল নির্বাচন চেষ্টা করুন একটি ভালো মডেল খুঁজে পেতে।
+
+ ```python
+ order = (4, 1, 0)
+ seasonal_order = (1, 1, 0, 24)
+
+ model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order)
+ results = model.fit()
+
+ print(results.summary())
+ ```
+
+ একটি ফলাফলের টেবিল প্রিন্ট করা হয়।
+
+আপনি আপনার প্রথম মডেল তৈরি করেছেন! এখন এটি মূল্যায়নের একটি উপায় খুঁজে বের করতে হবে।
+
+### আপনার মডেল মূল্যায়ন করুন
+
+আপনার মডেল মূল্যায়ন করতে, আপনি তথাকথিত `walk forward` ভ্যালিডেশন করতে পারেন। বাস্তবে, টাইম সিরিজ মডেলগুলো প্রতিবার নতুন ডেটা উপলব্ধ হলে পুনরায় প্রশিক্ষণ দেওয়া হয়। এটি মডেলকে প্রতিটি সময় ধাপে সেরা পূর্বাভাস দিতে সক্ষম করে।
+
+টাইম সিরিজের শুরু থেকে এই কৌশল ব্যবহার করে, ট্রেন ডেটা সেটে মডেলটি প্রশিক্ষণ দিন। তারপর পরবর্তী সময় ধাপে একটি পূর্বাভাস তৈরি করুন। পূর্বাভাসটি পরিচিত মানের সাথে মূল্যায়ন করা হয়। তারপর ট্রেনিং সেটটি পরিচিত মানটি অন্তর্ভুক্ত করতে প্রসারিত করা হয় এবং প্রক্রিয়াটি পুনরাবৃত্তি করা হয়।
+
+> নোট: আরও দক্ষ প্রশিক্ষণের জন্য আপনার ট্রেনিং সেট উইন্ডো স্থির রাখা উচিত যাতে আপনি প্রতিবার ট্রেনিং সেটে একটি নতুন পর্যবেক্ষণ যোগ করেন, আপনি সেটের শুরু থেকে পর্যবেক্ষণটি সরিয়ে ফেলেন।
+
+এই প্রক্রিয়াটি মডেলটি বাস্তবে কীভাবে কাজ করবে তার আরও শক্তিশালী অনুমান প্রদান করে। তবে, এটি এতগুলো মডেল তৈরি করার গণনা খরচে আসে। যদি ডেটা ছোট হয় বা মডেলটি সহজ হয় তবে এটি গ্রহণযোগ্য, তবে স্কেলে এটি একটি সমস্যা হতে পারে।
+
+Walk-forward validation টাইম সিরিজ মডেল মূল্যায়নের সোনার মান এবং এটি আপনার নিজস্ব প্রকল্পগুলোর জন্য সুপারিশ করা হয়।
+
+1. প্রথমে, প্রতিটি HORIZON ধাপে একটি টেস্ট ডেটা পয়েন্ট তৈরি করুন।
+
+ ```python
+ test_shifted = test.copy()
+
+ for t in range(1, HORIZON+1):
+ test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H')
+
+ test_shifted = test_shifted.dropna(how='any')
+ test_shifted.head(5)
+ ```
+
+ | | | load | load+1 | load+2 |
+ | ---------- | -------- | ---- | ------ | ------ |
+ | 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 |
+ | 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 |
+ | 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 |
+ | 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 |
+ | 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 |
+
+ ডেটা তার horizon পয়েন্ট অনুযায়ী অনুভূমিকভাবে স্থানান্তরিত হয়।
+
+1. এই স্লাইডিং উইন্ডো পদ্ধতি ব্যবহার করে টেস্ট ডেটায় পূর্বাভাস তৈরি করুন টেস্ট ডেটার দৈর্ঘ্যের আকারে একটি লুপে:
+
+ ```python
+ %%time
+ training_window = 720 # dedicate 30 days (720 hours) for training
+
+ train_ts = train['load']
+ test_ts = test_shifted
+
+ history = [x for x in train_ts]
+ history = history[(-training_window):]
+
+ predictions = list()
+
+ order = (2, 1, 0)
+ seasonal_order = (1, 1, 0, 24)
+
+ for t in range(test_ts.shape[0]):
+ model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order)
+ model_fit = model.fit()
+ yhat = model_fit.forecast(steps = HORIZON)
+ predictions.append(yhat)
+ obs = list(test_ts.iloc[t])
+ # move the training window
+ history.append(obs[0])
+ history.pop(0)
+ print(test_ts.index[t])
+ print(t+1, ': predicted =', yhat, 'expected =', obs)
+ ```
+
+ আপনি প্রশিক্ষণটি ঘটতে দেখতে পারেন:
+
+ ```output
+ 2014-12-30 00:00:00
+ 1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323]
+
+ 2014-12-30 01:00:00
+ 2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126]
+
+ 2014-12-30 02:00:00
+ 3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795]
+ ```
+
+1. পূর্বাভাসগুলোকে প্রকৃত লোডের সাথে তুলনা করুন:
+
+ ```python
+ eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)])
+ eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1]
+ eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h')
+ eval_df['actual'] = np.array(np.transpose(test_ts)).ravel()
+ eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']])
+ eval_df.head()
+ ```
+
+ আউটপুট
+ | | | timestamp | h | prediction | actual |
+ | --- | ---------- | --------- | --- | ---------- | -------- |
+ | 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 |
+ | 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 |
+ | 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 |
+ | 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 |
+ | 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 |
+
+ ঘণ্টাভিত্তিক ডেটার পূর্বাভাস দেখুন, প্রকৃত লোডের সাথে তুলনা করুন। এটি কতটা সঠিক?
+
+### মডেলের সঠিকতা পরীক্ষা করুন
+
+আপনার মডেলের সঠিকতা পরীক্ষা করুন সমস্ত পূর্বাভাসের উপর এর mean absolute percentage error (MAPE) পরীক্ষা করে।
+> **🧮 গণিত দেখুন**
+>
+> 
+>
+> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) ব্যবহার করা হয় পূর্বাভাসের সঠিকতা একটি অনুপাত হিসেবে দেখানোর জন্য, যা উপরের সূত্র দ্বারা সংজ্ঞায়িত। প্রকৃত এবং পূর্বাভাসিত মানের পার্থক্য প্রকৃত মান দ্বারা ভাগ করা হয়।
+>
+> "এই গণনায় প্রাপ্ত মানের পরম মান প্রতিটি পূর্বাভাসিত সময় বিন্দুর জন্য যোগ করা হয় এবং ফিট করা বিন্দুর সংখ্যা n দ্বারা ভাগ করা হয়।" [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error)
+1. কোডে সমীকরণ প্রকাশ করুন:
+
+ ```python
+ if(HORIZON > 1):
+ eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual']
+ print(eval_df.groupby('h')['APE'].mean())
+ ```
+
+1. এক ধাপের MAPE গণনা করুন:
+
+ ```python
+ print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%')
+ ```
+
+ এক ধাপের পূর্বাভাস MAPE: 0.5570581332313952 %
+
+1. বহু ধাপের পূর্বাভাস MAPE প্রিন্ট করুন:
+
+ ```python
+ print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%')
+ ```
+
+ ```output
+ Multi-step forecast MAPE: 1.1460048657704118 %
+ ```
+
+ একটি সুন্দর কম সংখ্যা সর্বোত্তম: মনে রাখুন, যদি পূর্বাভাসের MAPE 10 হয়, তবে এটি 10% দ্বারা ভুল।
+
+1. তবে সবসময়ই, এই ধরনের সঠিকতা পরিমাপ দৃশ্যত দেখা সহজ, তাই চলুন এটি প্লট করি:
+
+ ```python
+ if(HORIZON == 1):
+ ## Plotting single step forecast
+ eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8))
+
+ else:
+ ## Plotting multi step forecast
+ plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']]
+ for t in range(1, HORIZON+1):
+ plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values
+
+ fig = plt.figure(figsize=(15, 8))
+ ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0)
+ ax = fig.add_subplot(111)
+ for t in range(1, HORIZON+1):
+ x = plot_df['timestamp'][(t-1):]
+ y = plot_df['t+'+str(t)][0:len(x)]
+ ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t))
+
+ ax.legend(loc='best')
+
+ plt.xlabel('timestamp', fontsize=12)
+ plt.ylabel('load', fontsize=12)
+ plt.show()
+ ```
+
+ 
+
+🏆 একটি খুব সুন্দর প্লট, যা একটি ভালো সঠিকতার মডেল দেখাচ্ছে। খুব ভালো কাজ!
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+টাইম সিরিজ মডেলের সঠিকতা পরীক্ষা করার বিভিন্ন পদ্ধতি নিয়ে গবেষণা করুন। এই পাঠে আমরা MAPE নিয়ে আলোচনা করেছি, তবে আপনি কি অন্য পদ্ধতি ব্যবহার করতে পারেন? সেগুলো গবেষণা করুন এবং ব্যাখ্যা করুন। একটি সহায়ক ডকুমেন্ট [এখানে](https://otexts.com/fpp2/accuracy.html) পাওয়া যাবে।
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/44/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+এই পাঠে ARIMA দিয়ে টাইম সিরিজ পূর্বাভাসের শুধুমাত্র মৌলিক বিষয়গুলো আলোচনা করা হয়েছে। [এই রিপোজিটরি](https://microsoft.github.io/forecasting/) এবং এর বিভিন্ন মডেল টাইপ নিয়ে গবেষণা করে টাইম সিরিজ মডেল তৈরির অন্যান্য পদ্ধতি শিখে আপনার জ্ঞান আরও গভীর করুন।
+
+## অ্যাসাইনমেন্ট
+
+[একটি নতুন ARIMA মডেল](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় রচিত সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/2-ARIMA/assignment.md b/translations/bn/7-TimeSeries/2-ARIMA/assignment.md
new file mode 100644
index 000000000..9c38a263a
--- /dev/null
+++ b/translations/bn/7-TimeSeries/2-ARIMA/assignment.md
@@ -0,0 +1,25 @@
+
+# একটি নতুন ARIMA মডেল
+
+## নির্দেশনা
+
+আপনি ইতিমধ্যে একটি ARIMA মডেল তৈরি করেছেন, এবার নতুন ডেটা ব্যবহার করে একটি নতুন মডেল তৈরি করুন (ডেটার জন্য [ডিউকের এই ডেটাসেটগুলো](http://www2.stat.duke.edu/~mw/ts_data_sets.html) চেষ্টা করুন)। আপনার কাজ একটি নোটবুকে নথিভুক্ত করুন, ডেটা এবং আপনার মডেল ভিজুয়ালাইজ করুন, এবং MAPE ব্যবহার করে এর সঠিকতা পরীক্ষা করুন।
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ----------------------------------- |
+| | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে একটি নতুন ARIMA মডেল তৈরি, পরীক্ষা এবং ব্যাখ্যা করা হয়েছে, ভিজুয়ালাইজেশন এবং সঠিকতা উল্লেখ করা হয়েছে। | উপস্থাপিত নোটবুকটি নথিভুক্ত নয় বা ত্রুটি রয়েছে | একটি অসম্পূর্ণ নোটবুক উপস্থাপন করা হয়েছে |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/2-ARIMA/solution/Julia/README.md b/translations/bn/7-TimeSeries/2-ARIMA/solution/Julia/README.md
new file mode 100644
index 000000000..2e455735f
--- /dev/null
+++ b/translations/bn/7-TimeSeries/2-ARIMA/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/2-ARIMA/solution/R/README.md b/translations/bn/7-TimeSeries/2-ARIMA/solution/R/README.md
new file mode 100644
index 000000000..4ecbf7655
--- /dev/null
+++ b/translations/bn/7-TimeSeries/2-ARIMA/solution/R/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/2-ARIMA/solution/notebook.ipynb b/translations/bn/7-TimeSeries/2-ARIMA/solution/notebook.ipynb
new file mode 100644
index 000000000..a6c9885fa
--- /dev/null
+++ b/translations/bn/7-TimeSeries/2-ARIMA/solution/notebook.ipynb
@@ -0,0 +1,1126 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# ARIMA দিয়ে টাইম সিরিজ পূর্বাভাস\n",
+ "\n",
+ "এই নোটবুকে, আমরা দেখাবো কিভাবে:\n",
+ "- ARIMA টাইম সিরিজ পূর্বাভাস মডেলের জন্য টাইম সিরিজ ডেটা প্রস্তুত করতে হয়\n",
+ "- একটি সহজ ARIMA মডেল প্রয়োগ করে টাইম সিরিজের পরবর্তী HORIZON ধাপ (সময় *t+1* থেকে *t+HORIZON* পর্যন্ত) পূর্বাভাস করতে হয়\n",
+ "- মডেল মূল্যায়ন করতে হয়\n",
+ "\n",
+ "এই উদাহরণের ডেটা GEFCom2014 পূর্বাভাস প্রতিযোগিতা থেকে নেওয়া হয়েছে। এটি ২০১২ থেকে ২০১৪ সালের মধ্যে ৩ বছরের ঘণ্টাভিত্তিক বিদ্যুৎ লোড এবং তাপমাত্রার মান নিয়ে গঠিত। কাজটি হলো ভবিষ্যতের বিদ্যুৎ লোডের মান পূর্বাভাস করা। এই উদাহরণে, আমরা কেবল ঐতিহাসিক লোড ডেটা ব্যবহার করে এক ধাপ আগের সময়ের পূর্বাভাস দেখাবো।\n",
+ "\n",
+ "তাও হং, পিয়েরে পিনসন, শু ফ্যান, হামিদরেজা জারেইপুর, আলবার্তো ট্রোকোলি এবং রব জে. হাইন্ডম্যান, \"সম্ভাব্য শক্তি পূর্বাভাস: গ্লোবাল এনার্জি ফোরকাস্টিং কম্পিটিশন ২০১৪ এবং তার পরবর্তী\", ইন্টারন্যাশনাল জার্নাল অফ ফোরকাস্টিং, ভলিউম ৩২, নং ৩, পৃষ্ঠা ৮৯৬-৯১৩, জুলাই-সেপ্টেম্বর, ২০১৬।\n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## নির্ভরশীলতা ইনস্টল করুন \n",
+ "কিছু প্রয়োজনীয় নির্ভরশীলতা ইনস্টল করে শুরু করুন। এই লাইব্রেরিগুলি এবং তাদের সংশ্লিষ্ট সংস্করণগুলি সমাধানের জন্য কার্যকর বলে পরিচিত: \n",
+ "\n",
+ "* `statsmodels == 0.12.2` \n",
+ "* `matplotlib == 3.4.2` \n",
+ "* `scikit-learn == 0.24.2` \n"
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "source": [
+ "!pip install statsmodels"
+ ],
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "/bin/sh: pip: command not found\n"
+ ]
+ }
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "source": [
+ "import os\n",
+ "import warnings\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import datetime as dt\n",
+ "import math\n",
+ "\n",
+ "from pandas.plotting import autocorrelation_plot\n",
+ "from statsmodels.tsa.statespace.sarimax import SARIMAX\n",
+ "from sklearn.preprocessing import MinMaxScaler\n",
+ "from common.utils import load_data, mape\n",
+ "from IPython.display import Image\n",
+ "\n",
+ "%matplotlib inline\n",
+ "pd.options.display.float_format = '{:,.2f}'.format\n",
+ "np.set_printoptions(precision=2)\n",
+ "warnings.filterwarnings(\"ignore\") # specify to ignore warning messages\n"
+ ],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "source": [
+ "energy = load_data('./data')[['load']]\n",
+ "energy.head(10)"
+ ],
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [],
+ "outputs": [],
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernel_info": {
+ "name": "python3"
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "nteract": {
+ "version": "nteract-front-end@1.0.0"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "coopTranslator": {
+ "original_hash": "c193140200b9684da27e3890211391b6",
+ "translation_date": "2025-08-29T23:18:10+00:00",
+ "source_file": "7-TimeSeries/2-ARIMA/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/2-ARIMA/working/notebook.ipynb b/translations/bn/7-TimeSeries/2-ARIMA/working/notebook.ipynb
new file mode 100644
index 000000000..c930e146b
--- /dev/null
+++ b/translations/bn/7-TimeSeries/2-ARIMA/working/notebook.ipynb
@@ -0,0 +1,57 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": 3
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "523ec472196307b3c4235337353c9ceb",
+ "translation_date": "2025-08-29T23:20:03+00:00",
+ "source_file": "7-TimeSeries/2-ARIMA/working/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [
+ "এই নোটবুকে, আমরা দেখাবো কীভাবে:\n",
+ "- ARIMA টাইম সিরিজ পূর্বাভাস মডেলের জন্য টাইম সিরিজ ডেটা প্রস্তুত করা যায়\n",
+ "- একটি সাধারণ ARIMA মডেল প্রয়োগ করে টাইম সিরিজে পরবর্তী HORIZON ধাপগুলোর পূর্বাভাস করা যায় (*t+1* থেকে *t+HORIZON* পর্যন্ত)\n",
+ "- মডেল মূল্যায়ন করা যায়\n",
+ "\n",
+ "এই উদাহরণে ব্যবহৃত ডেটা GEFCom2014 পূর্বাভাস প্রতিযোগিতা থেকে নেওয়া হয়েছে। এটি ২০১২ থেকে ২০১৪ সালের মধ্যে ৩ বছরের ঘণ্টাভিত্তিক বিদ্যুৎ লোড এবং তাপমাত্রার মান নিয়ে গঠিত। কাজটি হলো ভবিষ্যতের বিদ্যুৎ লোডের মান পূর্বাভাস করা। এই উদাহরণে, আমরা দেখাবো কীভাবে শুধুমাত্র ঐতিহাসিক লোড ডেটা ব্যবহার করে এক ধাপ সময়ের পূর্বাভাস করা যায়।\n",
+ "\n",
+ "তাও হং, পিয়েরে পিনসন, শু ফ্যান, হামিদরেজা জারেইপুর, আলবার্তো ট্রোকোলি এবং রব জে. হাইন্ডম্যান, \"সম্ভাব্য শক্তি পূর্বাভাস: গ্লোবাল এনার্জি পূর্বাভাস প্রতিযোগিতা ২০১৪ এবং তার পরবর্তী\", ইন্টারন্যাশনাল জার্নাল অফ ফোরকাস্টিং, vol.32, no.3, pp 896-913, জুলাই-সেপ্টেম্বর, ২০১৬।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "pip install statsmodels"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/3-SVR/README.md b/translations/bn/7-TimeSeries/3-SVR/README.md
new file mode 100644
index 000000000..57c1d3813
--- /dev/null
+++ b/translations/bn/7-TimeSeries/3-SVR/README.md
@@ -0,0 +1,393 @@
+
+# টাইম সিরিজ পূর্বাভাস: সাপোর্ট ভেক্টর রিগ্রেসর
+
+পূর্ববর্তী পাঠে, আপনি ARIMA মডেল ব্যবহার করে টাইম সিরিজ পূর্বাভাস তৈরি করতে শিখেছেন। এখন আপনি সাপোর্ট ভেক্টর রিগ্রেসর মডেল সম্পর্কে জানবেন, যা একটি রিগ্রেসর মডেল এবং ধারাবাহিক ডেটা পূর্বাভাসের জন্য ব্যবহৃত হয়।
+
+## [পূর্ব-পাঠ কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/51/)
+
+## পরিচিতি
+
+এই পাঠে, আপনি টাইম সিরিজের জন্য রিগ্রেশন মডেল তৈরি করতে [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) এর একটি নির্দিষ্ট পদ্ধতি আবিষ্কার করবেন, যা **SVR: Support Vector Regressor** নামে পরিচিত।
+
+### টাইম সিরিজের প্রেক্ষাপটে SVR [^1]
+
+টাইম সিরিজ পূর্বাভাসে SVR এর গুরুত্ব বোঝার আগে, কিছু গুরুত্বপূর্ণ ধারণা জানা প্রয়োজন:
+
+- **রিগ্রেশন:** এটি একটি সুপারভাইজড লার্নিং টেকনিক যা প্রদত্ত ইনপুট থেকে ধারাবাহিক মান পূর্বাভাস করতে ব্যবহৃত হয়। এর মূল ধারণা হলো ফিচার স্পেসে একটি রেখা বা কার্ভ ফিট করা যা সর্বাধিক সংখ্যক ডেটা পয়েন্ট ধারণ করে। [আরও জানতে এখানে ক্লিক করুন](https://en.wikipedia.org/wiki/Regression_analysis)।
+- **সাপোর্ট ভেক্টর মেশিন (SVM):** এটি একটি সুপারভাইজড মেশিন লার্নিং মডেল যা শ্রেণীবিভাগ, রিগ্রেশন এবং আউটলায়ার ডিটেকশনের জন্য ব্যবহৃত হয়। মডেলটি ফিচার স্পেসে একটি হাইপারপ্লেন তৈরি করে, যা শ্রেণীবিভাগের ক্ষেত্রে একটি সীমানা এবং রিগ্রেশনের ক্ষেত্রে একটি সেরা-ফিট রেখা হিসেবে কাজ করে। SVM-এ সাধারণত একটি কের্নেল ফাংশন ব্যবহার করা হয় যা ডেটাসেটকে উচ্চতর মাত্রার স্পেসে রূপান্তরিত করে যাতে সেগুলো সহজে পৃথক করা যায়। [আরও জানতে এখানে ক্লিক করুন](https://en.wikipedia.org/wiki/Support-vector_machine)।
+- **সাপোর্ট ভেক্টর রিগ্রেসর (SVR):** এটি SVM-এর একটি ধরন, যা সর্বাধিক সংখ্যক ডেটা পয়েন্ট ধারণকারী সেরা-ফিট রেখা (SVM-এর ক্ষেত্রে এটি একটি হাইপারপ্লেন) খুঁজে বের করে।
+
+### কেন SVR? [^1]
+
+পূর্ববর্তী পাঠে আপনি ARIMA সম্পর্কে শিখেছেন, যা টাইম সিরিজ ডেটা পূর্বাভাসের জন্য একটি অত্যন্ত সফল পরিসংখ্যানগত রৈখিক পদ্ধতি। তবে, অনেক ক্ষেত্রে টাইম সিরিজ ডেটা *অ-রৈখিকতা* ধারণ করে, যা রৈখিক মডেল দ্বারা চিহ্নিত করা যায় না। এই ধরনের ক্ষেত্রে, রিগ্রেশন টাস্কে ডেটার অ-রৈখিকতা বিবেচনা করার জন্য SVM-এর ক্ষমতা SVR-কে টাইম সিরিজ পূর্বাভাসে সফল করে তোলে।
+
+## অনুশীলন - একটি SVR মডেল তৈরি করুন
+
+ডেটা প্রস্তুতির প্রথম কয়েকটি ধাপ পূর্ববর্তী [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) পাঠের মতোই।
+
+এই পাঠের [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) ফোল্ডার খুলুন এবং [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb) ফাইলটি খুঁজুন।[^2]
+
+1. নোটবুক চালান এবং প্রয়োজনীয় লাইব্রেরি আমদানি করুন: [^2]
+
+ ```python
+ import sys
+ sys.path.append('../../')
+ ```
+
+ ```python
+ import os
+ import warnings
+ import matplotlib.pyplot as plt
+ import numpy as np
+ import pandas as pd
+ import datetime as dt
+ import math
+
+ from sklearn.svm import SVR
+ from sklearn.preprocessing import MinMaxScaler
+ from common.utils import load_data, mape
+ ```
+
+2. `/data/energy.csv` ফাইল থেকে ডেটা একটি Pandas ডেটাফ্রেমে লোড করুন এবং দেখুন: [^2]
+
+ ```python
+ energy = load_data('../../data')[['load']]
+ ```
+
+3. জানুয়ারি ২০১২ থেকে ডিসেম্বর ২০১৪ পর্যন্ত সমস্ত এনার্জি ডেটা প্লট করুন: [^2]
+
+ ```python
+ energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
+ plt.xlabel('timestamp', fontsize=12)
+ plt.ylabel('load', fontsize=12)
+ plt.show()
+ ```
+
+ 
+
+ এখন, আমাদের SVR মডেল তৈরি করা যাক।
+
+### প্রশিক্ষণ এবং পরীক্ষার ডেটাসেট তৈরি করুন
+
+এখন আপনার ডেটা লোড হয়েছে, তাই আপনি এটি প্রশিক্ষণ এবং পরীক্ষা সেটে ভাগ করতে পারেন। এরপর আপনি ডেটাকে পুনরায় আকার দেবেন যাতে এটি টাইম-স্টেপ ভিত্তিক ডেটাসেট তৈরি করে, যা SVR-এর জন্য প্রয়োজন হবে। আপনি আপনার মডেলটি প্রশিক্ষণ সেটে প্রশিক্ষণ দেবেন। মডেলটি প্রশিক্ষণ শেষ করার পরে, আপনি এর সঠিকতা প্রশিক্ষণ সেট, পরীক্ষা সেট এবং সম্পূর্ণ ডেটাসেটে মূল্যায়ন করবেন যাতে সামগ্রিক কার্যকারিতা দেখা যায়। নিশ্চিত করুন যে পরীক্ষা সেটটি প্রশিক্ষণ সেটের পরে সময়ের একটি সময়কাল কভার করে যাতে মডেল ভবিষ্যতের সময়কাল থেকে তথ্য না পায় [^2] (যা *ওভারফিটিং* নামে পরিচিত)।
+
+1. ১ সেপ্টেম্বর থেকে ৩১ অক্টোবর, ২০১৪ পর্যন্ত দুই মাসের সময়কাল প্রশিক্ষণ সেটে বরাদ্দ করুন। পরীক্ষা সেটটি ১ নভেম্বর থেকে ৩১ ডিসেম্বর, ২০১৪ পর্যন্ত দুই মাসের সময়কাল অন্তর্ভুক্ত করবে: [^2]
+
+ ```python
+ train_start_dt = '2014-11-01 00:00:00'
+ test_start_dt = '2014-12-30 00:00:00'
+ ```
+
+2. পার্থক্যগুলো ভিজ্যুয়ালাইজ করুন: [^2]
+
+ ```python
+ energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
+ .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
+ .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
+ plt.xlabel('timestamp', fontsize=12)
+ plt.ylabel('load', fontsize=12)
+ plt.show()
+ ```
+
+ 
+
+### প্রশিক্ষণের জন্য ডেটা প্রস্তুত করুন
+
+এখন, আপনাকে ডেটা প্রশিক্ষণের জন্য প্রস্তুত করতে হবে। এর জন্য ডেটা ফিল্টারিং এবং স্কেলিং করতে হবে। আপনার ডেটাসেট ফিল্টার করুন যাতে শুধুমাত্র প্রয়োজনীয় সময়কাল এবং কলাম অন্তর্ভুক্ত থাকে এবং স্কেলিং করুন যাতে ডেটা ০ এবং ১ এর মধ্যে প্রজেক্ট করা যায়।
+
+1. মূল ডেটাসেট ফিল্টার করুন যাতে শুধুমাত্র উল্লেখিত সময়কাল এবং কলাম 'load' এবং তারিখ অন্তর্ভুক্ত থাকে: [^2]
+
+ ```python
+ train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
+ test = energy.copy()[energy.index >= test_start_dt][['load']]
+
+ print('Training data shape: ', train.shape)
+ print('Test data shape: ', test.shape)
+ ```
+
+ ```output
+ Training data shape: (1416, 1)
+ Test data shape: (48, 1)
+ ```
+
+2. প্রশিক্ষণ ডেটা স্কেল করুন যাতে এটি (০, ১) পরিসরে থাকে: [^2]
+
+ ```python
+ scaler = MinMaxScaler()
+ train['load'] = scaler.fit_transform(train)
+ ```
+
+4. এখন, আপনি পরীক্ষা ডেটা স্কেল করবেন: [^2]
+
+ ```python
+ test['load'] = scaler.transform(test)
+ ```
+
+### টাইম-স্টেপ সহ ডেটা তৈরি করুন [^1]
+
+SVR-এর জন্য, আপনি ইনপুট ডেটাকে `[batch, timesteps]` আকারে রূপান্তরিত করবেন। তাই, আপনি বিদ্যমান `train_data` এবং `test_data` পুনরায় আকার দেবেন যাতে একটি নতুন মাত্রা থাকে যা টাইমস্টেপ নির্দেশ করে।
+
+```python
+# Converting to numpy arrays
+train_data = train.values
+test_data = test.values
+```
+
+এই উদাহরণের জন্য, আমরা `timesteps = 5` গ্রহণ করি। তাই, মডেলের ইনপুট হবে প্রথম ৪টি টাইমস্টেপের ডেটা, এবং আউটপুট হবে ৫ম টাইমস্টেপের ডেটা।
+
+```python
+timesteps=5
+```
+
+প্রশিক্ষণ ডেটাকে ২D টেনসরে রূপান্তরিত করা:
+
+```python
+train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0]
+train_data_timesteps.shape
+```
+
+```output
+(1412, 5)
+```
+
+পরীক্ষা ডেটাকে ২D টেনসরে রূপান্তরিত করা:
+
+```python
+test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0]
+test_data_timesteps.shape
+```
+
+```output
+(44, 5)
+```
+
+প্রশিক্ষণ এবং পরীক্ষার ডেটা থেকে ইনপুট এবং আউটপুট নির্বাচন:
+
+```python
+x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]]
+x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]]
+
+print(x_train.shape, y_train.shape)
+print(x_test.shape, y_test.shape)
+```
+
+```output
+(1412, 4) (1412, 1)
+(44, 4) (44, 1)
+```
+
+### SVR বাস্তবায়ন করুন [^1]
+
+এখন, SVR বাস্তবায়নের সময়। এই বাস্তবায়ন সম্পর্কে আরও জানতে, আপনি [এই ডকুমেন্টেশন](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html) দেখতে পারেন। আমাদের বাস্তবায়নের জন্য, আমরা নিম্নলিখিত ধাপগুলো অনুসরণ করি:
+
+ 1. `SVR()` কল করে এবং মডেলের হাইপারপ্যারামিটারগুলো পাস করে মডেল সংজ্ঞায়িত করুন: kernel, gamma, c এবং epsilon
+ 2. `fit()` ফাংশন কল করে প্রশিক্ষণ ডেটার জন্য মডেল প্রস্তুত করুন
+ 3. `predict()` ফাংশন কল করে পূর্বাভাস তৈরি করুন
+
+এখন আমরা একটি SVR মডেল তৈরি করি। এখানে আমরা [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) ব্যবহার করি এবং gamma, C এবং epsilon এর মান যথাক্রমে ০.৫, ১০ এবং ০.০৫ সেট করি।
+
+```python
+model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05)
+```
+
+#### প্রশিক্ষণ ডেটায় মডেল ফিট করুন [^1]
+
+```python
+model.fit(x_train, y_train[:,0])
+```
+
+```output
+SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5,
+ kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
+```
+
+#### মডেল পূর্বাভাস তৈরি করুন [^1]
+
+```python
+y_train_pred = model.predict(x_train).reshape(-1,1)
+y_test_pred = model.predict(x_test).reshape(-1,1)
+
+print(y_train_pred.shape, y_test_pred.shape)
+```
+
+```output
+(1412, 1) (44, 1)
+```
+
+আপনি আপনার SVR তৈরি করেছেন! এখন আমরা এটি মূল্যায়ন করব।
+
+### আপনার মডেল মূল্যায়ন করুন [^1]
+
+মূল্যায়নের জন্য, প্রথমে আমরা ডেটাকে আমাদের মূল স্কেলে স্কেল ব্যাক করব। এরপর, পারফরম্যান্স পরীক্ষা করতে, আমরা মূল এবং পূর্বাভাসকৃত টাইম সিরিজ প্লট করব এবং MAPE ফলাফল প্রিন্ট করব।
+
+পূর্বাভাসকৃত এবং মূল আউটপুট স্কেল করুন:
+
+```python
+# Scaling the predictions
+y_train_pred = scaler.inverse_transform(y_train_pred)
+y_test_pred = scaler.inverse_transform(y_test_pred)
+
+print(len(y_train_pred), len(y_test_pred))
+```
+
+```python
+# Scaling the original values
+y_train = scaler.inverse_transform(y_train)
+y_test = scaler.inverse_transform(y_test)
+
+print(len(y_train), len(y_test))
+```
+
+#### প্রশিক্ষণ এবং পরীক্ষার ডেটায় মডেলের পারফরম্যান্স পরীক্ষা করুন [^1]
+
+আমরা ডেটাসেট থেকে টাইমস্ট্যাম্পগুলো বের করি যাতে আমাদের প্লটের x-অক্ষে দেখানো যায়। মনে রাখবেন যে আমরা প্রথম ```timesteps-1``` মানগুলো প্রথম আউটপুটের জন্য ইনপুট হিসেবে ব্যবহার করছি, তাই আউটপুটের টাইমস্ট্যাম্পগুলো এর পরে শুরু হবে।
+
+```python
+train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:]
+test_timestamps = energy[test_start_dt:].index[timesteps-1:]
+
+print(len(train_timestamps), len(test_timestamps))
+```
+
+```output
+1412 44
+```
+
+প্রশিক্ষণ ডেটার জন্য পূর্বাভাস প্লট করুন:
+
+```python
+plt.figure(figsize=(25,6))
+plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6)
+plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8)
+plt.legend(['Actual','Predicted'])
+plt.xlabel('Timestamp')
+plt.title("Training data prediction")
+plt.show()
+```
+
+
+
+প্রশিক্ষণ ডেটার জন্য MAPE প্রিন্ট করুন
+
+```python
+print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')
+```
+
+```output
+MAPE for training data: 1.7195710200875551 %
+```
+
+পরীক্ষা ডেটার জন্য পূর্বাভাস প্লট করুন
+
+```python
+plt.figure(figsize=(10,3))
+plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6)
+plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8)
+plt.legend(['Actual','Predicted'])
+plt.xlabel('Timestamp')
+plt.show()
+```
+
+
+
+পরীক্ষা ডেটার জন্য MAPE প্রিন্ট করুন
+
+```python
+print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')
+```
+
+```output
+MAPE for testing data: 1.2623790187854018 %
+```
+
+🏆 আপনি পরীক্ষার ডেটাসেটে খুব ভালো ফলাফল পেয়েছেন!
+
+### সম্পূর্ণ ডেটাসেটে মডেলের পারফরম্যান্স পরীক্ষা করুন [^1]
+
+```python
+# Extracting load values as numpy array
+data = energy.copy().values
+
+# Scaling
+data = scaler.transform(data)
+
+# Transforming to 2D tensor as per model input requirement
+data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0]
+print("Tensor shape: ", data_timesteps.shape)
+
+# Selecting inputs and outputs from data
+X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]]
+print("X shape: ", X.shape,"\nY shape: ", Y.shape)
+```
+
+```output
+Tensor shape: (26300, 5)
+X shape: (26300, 4)
+Y shape: (26300, 1)
+```
+
+```python
+# Make model predictions
+Y_pred = model.predict(X).reshape(-1,1)
+
+# Inverse scale and reshape
+Y_pred = scaler.inverse_transform(Y_pred)
+Y = scaler.inverse_transform(Y)
+```
+
+```python
+plt.figure(figsize=(30,8))
+plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6)
+plt.plot(Y_pred, color = 'blue', linewidth=0.8)
+plt.legend(['Actual','Predicted'])
+plt.xlabel('Timestamp')
+plt.show()
+```
+
+
+
+```python
+print('MAPE: ', mape(Y_pred, Y)*100, '%')
+```
+
+```output
+MAPE: 2.0572089029888656 %
+```
+
+🏆 খুব সুন্দর প্লট, যা একটি ভালো সঠিকতা সম্পন্ন মডেল দেখাচ্ছে। খুব ভালো কাজ করেছেন!
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+- মডেল তৈরি করার সময় হাইপারপ্যারামিটারগুলো (gamma, C, epsilon) পরিবর্তন করে দেখুন এবং ডেটায় মূল্যায়ন করুন যাতে কোন সেটের হাইপারপ্যারামিটার পরীক্ষার ডেটায় সেরা ফলাফল দেয়। এই হাইপারপ্যারামিটারগুলো সম্পর্কে আরও জানতে, আপনি [এই ডকুমেন্ট](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) দেখতে পারেন।
+- মডেলের জন্য বিভিন্ন কের্নেল ফাংশন ব্যবহার করে দেখুন এবং তাদের পারফরম্যান্স ডেটাসেটে বিশ্লেষণ করুন। একটি সহায়ক ডকুমেন্ট [এখানে](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) পাওয়া যাবে।
+- মডেলের জন্য `timesteps` এর বিভিন্ন মান ব্যবহার করে দেখুন যাতে পূর্বাভাস তৈরি করার জন্য মডেলটি পিছনে তাকাতে পারে।
+
+## [পাঠ-পরবর্তী কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/52/)
+
+## পর্যালোচনা এবং স্ব-অধ্যয়ন
+
+এই পাঠটি টাইম সিরিজ পূর্বাভাসের জন্য SVR-এর প্রয়োগ পরিচিত করানোর জন্য ছিল। SVR সম্পর্কে আরও পড়তে, আপনি [এই ব্লগ](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/) দেখতে পারেন। এই [scikit-learn ডকুমেন্টেশন](https://scikit-learn.org/stable/modules/svm.html) SVMs, [SVRs](https://scikit-learn.org/stable/modules/svm.html#regression) এবং অন্যান্য বাস্তবায়ন বিশদ যেমন বিভিন্ন [কের্নেল ফাংশন](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) এবং তাদের প্যারামিটার সম্পর্কে আরও ব্যাপক ব্যাখ্যা প্রদান করে।
+
+## অ্যাসাইনমেন্ট
+
+[একটি নতুন SVR মডেল](assignment.md)
+
+## ক্রেডিট
+
+[^1]: এই অংশের টেক্সট, কোড এবং আউটপুট [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD) দ্বারা অবদান রাখা হয়েছে।
+[^2]: এই অংশের টেক্সট, কোড এবং আউটপুট [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA) থেকে নেওয়া হয়েছে।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/3-SVR/assignment.md b/translations/bn/7-TimeSeries/3-SVR/assignment.md
new file mode 100644
index 000000000..34415dd2e
--- /dev/null
+++ b/translations/bn/7-TimeSeries/3-SVR/assignment.md
@@ -0,0 +1,29 @@
+
+# একটি নতুন SVR মডেল
+
+## নির্দেশাবলী [^1]
+
+এখন যেহেতু আপনি একটি SVR মডেল তৈরি করেছেন, এবার নতুন ডেটা ব্যবহার করে একটি নতুন মডেল তৈরি করুন (ডিউকের [এই ডেটাসেটগুলোর](http://www2.stat.duke.edu/~mw/ts_data_sets.html) একটি চেষ্টা করতে পারেন)। আপনার কাজ একটি নোটবুকে ব্যাখ্যা করুন, ডেটা এবং আপনার মডেল ভিজুয়ালাইজ করুন এবং উপযুক্ত প্লট এবং MAPE ব্যবহার করে এর সঠিকতা পরীক্ষা করুন। এছাড়াও বিভিন্ন হাইপারপ্যারামিটার পরিবর্তন করে দেখুন এবং টাইমস্টেপের জন্য বিভিন্ন মান ব্যবহার করে চেষ্টা করুন।
+
+## মূল্যায়ন মানদণ্ড [^1]
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ---------------------------------------------------------- | --------------------------------------------------------- | ----------------------------------- |
+| | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে একটি SVR মডেল তৈরি, পরীক্ষা এবং ভিজুয়ালাইজেশন সহ ব্যাখ্যা করা হয়েছে এবং সঠিকতা উল্লেখ করা হয়েছে। | উপস্থাপিত নোটবুকটি ব্যাখ্যা করা হয়নি বা ত্রুটি রয়েছে। | একটি অসম্পূর্ণ নোটবুক উপস্থাপন করা হয়েছে। |
+
+
+
+[^1]:এই অংশের লেখা [ARIMA-এর অ্যাসাইনমেন্ট](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md) থেকে ভিত্তি করে তৈরি।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখুন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/3-SVR/solution/notebook.ipynb b/translations/bn/7-TimeSeries/3-SVR/solution/notebook.ipynb
new file mode 100644
index 000000000..a2baa011c
--- /dev/null
+++ b/translations/bn/7-TimeSeries/3-SVR/solution/notebook.ipynb
@@ -0,0 +1,1029 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "fv9OoQsMFk5A"
+ },
+ "source": [
+ "# সাপোর্ট ভেক্টর রিগ্রেসর ব্যবহার করে টাইম সিরিজ পূর্বাভাস\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "এই নোটবুকে আমরা দেখাবো কীভাবে:\n",
+ "\n",
+ "- ২ডি টাইম সিরিজ ডেটা প্রস্তুত করা যায় একটি SVM রিগ্রেসর মডেল প্রশিক্ষণের জন্য \n",
+ "- RBF কার্নেল ব্যবহার করে SVR বাস্তবায়ন করা \n",
+ "- প্লট এবং MAPE ব্যবহার করে মডেল মূল্যায়ন করা \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## মডিউল আমদানি\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import sys\n",
+ "sys.path.append('../../')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "id": "M687KNlQFp0-"
+ },
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import warnings\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import datetime as dt\n",
+ "import math\n",
+ "\n",
+ "from sklearn.svm import SVR\n",
+ "from sklearn.preprocessing import MinMaxScaler\n",
+ "from common.utils import load_data, mape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Cj-kfVdMGjWP"
+ },
+ "source": [
+ "## ডেটা প্রস্তুত করা\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "8fywSjC6GsRz"
+ },
+ "source": [
+ "### ডেটা লোড করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 363
+ },
+ "id": "aBDkEB11Fumg",
+ "outputId": "99cf7987-0509-4b73-8cc2-75d7da0d2740"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ " load\n",
+ "2012-01-01 00:00:00 2698.0\n",
+ "2012-01-01 01:00:00 2558.0\n",
+ "2012-01-01 02:00:00 2444.0\n",
+ "2012-01-01 03:00:00 2402.0\n",
+ "2012-01-01 04:00:00 2403.0"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "energy = load_data('../../data')[['load']]\n",
+ "energy.head(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "O0BWP13rGnh4"
+ },
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 486
+ },
+ "id": "hGaNPKu_Gidk",
+ "outputId": "7f89b326-9057-4f49-efbe-cb100ebdf76d"
+ },
+ "outputs": [],
+ "source": [
+ "energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)\n",
+ "plt.xlabel('timestamp', fontsize=12)\n",
+ "plt.ylabel('load', fontsize=12)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "IPuNor4eGwYY"
+ },
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ysvsNyONGt0Q"
+ },
+ "outputs": [],
+ "source": [
+ "train_start_dt = '2014-11-01 00:00:00'\n",
+ "test_start_dt = '2014-12-30 00:00:00'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 548
+ },
+ "id": "SsfdLoPyGy9w",
+ "outputId": "d6d6c25b-b1f4-47e5-91d1-707e043237d7"
+ },
+ "outputs": [],
+ "source": [
+ "energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \\\n",
+ " .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \\\n",
+ " .plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)\n",
+ "plt.xlabel('timestamp', fontsize=12)\n",
+ "plt.ylabel('load', fontsize=12)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "XbFTqBw6G1Ch"
+ },
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "এখন, আপনাকে আপনার ডেটা প্রশিক্ষণের জন্য প্রস্তুত করতে ফিল্টারিং এবং স্কেলিং সম্পাদন করতে হবে।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "cYivRdQpHDj3",
+ "outputId": "a138f746-461c-4fd6-bfa6-0cee094c4aa1"
+ },
+ "outputs": [],
+ "source": [
+ "train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]\n",
+ "test = energy.copy()[energy.index >= test_start_dt][['load']]\n",
+ "\n",
+ "print('Training data shape: ', train.shape)\n",
+ "print('Test data shape: ', test.shape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "ডেটাকে (0, 1) পরিসরে স্কেল করুন।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 363
+ },
+ "id": "3DNntGQnZX8G",
+ "outputId": "210046bc-7a66-4ccd-d70d-aa4a7309949c"
+ },
+ "outputs": [],
+ "source": [
+ "scaler = MinMaxScaler()\n",
+ "train['load'] = scaler.fit_transform(train)\n",
+ "train.head(5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 206
+ },
+ "id": "26Yht-rzZexe",
+ "outputId": "20326077-a38a-4e78-cc5b-6fd7af95d301"
+ },
+ "outputs": [],
+ "source": [
+ "test['load'] = scaler.transform(test)\n",
+ "test.head(5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "x0n6jqxOQ41Z"
+ },
+ "source": [
+ "### সময়-ধাপ সহ ডেটা তৈরি করা\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "fdmxTZtOQ8xs"
+ },
+ "source": [
+ "আমাদের SVR-এর জন্য, আমরা ইনপুট ডেটাকে `[batch, timesteps]` আকারে রূপান্তর করি। তাই, আমরা বিদ্যমান `train_data` এবং `test_data`-কে পুনরায় আকার দিই যাতে একটি নতুন dimension থাকে যা timesteps নির্দেশ করে। আমাদের উদাহরণের জন্য, আমরা `timesteps = 5` গ্রহণ করি। সুতরাং, মডেলের ইনপুট হবে প্রথম ৪টি timestep-এর ডেটা, এবং আউটপুট হবে ৫ম timestep-এর ডেটা।\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Rpju-Sc2HFm0"
+ },
+ "outputs": [],
+ "source": [
+ "# Converting to numpy arrays\n",
+ "\n",
+ "train_data = train.values\n",
+ "test_data = test.values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Selecting the timesteps\n",
+ "\n",
+ "timesteps=None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "O-JrsrsVJhUQ",
+ "outputId": "c90dbe71-bacc-4ec4-b452-f82fe5aefaef"
+ },
+ "outputs": [],
+ "source": [
+ "# Converting data to 2D tensor\n",
+ "\n",
+ "train_data_timesteps=None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "exJD8AI7KE4g",
+ "outputId": "ce90260c-f327-427d-80f2-77307b5a6318"
+ },
+ "outputs": [],
+ "source": [
+ "# Converting test data to 2D tensor\n",
+ "\n",
+ "test_data_timesteps=None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "2u0R2sIsLuq5"
+ },
+ "outputs": [],
+ "source": [
+ "x_train, y_train = None\n",
+ "x_test, y_test = None\n",
+ "\n",
+ "print(x_train.shape, y_train.shape)\n",
+ "print(x_test.shape, y_test.shape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "8wIPOtAGLZlh"
+ },
+ "source": [
+ "## এসভিআর মডেল তৈরি করা\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "EhA403BEPEiD"
+ },
+ "outputs": [],
+ "source": [
+ "# Create model using RBF kernel\n",
+ "\n",
+ "model = None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "GS0UA3csMbqp",
+ "outputId": "d86b6f05-5742-4c1d-c2db-c40510bd4f0d"
+ },
+ "outputs": [],
+ "source": [
+ "# Fit model on training data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Rz_x8S3UrlcF"
+ },
+ "source": [
+ "### মডেল পূর্বাভাস তৈরি করুন\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "XR0gnt3MnuYS",
+ "outputId": "157e40ab-9a23-4b66-a885-0d52a24b2364"
+ },
+ "outputs": [],
+ "source": [
+ "# Making predictions\n",
+ "\n",
+ "y_train_pred = None\n",
+ "y_test_pred = None"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "_2epncg-SGzr"
+ },
+ "source": [
+ "## মডেলের কার্যক্ষমতা বিশ্লেষণ\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Scaling the predictions\n",
+ "\n",
+ "y_train_pred = scaler.inverse_transform(y_train_pred)\n",
+ "y_test_pred = scaler.inverse_transform(y_test_pred)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "xmm_YLXhq7gV",
+ "outputId": "18392f64-4029-49ac-c71a-a4e2411152a1"
+ },
+ "outputs": [],
+ "source": [
+ "# Scaling the original values\n",
+ "\n",
+ "y_train = scaler.inverse_transform(y_train)\n",
+ "y_test = scaler.inverse_transform(y_test)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "u3LBj93coHEi",
+ "outputId": "d4fd49e8-8c6e-4bb0-8ef9-ca0b26d725b4"
+ },
+ "outputs": [],
+ "source": [
+ "# Extract the timesteps for x-axis\n",
+ "\n",
+ "train_timestamps = None\n",
+ "test_timestamps = None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "plt.figure(figsize=(25,6))\n",
+ "# plot original output\n",
+ "# plot predicted output\n",
+ "plt.legend(['Actual','Predicted'])\n",
+ "plt.xlabel('Timestamp')\n",
+ "plt.title(\"Training data prediction\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "LnhzcnYtXHCm",
+ "outputId": "f5f0d711-f18b-4788-ad21-d4470ea2c02b"
+ },
+ "outputs": [],
+ "source": [
+ "print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 225
+ },
+ "id": "53Q02FoqQH4V",
+ "outputId": "53e2d59b-5075-4765-ad9e-aed56c966583"
+ },
+ "outputs": [],
+ "source": [
+ "plt.figure(figsize=(10,3))\n",
+ "# plot original output\n",
+ "# plot predicted output\n",
+ "plt.legend(['Actual','Predicted'])\n",
+ "plt.xlabel('Timestamp')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "clOAUH-SXCJG",
+ "outputId": "a3aa85ff-126a-4a4a-cd9e-90b9cc465ef5"
+ },
+ "outputs": [],
+ "source": [
+ "print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "DHlKvVCId5ue"
+ },
+ "source": [
+ "## সম্পূর্ণ ডেটাসেট পূর্বাভাস\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "cOFJ45vreO0N",
+ "outputId": "35628e33-ecf9-4966-8036-f7ea86db6f16"
+ },
+ "outputs": [],
+ "source": [
+ "# Extracting load values as numpy array\n",
+ "data = None\n",
+ "\n",
+ "# Scaling\n",
+ "data = None\n",
+ "\n",
+ "# Transforming to 2D tensor as per model input requirement\n",
+ "data_timesteps=None\n",
+ "\n",
+ "# Selecting inputs and outputs from data\n",
+ "X, Y = None, None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ESSAdQgwexIi"
+ },
+ "outputs": [],
+ "source": [
+ "# Make model predictions\n",
+ "\n",
+ "# Inverse scale and reshape\n",
+ "Y_pred = None\n",
+ "Y = None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 328
+ },
+ "id": "M_qhihN0RVVX",
+ "outputId": "a89cb23e-1d35-437f-9d63-8b8907e12f80"
+ },
+ "outputs": [],
+ "source": [
+ "plt.figure(figsize=(30,8))\n",
+ "# plot original output\n",
+ "# plot predicted output\n",
+ "plt.legend(['Actual','Predicted'])\n",
+ "plt.xlabel('Timestamp')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "AcN7pMYXVGTK",
+ "outputId": "7e1c2161-47ce-496c-9d86-7ad9ae0df770"
+ },
+ "outputs": [],
+ "source": [
+ "print('MAPE: ', mape(Y_pred, Y)*100, '%')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় থাকা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "collapsed_sections": [],
+ "name": "Recurrent_Neural_Networks.ipynb",
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.1"
+ },
+ "coopTranslator": {
+ "original_hash": "e86ce102239a14c44585623b9b924a74",
+ "translation_date": "2025-08-29T23:23:56+00:00",
+ "source_file": "7-TimeSeries/3-SVR/working/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/translations/bn/7-TimeSeries/README.md b/translations/bn/7-TimeSeries/README.md
new file mode 100644
index 000000000..c7ceb886c
--- /dev/null
+++ b/translations/bn/7-TimeSeries/README.md
@@ -0,0 +1,37 @@
+
+# টাইম সিরিজ পূর্বাভাসের পরিচিতি
+
+টাইম সিরিজ পূর্বাভাস কী? এটি অতীতের প্রবণতা বিশ্লেষণ করে ভবিষ্যতের ঘটনা পূর্বাভাস দেওয়ার একটি পদ্ধতি।
+
+## আঞ্চলিক বিষয়: বিশ্বব্যাপী বিদ্যুৎ ব্যবহার ✨
+
+এই দুটি পাঠে, আপনাকে টাইম সিরিজ পূর্বাভাসের সাথে পরিচয় করানো হবে, যা মেশিন লার্নিংয়ের একটি তুলনামূলকভাবে কম পরিচিত ক্ষেত্র হলেও শিল্প এবং ব্যবসায়িক প্রয়োগসহ অন্যান্য ক্ষেত্রে অত্যন্ত মূল্যবান। যদিও নিউরাল নেটওয়ার্ক এই মডেলগুলোর কার্যকারিতা বাড়াতে ব্যবহার করা যেতে পারে, আমরা এগুলোকে ক্লাসিক্যাল মেশিন লার্নিংয়ের প্রেক্ষাপটে অধ্যয়ন করব, যেখানে মডেলগুলো অতীতের উপর ভিত্তি করে ভবিষ্যতের কর্মক্ষমতা পূর্বাভাস দিতে সাহায্য করে।
+
+আমাদের আঞ্চলিক ফোকাস হলো বিশ্বব্যাপী বিদ্যুৎ ব্যবহার, যা একটি আকর্ষণীয় ডেটাসেট যা অতীতের লোডের প্যাটার্নের উপর ভিত্তি করে ভবিষ্যতের বিদ্যুৎ ব্যবহারের পূর্বাভাস সম্পর্কে শেখার সুযোগ দেয়। আপনি দেখতে পাবেন যে এই ধরনের পূর্বাভাস ব্যবসায়িক পরিবেশে কতটা কার্যকর হতে পারে।
+
+
+
+ছবি [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) কর্তৃক, রাজস্থানের একটি রাস্তায় বৈদ্যুতিক টাওয়ারের। [Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) থেকে নেওয়া।
+
+## পাঠসমূহ
+
+1. [টাইম সিরিজ পূর্বাভাসের পরিচিতি](1-Introduction/README.md)
+2. [ARIMA টাইম সিরিজ মডেল তৈরি করা](2-ARIMA/README.md)
+3. [টাইম সিরিজ পূর্বাভাসের জন্য সাপোর্ট ভেক্টর রিগ্রেসর তৈরি করা](3-SVR/README.md)
+
+## কৃতজ্ঞতা
+
+"টাইম সিরিজ পূর্বাভাসের পরিচিতি" ⚡️ দিয়ে লিখেছেন [Francesca Lazzeri](https://twitter.com/frlazzeri) এবং [Jen Looper](https://twitter.com/jenlooper)। নোটবুকগুলো প্রথমে অনলাইনে প্রকাশিত হয়েছিল [Azure "Deep Learning For Time Series" রিপোতে](https://github.com/Azure/DeepLearningForTimeSeriesForecasting), যা মূলত Francesca Lazzeri লিখেছিলেন। SVR পাঠটি লিখেছেন [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD)।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/1-QLearning/README.md b/translations/bn/8-Reinforcement/1-QLearning/README.md
new file mode 100644
index 000000000..841743368
--- /dev/null
+++ b/translations/bn/8-Reinforcement/1-QLearning/README.md
@@ -0,0 +1,258 @@
+
+# রিইনফোর্সমেন্ট লার্নিং এবং কিউ-লার্নিং এর পরিচিতি
+
+
+> স্কেচনোট: [Tomomi Imura](https://www.twitter.com/girlie_mac)
+
+রিইনফোর্সমেন্ট লার্নিং তিনটি গুরুত্বপূর্ণ ধারণার উপর ভিত্তি করে কাজ করে: এজেন্ট, কিছু স্টেট এবং প্রতিটি স্টেটের জন্য একটি অ্যাকশনের সেট। নির্দিষ্ট স্টেটে একটি অ্যাকশন সম্পাদন করার মাধ্যমে, এজেন্ট একটি রিওয়ার্ড পায়। আবার কল্পনা করুন কম্পিউটার গেম সুপার মারিও। আপনি মারিও, আপনি একটি গেম লেভেলে আছেন, একটি খাদের কিনারায় দাঁড়িয়ে। আপনার উপরে একটি কয়েন। আপনি মারিও হিসেবে, একটি গেম লেভেলে, একটি নির্দিষ্ট অবস্থানে আছেন ... এটিই আপনার স্টেট। ডানদিকে এক ধাপ এগোনো (একটি অ্যাকশন) আপনাকে খাদে ফেলে দেবে, এবং এটি আপনাকে একটি কম সংখ্যাসূচক স্কোর দেবে। তবে, জাম্প বাটন চাপলে আপনি একটি পয়েন্ট পাবেন এবং বেঁচে থাকবেন। এটি একটি ইতিবাচক ফলাফল এবং এটি আপনাকে একটি ইতিবাচক সংখ্যাসূচক স্কোর দেবে।
+
+রিইনফোর্সমেন্ট লার্নিং এবং একটি সিমুলেটর (গেম) ব্যবহার করে, আপনি গেমটি খেলার কৌশল শিখতে পারেন যাতে আপনি বেঁচে থাকতে পারেন এবং যত বেশি সম্ভব পয়েন্ট অর্জন করতে পারেন।
+
+[](https://www.youtube.com/watch?v=lDq_en8RNOo)
+
+> 🎥 উপরের ছবিতে ক্লিক করে Dmitry এর রিইনফোর্সমেন্ট লার্নিং নিয়ে আলোচনা শুনুন
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/45/)
+
+## প্রয়োজনীয়তা এবং সেটআপ
+
+এই পাঠে, আমরা পাইথন কোড নিয়ে কিছু পরীক্ষা করব। আপনাকে এই পাঠের জুপিটার নোটবুক কোড চালাতে সক্ষম হতে হবে, হয় আপনার কম্পিউটারে অথবা ক্লাউডে।
+
+আপনি [পাঠের নোটবুকটি](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) খুলে এই পাঠটি অনুসরণ করতে পারেন।
+
+> **নোট:** যদি আপনি ক্লাউড থেকে এই কোডটি খুলে থাকেন, তবে আপনাকে [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) ফাইলটিও আনতে হবে, যা নোটবুক কোডে ব্যবহৃত হয়। এটি নোটবুকের একই ডিরেক্টরিতে যোগ করুন।
+
+## পরিচিতি
+
+এই পাঠে, আমরা **[Peter and the Wolf](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)** এর জগৎ অন্বেষণ করব, যা রাশিয়ান সুরকার [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev) এর একটি সঙ্গীতধর্মী রূপকথা দ্বারা অনুপ্রাণিত। আমরা **রিইনফোর্সমেন্ট লার্নিং** ব্যবহার করব যাতে পিটার তার পরিবেশ অন্বেষণ করতে পারে, সুস্বাদু আপেল সংগ্রহ করতে পারে এবং নেকড়ের সাথে দেখা এড়াতে পারে।
+
+**রিইনফোর্সমেন্ট লার্নিং** (RL) একটি শেখার কৌশল যা আমাদেরকে একটি **এজেন্ট** এর **পরিবেশে** একটি সর্বোত্তম আচরণ শেখার সুযোগ দেয়, অনেক পরীক্ষা চালানোর মাধ্যমে। এই পরিবেশে একটি এজেন্টের একটি **লক্ষ্য** থাকা উচিত, যা একটি **রিওয়ার্ড ফাংশন** দ্বারা সংজ্ঞায়িত।
+
+## পরিবেশ
+
+সরলতার জন্য, পিটারের জগৎকে একটি `width` x `height` আকারের বর্গাকার বোর্ড হিসেবে বিবেচনা করা যাক, যেমন:
+
+
+
+এই বোর্ডের প্রতিটি সেল হতে পারে:
+
+* **মাটি**, যেখানে পিটার এবং অন্যান্য প্রাণীরা হাঁটতে পারে।
+* **পানি**, যেখানে হাঁটা সম্ভব নয়।
+* একটি **গাছ** বা **ঘাস**, যেখানে বিশ্রাম নেওয়া যায়।
+* একটি **আপেল**, যা পিটারের জন্য খাওয়ার উপযোগী।
+* একটি **নেকড়ে**, যা বিপজ্জনক এবং এড়িয়ে চলা উচিত।
+
+একটি পৃথক পাইথন মডিউল, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), এই পরিবেশের সাথে কাজ করার কোড ধারণ করে। যেহেতু এই কোডটি আমাদের ধারণাগুলি বোঝার জন্য গুরুত্বপূর্ণ নয়, আমরা মডিউলটি ইমপোর্ট করব এবং একটি নমুনা বোর্ড তৈরি করতে এটি ব্যবহার করব (কোড ব্লক 1):
+
+```python
+from rlboard import *
+
+width, height = 8,8
+m = Board(width,height)
+m.randomize(seed=13)
+m.plot()
+```
+
+এই কোডটি পরিবেশের একটি ছবি প্রিন্ট করবে যা উপরের ছবির মতো।
+
+## অ্যাকশন এবং পলিসি
+
+আমাদের উদাহরণে, পিটারের লক্ষ্য হবে আপেল খুঁজে পাওয়া, নেকড়ে এবং অন্যান্য বাধা এড়িয়ে। এটি করতে, সে মূলত হাঁটতে পারে যতক্ষণ না সে একটি আপেল খুঁজে পায়।
+
+তাই, যেকোনো অবস্থানে, সে নিম্নলিখিত অ্যাকশনগুলির মধ্যে একটি বেছে নিতে পারে: উপরে, নিচে, বামে এবং ডানে।
+
+আমরা এই অ্যাকশনগুলোকে একটি ডিকশনারি হিসেবে সংজ্ঞায়িত করব এবং সংশ্লিষ্ট কোঅর্ডিনেট পরিবর্তনের সাথে ম্যাপ করব। উদাহরণস্বরূপ, ডানে সরানো (`R`) একটি জোড়া `(1,0)` এর সাথে সম্পর্কিত হবে। (কোড ব্লক 2):
+
+```python
+actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
+action_idx = { a : i for i,a in enumerate(actions.keys()) }
+```
+
+এই পরিস্থিতির কৌশল এবং লক্ষ্য সংক্ষেপে নিম্নরূপ:
+
+- **কৌশল**, আমাদের এজেন্টের (পিটার) একটি **পলিসি** দ্বারা সংজ্ঞায়িত। একটি পলিসি হলো একটি ফাংশন যা যেকোনো প্রদত্ত স্টেটে অ্যাকশন প্রদান করে। আমাদের ক্ষেত্রে, সমস্যার স্টেট বোর্ড দ্বারা উপস্থাপিত, যার মধ্যে প্লেয়ারের বর্তমান অবস্থান অন্তর্ভুক্ত।
+
+- **লক্ষ্য**, রিইনফোর্সমেন্ট লার্নিং এর উদ্দেশ্য হলো একটি ভালো পলিসি শেখা যা আমাদের সমস্যাটি দক্ষতার সাথে সমাধান করতে সাহায্য করবে। তবে, একটি বেসলাইন হিসেবে, আসুন **র্যান্ডম ওয়াক** নামে একটি সহজ পলিসি বিবেচনা করি।
+
+## র্যান্ডম ওয়াক
+
+প্রথমে, আসুন র্যান্ডম ওয়াক কৌশলটি বাস্তবায়ন করি। র্যান্ডম ওয়াকের মাধ্যমে, আমরা অনুমোদিত অ্যাকশনগুলির মধ্যে থেকে এলোমেলোভাবে পরবর্তী অ্যাকশনটি বেছে নেব, যতক্ষণ না আমরা আপেল খুঁজে পাই (কোড ব্লক 3)।
+
+1. নিচের কোড দিয়ে র্যান্ডম ওয়াক বাস্তবায়ন করুন:
+
+ ```python
+ def random_policy(m):
+ return random.choice(list(actions))
+
+ def walk(m,policy,start_position=None):
+ n = 0 # number of steps
+ # set initial position
+ if start_position:
+ m.human = start_position
+ else:
+ m.random_start()
+ while True:
+ if m.at() == Board.Cell.apple:
+ return n # success!
+ if m.at() in [Board.Cell.wolf, Board.Cell.water]:
+ return -1 # eaten by wolf or drowned
+ while True:
+ a = actions[policy(m)]
+ new_pos = m.move_pos(m.human,a)
+ if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water:
+ m.move(a) # do the actual move
+ break
+ n+=1
+
+ walk(m,random_policy)
+ ```
+
+ `walk` ফাংশনের কলটি সংশ্লিষ্ট পথের দৈর্ঘ্য ফেরত দেবে, যা এক রান থেকে অন্য রানে পরিবর্তিত হতে পারে।
+
+1. ওয়াক পরীক্ষাটি একাধিকবার (ধরা যাক, 100 বার) চালান এবং ফলাফল পরিসংখ্যান প্রিন্ট করুন (কোড ব্লক 4):
+
+ ```python
+ def print_statistics(policy):
+ s,w,n = 0,0,0
+ for _ in range(100):
+ z = walk(m,policy)
+ if z<0:
+ w+=1
+ else:
+ s += z
+ n += 1
+ print(f"Average path length = {s/n}, eaten by wolf: {w} times")
+
+ print_statistics(random_policy)
+ ```
+
+ লক্ষ্য করুন যে একটি পথের গড় দৈর্ঘ্য প্রায় 30-40 ধাপ, যা বেশ দীর্ঘ, কারণ গড় দূরত্ব আপেলের কাছাকাছি প্রায় 5-6 ধাপ।
+
+ আপনি পিটারের র্যান্ডম ওয়াক চলাকালীন গতিবিধি দেখতে পারেন:
+
+ 
+
+## রিওয়ার্ড ফাংশন
+
+আমাদের পলিসিকে আরও বুদ্ধিমান করতে, আমাদের বুঝতে হবে কোন পদক্ষেপগুলো অন্যগুলোর চেয়ে "ভালো"। এটি করতে, আমাদের লক্ষ্য সংজ্ঞায়িত করতে হবে।
+
+লক্ষ্যটি একটি **রিওয়ার্ড ফাংশন** এর মাধ্যমে সংজ্ঞায়িত করা যেতে পারে, যা প্রতিটি স্টেটের জন্য একটি স্কোর মান প্রদান করবে। সংখ্যাটি যত বেশি হবে, রিওয়ার্ড ফাংশন তত ভালো। (কোড ব্লক 5)
+
+```python
+move_reward = -0.1
+goal_reward = 10
+end_reward = -10
+
+def reward(m,pos=None):
+ pos = pos or m.human
+ if not m.is_valid(pos):
+ return end_reward
+ x = m.at(pos)
+ if x==Board.Cell.water or x == Board.Cell.wolf:
+ return end_reward
+ if x==Board.Cell.apple:
+ return goal_reward
+ return move_reward
+```
+
+রিওয়ার্ড ফাংশনগুলোর একটি আকর্ষণীয় দিক হলো বেশিরভাগ ক্ষেত্রে, *আমরা শুধুমাত্র গেমের শেষে একটি উল্লেখযোগ্য রিওয়ার্ড পাই*। এর মানে হলো আমাদের অ্যালগরিদমকে "ভালো" পদক্ষেপগুলো মনে রাখতে হবে যা শেষের দিকে একটি ইতিবাচক রিওয়ার্ডে নিয়ে যায় এবং তাদের গুরুত্ব বাড়াতে হবে। একইভাবে, যেসব পদক্ষেপ খারাপ ফলাফলে নিয়ে যায় সেগুলো নিরুৎসাহিত করতে হবে।
+
+## কিউ-লার্নিং
+
+আমরা এখানে যে অ্যালগরিদমটি আলোচনা করব সেটি হলো **কিউ-লার্নিং**। এই অ্যালগরিদমে, পলিসি একটি ফাংশন (বা একটি ডেটা স্ট্রাকচার) দ্বারা সংজ্ঞায়িত, যাকে **কিউ-টেবিল** বলা হয়। এটি একটি প্রদত্ত স্টেটে প্রতিটি অ্যাকশনের "ভালত্ব" রেকর্ড করে।
+
+এটিকে কিউ-টেবিল বলা হয় কারণ এটি একটি টেবিল বা মাল্টি-ডাইমেনশনাল অ্যারে হিসেবে উপস্থাপন করা সুবিধাজনক। যেহেতু আমাদের বোর্ডের ডাইমেনশন `width` x `height`, আমরা কিউ-টেবিলকে একটি `width` x `height` x `len(actions)` আকৃতির নাম্পাই অ্যারে ব্যবহার করে উপস্থাপন করতে পারি: (কোড ব্লক 6)
+
+```python
+Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
+```
+
+লক্ষ্য করুন যে আমরা কিউ-টেবিলের সমস্ত মান সমান মান দিয়ে আরম্ভ করি, আমাদের ক্ষেত্রে - 0.25। এটি "র্যান্ডম ওয়াক" পলিসির সাথে সম্পর্কিত, কারণ প্রতিটি স্টেটে সমস্ত পদক্ষেপ সমানভাবে ভালো। আমরা কিউ-টেবিলকে বোর্ডে ভিজ্যুয়ালাইজ করতে `plot` ফাংশনে পাস করতে পারি: `m.plot(Q)`।
+
+
+
+প্রতিটি সেলের কেন্দ্রে একটি "তীর" রয়েছে যা চলাচলের পছন্দসই দিক নির্দেশ করে। যেহেতু সমস্ত দিক সমান, একটি বিন্দু প্রদর্শিত হয়।
+
+এখন আমাদের সিমুলেশন চালাতে হবে, আমাদের পরিবেশ অন্বেষণ করতে হবে এবং কিউ-টেবিল মানগুলোর একটি ভালো বন্টন শিখতে হবে, যা আমাদের আপেলের পথটি অনেক দ্রুত খুঁজে পেতে সাহায্য করবে।
+
+## কিউ-লার্নিং এর মূল বিষয়: বেলম্যান সমীকরণ
+
+একবার আমরা চলতে শুরু করলে, প্রতিটি অ্যাকশনের একটি সংশ্লিষ্ট রিওয়ার্ড থাকবে, অর্থাৎ আমরা তাত্ত্বিকভাবে সর্বোচ্চ তাৎক্ষণিক রিওয়ার্ডের উপর ভিত্তি করে পরবর্তী অ্যাকশনটি নির্বাচন করতে পারি। তবে, বেশিরভাগ স্টেটে, পদক্ষেপটি আমাদের আপেল খুঁজে পাওয়ার লক্ষ্য অর্জন করবে না, এবং তাই আমরা তাৎক্ষণিকভাবে সিদ্ধান্ত নিতে পারি না কোন দিকটি ভালো।
+
+> মনে রাখবেন যে তাৎক্ষণিক ফলাফলটি গুরুত্বপূর্ণ নয়, বরং চূড়ান্ত ফলাফলটি গুরুত্বপূর্ণ, যা আমরা সিমুলেশনের শেষে প্রাপ্ত হব।
+
+এই বিলম্বিত রিওয়ার্ডটি বিবেচনায় নিতে, আমাদের **[ডাইনামিক প্রোগ্রামিং](https://en.wikipedia.org/wiki/Dynamic_programming)** এর নীতিগুলি ব্যবহার করতে হবে, যা আমাদের সমস্যাটি পুনরাবৃত্তিমূলকভাবে চিন্তা করতে সাহায্য করে।
+
+ধরা যাক আমরা এখন স্টেট *s* এ আছি, এবং আমরা পরবর্তী স্টেট *s'* এ যেতে চাই। এটি করার মাধ্যমে, আমরা তাৎক্ষণিক রিওয়ার্ড *r(s,a)* পাব, যা রিওয়ার্ড ফাংশন দ্বারা সংজ্ঞায়িত, এবং এর সাথে কিছু ভবিষ্যৎ রিওয়ার্ড। যদি আমরা ধরে নিই যে আমাদের কিউ-টেবিল প্রতিটি অ্যাকশনের "আকর্ষণীয়তা" সঠিকভাবে প্রতিফলিত করে, তবে স্টেট *s'* এ আমরা এমন একটি অ্যাকশন *a'* বেছে নেব যা *Q(s',a')* এর সর্বাধিক মানের সাথে সম্পর্কিত। সুতরাং, স্টেট *s* এ আমরা যে সর্বোত্তম ভবিষ্যৎ রিওয়ার্ড পেতে পারি তা সংজ্ঞায়িত হবে `max` *Q(s',a')* দ্বারা (এখানে সর্বাধিক মানটি স্টেট *s'* এ সমস্ত সম্ভাব্য অ্যাকশন *a'* এর উপর গণনা করা হয়)।
+
+এটি আমাদের কিউ-টেবিলের মান গণনার জন্য **বেলম্যান ফর্মুলা** প্রদান করে।
+
+## নীতিমালা পরীক্ষা করা
+
+Q-Table-এ প্রতিটি অবস্থায় প্রতিটি কাজের "আকর্ষণীয়তা" তালিকাভুক্ত করা হয়েছে, তাই আমাদের জগতে কার্যকর নেভিগেশনের জন্য এটি ব্যবহার করা বেশ সহজ। সবচেয়ে সহজ ক্ষেত্রে, আমরা সেই কাজটি নির্বাচন করতে পারি যা Q-Table-এ সর্বোচ্চ মানের সাথে মিলে যায়: (কোড ব্লক ৯)
+
+```python
+def qpolicy_strict(m):
+ x,y = m.human
+ v = probs(Q[x,y])
+ a = list(actions)[np.argmax(v)]
+ return a
+
+walk(m,qpolicy_strict)
+```
+
+> উপরের কোডটি কয়েকবার চালানোর চেষ্টা করলে, আপনি লক্ষ্য করতে পারেন যে এটি কখনও কখনও "আটকে যায়", এবং আপনাকে নোটবুকে STOP বোতাম টিপে এটি বন্ধ করতে হয়। এটি ঘটে কারণ এমন পরিস্থিতি হতে পারে যেখানে দুটি অবস্থা একে অপরের দিকে "ইঙ্গিত" করে তাদের সর্বোত্তম Q-Value অনুযায়ী, যার ফলে এজেন্টটি অনির্দিষ্টভাবে ঐ অবস্থাগুলোর মধ্যে ঘুরতে থাকে।
+
+## 🚀চ্যালেঞ্জ
+
+> **কাজ ১:** `walk` ফাংশনটি পরিবর্তন করুন যাতে পথের সর্বোচ্চ দৈর্ঘ্য একটি নির্দিষ্ট ধাপের সংখ্যা (ধরা যাক, ১০০) দ্বারা সীমাবদ্ধ করা যায়, এবং উপরের কোডটি মাঝে মাঝে এই মানটি ফেরত দেয় কিনা তা দেখুন।
+
+> **কাজ ২:** `walk` ফাংশনটি এমনভাবে পরিবর্তন করুন যাতে এটি পূর্বে যেখানে গিয়েছিল সেখানে আর না যায়। এটি `walk`-কে লুপিং থেকে রোধ করবে, তবে এজেন্টটি এমন একটি স্থানে "ফাঁদে পড়তে" পারে যেখান থেকে এটি বের হতে অক্ষম।
+
+## নেভিগেশন
+
+একটি আরও ভালো নেভিগেশন নীতিমালা হবে সেই নীতিমালা যা আমরা প্রশিক্ষণের সময় ব্যবহার করেছি, যা শোষণ এবং অনুসন্ধানের সংমিশ্রণ। এই নীতিমালায়, আমরা Q-Table-এ মানগুলোর আনুপাতিকতার ভিত্তিতে প্রতিটি কাজ একটি নির্দিষ্ট সম্ভাবনায় নির্বাচন করব। এই কৌশলটি এখনও এজেন্টকে পূর্বে অন্বেষণ করা অবস্থানে ফিরে যেতে পারে, তবে, নিচের কোড থেকে আপনি দেখতে পাবেন, এটি কাঙ্ক্ষিত স্থানে পৌঁছানোর জন্য গড়পথকে খুবই সংক্ষিপ্ত করে (মনে রাখুন `print_statistics` সিমুলেশনটি ১০০ বার চালায়): (কোড ব্লক ১০)
+
+```python
+def qpolicy(m):
+ x,y = m.human
+ v = probs(Q[x,y])
+ a = random.choices(list(actions),weights=v)[0]
+ return a
+
+print_statistics(qpolicy)
+```
+
+এই কোডটি চালানোর পরে, আপনি আগের তুলনায় অনেক ছোট গড় পথ দৈর্ঘ্য পাবেন, যা ৩-৬ এর মধ্যে থাকবে।
+
+## শেখার প্রক্রিয়া পর্যবেক্ষণ
+
+আমরা আগেই উল্লেখ করেছি, শেখার প্রক্রিয়া হলো অনুসন্ধান এবং সমস্যার স্থান সম্পর্কে অর্জিত জ্ঞানের শোষণের মধ্যে একটি ভারসাম্য। আমরা দেখেছি যে শেখার ফলাফল (এজেন্টকে লক্ষ্যবস্তুতে পৌঁছানোর জন্য একটি সংক্ষিপ্ত পথ খুঁজে পেতে সাহায্য করার ক্ষমতা) উন্নত হয়েছে, তবে শেখার প্রক্রিয়ার সময় গড় পথ দৈর্ঘ্য কীভাবে আচরণ করে তা পর্যবেক্ষণ করাও আকর্ষণীয়:
+
+### শেখার সারাংশ:
+
+- **গড় পথ দৈর্ঘ্য বৃদ্ধি পায়**। প্রথমে, গড় পথ দৈর্ঘ্য বৃদ্ধি পায়। এর কারণ হতে পারে যে পরিবেশ সম্পর্কে কিছু না জানার কারণে আমরা খারাপ অবস্থায়, যেমন জল বা নেকড়ের ফাঁদে পড়ে যাই। আমরা যত বেশি শিখি এবং এই জ্ঞান ব্যবহার করতে শুরু করি, তত বেশি সময় ধরে পরিবেশ অন্বেষণ করতে পারি, তবে এখনও আপেল কোথায় আছে তা খুব ভালোভাবে জানি না।
+
+- **পথের দৈর্ঘ্য কমে, যত বেশি শিখি**। একবার আমরা যথেষ্ট শিখে গেলে, এজেন্টের জন্য লক্ষ্য অর্জন করা সহজ হয়ে যায়, এবং পথের দৈর্ঘ্য কমতে শুরু করে। তবে, আমরা এখনও অনুসন্ধানের জন্য উন্মুক্ত থাকি, তাই আমরা প্রায়ই সেরা পথ থেকে সরে যাই এবং নতুন বিকল্প অন্বেষণ করি, যা পথকে আদর্শের চেয়ে দীর্ঘ করে তোলে।
+
+- **দৈর্ঘ্য হঠাৎ বৃদ্ধি পায়**। আমরা এই গ্রাফে যা লক্ষ্য করি তা হলো, কোনো এক সময়ে দৈর্ঘ্য হঠাৎ বৃদ্ধি পায়। এটি প্রক্রিয়ার স্টোকাস্টিক প্রকৃতিকে নির্দেশ করে, এবং যে কোনো সময় আমরা Q-Table এর গুণফলগুলো নতুন মান দিয়ে ওভাররাইট করতে পারি। এটি আদর্শভাবে শেখার হার কমিয়ে (যেমন, প্রশিক্ষণের শেষের দিকে, আমরা Q-Table এর মানগুলো খুব ছোট মান দিয়ে সামঞ্জস্য করি) কমিয়ে আনা উচিত।
+
+সামগ্রিকভাবে, মনে রাখা গুরুত্বপূর্ণ যে শেখার প্রক্রিয়ার সাফল্য এবং গুণমান উল্লেখযোগ্যভাবে নির্ভর করে বিভিন্ন প্যারামিটারের উপর, যেমন শেখার হার, শেখার হারের ক্ষয়, এবং ডিসকাউন্ট ফ্যাক্টর। এগুলোকে প্রায়ই **হাইপারপ্যারামিটার** বলা হয়, যাতে **প্যারামিটার** থেকে আলাদা করা যায়, যা আমরা প্রশিক্ষণের সময় অপ্টিমাইজ করি (যেমন, Q-Table এর গুণফল)। সেরা হাইপারপ্যারামিটার মান খুঁজে বের করার প্রক্রিয়াকে **হাইপারপ্যারামিটার অপ্টিমাইজেশন** বলা হয়, এবং এটি একটি আলাদা আলোচনার বিষয়।
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/46/)
+
+## অ্যাসাইনমেন্ট
+[একটি আরও বাস্তবসম্মত জগৎ](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/1-QLearning/assignment.md b/translations/bn/8-Reinforcement/1-QLearning/assignment.md
new file mode 100644
index 000000000..0a88d88e4
--- /dev/null
+++ b/translations/bn/8-Reinforcement/1-QLearning/assignment.md
@@ -0,0 +1,41 @@
+
+# একটি আরও বাস্তবসম্মত বিশ্ব
+
+আমাদের পরিস্থিতিতে, পিটার প্রায় ক্লান্ত বা ক্ষুধার্ত না হয়ে চলাফেরা করতে পারছিল। একটি আরও বাস্তবসম্মত বিশ্বে, তাকে মাঝে মাঝে বসে বিশ্রাম নিতে হবে এবং নিজেকে খাওয়াতে হবে। চলুন আমাদের বিশ্বকে আরও বাস্তবসম্মত করি, নিম্নলিখিত নিয়মগুলি প্রয়োগ করে:
+
+1. এক জায়গা থেকে অন্য জায়গায় যাওয়ার সময়, পিটার **শক্তি** হারাবে এবং কিছু **ক্লান্তি** অর্জন করবে।
+2. পিটার আপেল খেয়ে আরও শক্তি অর্জন করতে পারে।
+3. পিটার গাছের নিচে বা ঘাসের উপর বিশ্রাম নিয়ে ক্লান্তি দূর করতে পারে (অর্থাৎ, গাছ বা ঘাস থাকা বোর্ডের অবস্থানে হাঁটা - সবুজ ক্ষেত্র)।
+4. পিটারকে নেকড়েকে খুঁজে বের করে হত্যা করতে হবে।
+5. নেকড়েকে হত্যা করার জন্য, পিটারের নির্দিষ্ট মাত্রার শক্তি এবং ক্লান্তি থাকতে হবে, অন্যথায় সে যুদ্ধে হেরে যাবে।
+
+## নির্দেশনা
+
+মূল [notebook.ipynb](notebook.ipynb) নোটবুকটি আপনার সমাধানের জন্য একটি সূচনা পয়েন্ট হিসেবে ব্যবহার করুন।
+
+উপরের পুরস্কার ফাংশনটি গেমের নিয়ম অনুযায়ী সংশোধন করুন, রিইনফোর্সমেন্ট লার্নিং অ্যালগরিদম চালান যাতে গেম জেতার সেরা কৌশল শেখা যায়, এবং র্যান্ডম হাঁটার ফলাফলগুলির সাথে আপনার অ্যালগরিদমের ফলাফল তুলনা করুন জেতা এবং হারার সংখ্যার ভিত্তিতে।
+
+> **Note**: আপনার নতুন বিশ্বে, অবস্থাটি আরও জটিল, এবং মানব অবস্থানের পাশাপাশি ক্লান্তি এবং শক্তির মাত্রাগুলিও অন্তর্ভুক্ত করে। আপনি অবস্থাটি একটি টুপল (Board,energy,fatigue) হিসেবে উপস্থাপন করতে পারেন, অথবা অবস্থার জন্য একটি ক্লাস সংজ্ঞায়িত করতে পারেন (আপনি এটি `Board` থেকে ডেরাইভ করতে পারেন), অথবা এমনকি মূল `Board` ক্লাসটি [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py)-এর ভিতরে সংশোধন করতে পারেন।
+
+আপনার সমাধানে, র্যান্ডম হাঁটার কৌশলের জন্য দায়ী কোডটি রাখুন এবং শেষে আপনার অ্যালগরিদমের ফলাফল র্যান্ডম হাঁটার সাথে তুলনা করুন।
+
+> **Note**: এটি কাজ করার জন্য আপনাকে হাইপারপ্যারামিটারগুলি সামঞ্জস্য করতে হতে পারে, বিশেষত epochs-এর সংখ্যা। কারণ গেমের সাফল্য (নেকড়ের সাথে যুদ্ধ) একটি বিরল ঘটনা, আপনি অনেক দীর্ঘ প্রশিক্ষণের সময় আশা করতে পারেন।
+
+## মূল্যায়ন
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
+| | একটি নোটবুক উপস্থাপন করা হয়েছে যেখানে নতুন বিশ্ব নিয়মের সংজ্ঞা, Q-Learning অ্যালগরিদম এবং কিছু পাঠ্য ব্যাখ্যা রয়েছে। Q-Learning র্যান্ডম হাঁটার তুলনায় উল্লেখযোগ্যভাবে ফলাফল উন্নত করতে সক্ষম। | একটি নোটবুক উপস্থাপন করা হয়েছে, Q-Learning বাস্তবায়িত হয়েছে এবং র্যান্ডম হাঁটার তুলনায় ফলাফল উন্নত করেছে, তবে উল্লেখযোগ্যভাবে নয়; অথবা নোটবুকটি খারাপভাবে ডকুমেন্টেড এবং কোডটি ভালভাবে গঠন করা হয়নি। | বিশ্বের নিয়মগুলি পুনঃসংজ্ঞায়িত করার কিছু প্রচেষ্টা করা হয়েছে, তবে Q-Learning অ্যালগরিদম কাজ করে না, অথবা পুরস্কার ফাংশনটি সম্পূর্ণভাবে সংজ্ঞায়িত করা হয়নি। |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/1-QLearning/notebook.ipynb b/translations/bn/8-Reinforcement/1-QLearning/notebook.ipynb
new file mode 100644
index 000000000..2806e6e15
--- /dev/null
+++ b/translations/bn/8-Reinforcement/1-QLearning/notebook.ipynb
@@ -0,0 +1,411 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "coopTranslator": {
+ "original_hash": "17e5a668646eabf5aabd0e9bfcf17876",
+ "translation_date": "2025-08-30T00:01:22+00:00",
+ "source_file": "8-Reinforcement/1-QLearning/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [
+ "# পিটার এবং নেকড়ে: রিইনফোর্সমেন্ট লার্নিং প্রাইমার\n",
+ "\n",
+ "এই টিউটোরিয়ালে, আমরা পথ খোঁজার সমস্যায় রিইনফোর্সমেন্ট লার্নিং প্রয়োগ করা শিখব। এই সেটিংটি রাশিয়ান সুরকার [সের্গেই প্রোকোফিয়েভ](https://en.wikipedia.org/wiki/Sergei_Prokofiev) এর [পিটার এবং নেকড়ে](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) নামক সঙ্গীতধর্মী রূপকথা দ্বারা অনুপ্রাণিত। এটি তরুণ পথিক পিটারের গল্প, যে সাহসিকতার সাথে তার বাড়ি থেকে বেরিয়ে বনভূমির দিকে যায় নেকড়েকে তাড়ানোর জন্য। আমরা এমন মেশিন লার্নিং অ্যালগরিদম প্রশিক্ষণ দেব যা পিটারকে আশেপাশের এলাকা অন্বেষণ করতে এবং একটি সর্বোত্তম নেভিগেশন মানচিত্র তৈরি করতে সাহায্য করবে।\n",
+ "\n",
+ "প্রথমে, চলুন কিছু দরকারী লাইব্রেরি ইমপোর্ট করি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import random\n",
+ "import math"
+ ]
+ },
+ {
+ "source": [
+ "## রিইনফোর্সমেন্ট লার্নিং-এর সংক্ষিপ্ত বিবরণ\n",
+ "\n",
+ "**রিইনফোর্সমেন্ট লার্নিং** (RL) একটি শেখার পদ্ধতি যা আমাদেরকে একটি **এজেন্ট**-এর **পরিবেশ**-এ **অনুকূল আচরণ** শেখার সুযোগ দেয়, অনেকগুলো পরীক্ষা চালানোর মাধ্যমে। এই পরিবেশে একটি এজেন্টের অবশ্যই একটি **লক্ষ্য** থাকতে হবে, যা একটি **রিওয়ার্ড ফাংশন** দ্বারা সংজ্ঞায়িত।\n",
+ "\n",
+ "## পরিবেশ\n",
+ "\n",
+ "সহজতার জন্য, চলুন পিটারের জগৎকে `width` x `height` আকারের একটি বর্গাকার বোর্ড হিসেবে কল্পনা করি। এই বোর্ডের প্রতিটি সেল হতে পারে:\n",
+ "* **মাটি**, যেখানে পিটার এবং অন্যান্য প্রাণীরা হাঁটতে পারে\n",
+ "* **পানি**, যেখানে আপনি স্পষ্টতই হাঁটতে পারবেন না\n",
+ "* **গাছ** বা **ঘাস** - এমন একটি জায়গা যেখানে আপনি বিশ্রাম নিতে পারেন\n",
+ "* **আপেল**, যা এমন কিছু যা পিটার খুঁজে পেলে খুশি হবে এবং নিজেকে খাওয়াতে পারবে\n",
+ "* **নেকড়ে**, যা বিপজ্জনক এবং এড়িয়ে চলা উচিত\n",
+ "\n",
+ "পরিবেশের সাথে কাজ করার জন্য, আমরা `Board` নামে একটি ক্লাস সংজ্ঞায়িত করব। এই নোটবুকটি খুব বেশি জটিল না করার জন্য, বোর্ডের সাথে কাজ করার সমস্ত কোড আমরা একটি আলাদা `rlboard` মডিউলে সরিয়ে নিয়েছি, যা আমরা এখন ইমপোর্ট করব। আপনি এই মডিউলের ভিতরে তাকিয়ে বাস্তবায়নের অভ্যন্তরীণ বিষয়গুলো সম্পর্কে আরও বিশদ জানতে পারেন।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "এখন চলুন একটি র্যান্ডম বোর্ড তৈরি করি এবং দেখি এটি কেমন দেখায়:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# code block 1"
+ ]
+ },
+ {
+ "source": [
+ "## কার্যকলাপ এবং নীতি\n",
+ "\n",
+ "আমাদের উদাহরণে, পিটারের লক্ষ্য হবে একটি আপেল খুঁজে বের করা, একই সাথে নেকড়ে এবং অন্যান্য বাধাগুলো এড়ানো। এই কার্যকলাপগুলো একটি ডিকশনারি হিসেবে সংজ্ঞায়িত করুন এবং সেগুলোকে সংশ্লিষ্ট কোঅর্ডিনেট পরিবর্তনের জোড়ার সাথে মানচিত্র করুন।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# code block 2"
+ ]
+ },
+ {
+ "source": [
+ "আমাদের এজেন্ট (পিটার)-এর কৌশল একটি তথাকথিত **নীতি** দ্বারা সংজ্ঞায়িত হয়। চলুন সবচেয়ে সহজ নীতি, **র্যান্ডম ওয়াক** নিয়ে আলোচনা করি।\n",
+ "\n",
+ "## র্যান্ডম ওয়াক\n",
+ "\n",
+ "প্রথমে চলুন একটি র্যান্ডম ওয়াক কৌশল বাস্তবায়ন করে আমাদের সমস্যার সমাধান করি।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "# Let's run a random walk experiment several times and see the average number of steps taken: code block 3"
+ ],
+ "cell_type": "code",
+ "metadata": {},
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# code block 4"
+ ]
+ },
+ {
+ "source": [
+ "## পুরস্কার ফাংশন\n",
+ "\n",
+ "আমাদের নীতিকে আরও বুদ্ধিমান করতে, আমাদের বুঝতে হবে কোন পদক্ষেপগুলো অন্যগুলোর তুলনায় \"ভালো\"।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#code block 5"
+ ]
+ },
+ {
+ "source": [
+ "## কিউ-লার্নিং\n",
+ "\n",
+ "একটি কিউ-টেবিল বা বহু-মাত্রিক অ্যারে তৈরি করুন। যেহেতু আমাদের বোর্ডের মাত্রা `width` x `height`, আমরা কিউ-টেবিলকে একটি numpy অ্যারে দিয়ে উপস্থাপন করতে পারি যার আকার হবে `width` x `height` x `len(actions)`।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# code block 6"
+ ]
+ },
+ {
+ "source": [
+ "বোর্ডে টেবিলটি ভিজুয়ালাইজ করার জন্য Q-টেবিলটি `plot` ফাংশনে পাস করুন:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "error",
+ "ename": "NameError",
+ "evalue": "name 'm' is not defined",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mQ\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m: name 'm' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "m.plot(Q)"
+ ]
+ },
+ {
+ "source": [
+ "## কিউ-লার্নিং এর মূলভাব: বেলম্যান সমীকরণ এবং শেখার অ্যালগরিদম\n",
+ "\n",
+ "আমাদের শেখার অ্যালগরিদমের জন্য একটি ছদ্ম-কোড লিখুন:\n",
+ "\n",
+ "* সমস্ত অবস্থান এবং ক্রিয়ার জন্য সমান সংখ্যায় Q-টেবিল Q আরম্ভ করুন\n",
+ "* শেখার হার নির্ধারণ করুন $\\alpha\\leftarrow 1$\n",
+ "* সিমুলেশন বহুবার পুনরাবৃত্তি করুন\n",
+ " 1. এলোমেলো অবস্থান থেকে শুরু করুন\n",
+ " 1. পুনরাবৃত্তি করুন\n",
+ " 1. অবস্থান $s$-এ একটি ক্রিয়া $a$ নির্বাচন করুন\n",
+ " 2. ক্রিয়া সম্পাদন করে নতুন অবস্থান $s'$-এ যান\n",
+ " 3. যদি আমরা খেলার শেষ অবস্থার সম্মুখীন হই, অথবা মোট পুরস্কার খুব কম হয় - সিমুলেশন থেকে বেরিয়ে আসুন \n",
+ " 4. নতুন অবস্থানে পুরস্কার $r$ গণনা করুন\n",
+ " 5. বেলম্যান সমীকরণ অনুযায়ী Q-ফাংশন আপডেট করুন: $Q(s,a)\\leftarrow (1-\\alpha)Q(s,a)+\\alpha(r+\\gamma\\max_{a'}Q(s',a'))$\n",
+ " 6. $s\\leftarrow s'$\n",
+ " 7. মোট পুরস্কার আপডেট করুন এবং $\\alpha$ হ্রাস করুন।\n",
+ "\n",
+ "## শোষণ বনাম অনুসন্ধান\n",
+ "\n",
+ "শ্রেষ্ঠ পদ্ধতি হলো অনুসন্ধান এবং শোষণের মধ্যে ভারসাম্য বজায় রাখা। আমরা যখন আমাদের পরিবেশ সম্পর্কে আরও শিখি, তখন আমরা সর্বোত্তম পথ অনুসরণ করার সম্ভাবনা বেশি রাখব, তবে মাঝে মাঝে অনাবিষ্কৃত পথ বেছে নেওয়াও গুরুত্বপূর্ণ।\n",
+ "\n",
+ "## পাইথন বাস্তবায়ন\n",
+ "\n",
+ "এখন আমরা শেখার অ্যালগরিদম বাস্তবায়ন করতে প্রস্তুত। তার আগে, আমাদের এমন একটি ফাংশন প্রয়োজন যা Q-টেবিলের এলোমেলো সংখ্যাগুলিকে সংশ্লিষ্ট ক্রিয়াগুলির জন্য সম্ভাবনার ভেক্টরে রূপান্তর করবে:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# code block 7"
+ ]
+ },
+ {
+ "source": [
+ "আমরা মূল ভেক্টরে একটি ছোট পরিমাণ `eps` যোগ করি যাতে প্রাথমিক ক্ষেত্রে, যখন ভেক্টরের সমস্ত উপাদান অভিন্ন হয়, তখন 0 দিয়ে ভাগ করার সমস্যা এড়ানো যায়।\n",
+ "\n",
+ "আমরা যে প্রকৃত শিক্ষণ অ্যালগরিদমটি চালাব তা ৫০০০টি পরীক্ষার জন্য, যাকে **epochs** ও বলা হয়:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ ""
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "from IPython.display import clear_output\n",
+ "\n",
+ "lpath = []\n",
+ "\n",
+ "# code block 8"
+ ]
+ },
+ {
+ "source": [
+ "এই অ্যালগরিদমটি কার্যকর করার পরে, Q-টেবিলটি এমন মানগুলির সাথে আপডেট হওয়া উচিত যা প্রতিটি ধাপে বিভিন্ন ক্রিয়ার আকর্ষণীয়তা সংজ্ঞায়িত করে। এখানে টেবিলটি চিত্রিত করুন:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\r\n\r\n\r\n\r\n",
+ "image/png": "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Tz9N/fr1mTRpEuecc47RkY4gpWTOnDmcd9553HHHHSxdupS8vLyIt6sKt6KcBCkl2dnZfPjhh8yaNYusrKyoK47BYJD9+/fz6KOPsnz5cnJzc42OdMqZPn069957L02bNmXKlCm8+eabjB8/Hl3XI9quKtyKcpK6dOlCVlYWVquVTp064ff7jY50hOzsbLp160b37t1ZuHAhV1111fG/SflbxowZw4wZM/jss8/YtGkTt956K5MnT474jShU4VaUkzBr1iwef/xxLr74Ylq3bs20adOYMWOG0bHKSSmZPXs2s2fPxuVyMWbMGAYNGsT8+fONjnbKGTVqFEVFRbjdbq699loyMjIi3qYq3LXEU089Rc+ePfH5fDXmRrCBQIDvvvuO9957j0AgEFVDEb1792bRokU0atSIzz//nOnTp9O7d2+jYx3h4osv5scff+Scc87h3nvvZcWKFVG9e2RNdcMNNzB48GDatWvH6NGjq2XjKlW4a4nx48fz2Wef0aNHD5544gl+/fVXgsGg0bEqJKWkZcuWfPfdd2RlZdGgQYOoGopo2bIlubm5TJw4EQCfz8fTTz/N/v37DU4WIoSgbdu2LFq0iIULF6LrOpmZmcyaNYuioiKj4ymVpAp3LVG2peovv/xC9+7dee2113j11Vf55ptvjI52VF9++SW33nord911Fw6HgyFDhvDpp58aHaucEIIff/yR22+/nauvvpoNGzYwbdo0XnvtNXbs2GF0PADq16/PunXrqF+/Pq+88grr16/niiuuYObMmZSWlhodT6kEVbhrocsuu4xXXnmFRo0a8ccffzBo0CB27txpdKwjxMfH43Q6sdlspKSk4HQ6mTp1qtGx/uLss8+mZ8+eADRu3JjBgwczc+ZM8vPzjQ12mAEDBtC4cehWsD179uTCCy/koYceiqqhJ+XvUQtwaikhBNdffz0ul4vrr7+ecePGsWPHDq655hruu+8+EhIS/nLT3urUo0cP7rzzTnRdp27duvznP//hnXfeoWPHjkyYMIHevXuTmJgYdYsxWrduzfjx4xk4cCDNmjXj5ZdfJjY21uhYR+jevTupqal06tSJ2267jREjRmCxqFJQGdX9c6h63LWcw+GgWbNmfPzxx6xfv55zzz2X/v37s3DhQtatW2dYLiEEW7dupX///rRt25asrCx69+7N+vXr2bJlCzff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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "m.plot(Q)"
+ ]
+ },
+ {
+ "source": [
+ "## নীতিটি পরীক্ষা করা\n",
+ "\n",
+ "যেহেতু Q-Table প্রতিটি অবস্থায় প্রতিটি ক্রিয়ার \"আকর্ষণীয়তা\" তালিকাভুক্ত করে, এটি আমাদের জগতে কার্যকর নেভিগেশন সংজ্ঞায়িত করতে ব্যবহার করা বেশ সহজ। সবচেয়ে সহজ ক্ষেত্রে, আমরা কেবল Q-Table এর সর্বোচ্চ মানের সাথে সম্পর্কিত ক্রিয়াটি নির্বাচন করতে পারি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "2"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 13
+ }
+ ],
+ "source": [
+ "# code block 9"
+ ]
+ },
+ {
+ "source": [
+ "যদি আপনি উপরের কোডটি কয়েকবার চেষ্টা করেন, আপনি লক্ষ্য করতে পারেন যে কখনও কখনও এটি কেবল \"আটকে যায়\", এবং আপনাকে নোটবুকের STOP বোতামটি চাপ দিয়ে এটি বন্ধ করতে হয়।\n",
+ "\n",
+ "> **কাজ ১:** `walk` ফাংশনটি সংশোধন করুন যাতে এটি পথের সর্বাধিক দৈর্ঘ্য একটি নির্দিষ্ট সংখ্যক ধাপে (ধরা যাক, ১০০) সীমাবদ্ধ করে, এবং উপরের কোডটি মাঝে মাঝে এই মানটি ফেরত দেয় কিনা তা পর্যবেক্ষণ করুন।\n",
+ "\n",
+ "> **কাজ ২:** `walk` ফাংশনটি সংশোধন করুন যাতে এটি পূর্বে যেসব স্থানে ইতিমধ্যে গিয়েছে সেখানে আবার না যায়। এটি `walk`-কে লুপিং থেকে রোধ করবে, তবে এজেন্ট এখনও এমন একটি স্থানে \"ফেঁসে\" যেতে পারে যেখান থেকে এটি বের হতে অক্ষম।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Average path length = 5.31, eaten by wolf: 0 times\n"
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "# code block 10"
+ ]
+ },
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 57
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\r\n\r\n\r\n\r\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "plt.plot(lpath)"
+ ]
+ },
+ {
+ "source": [
+ "## অনুশীলন\n",
+ "## একটি আরও বাস্তবসম্মত পিটার এবং নেকড়ে বিশ্ব\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/1-QLearning/solution/Julia/README.md b/translations/bn/8-Reinforcement/1-QLearning/solution/Julia/README.md
new file mode 100644
index 000000000..71fe4f210
--- /dev/null
+++ b/translations/bn/8-Reinforcement/1-QLearning/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/1-QLearning/solution/R/README.md b/translations/bn/8-Reinforcement/1-QLearning/solution/R/README.md
new file mode 100644
index 000000000..21a41aec2
--- /dev/null
+++ b/translations/bn/8-Reinforcement/1-QLearning/solution/R/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/1-QLearning/solution/assignment-solution.ipynb b/translations/bn/8-Reinforcement/1-QLearning/solution/assignment-solution.ipynb
new file mode 100644
index 000000000..7b4d57ef6
--- /dev/null
+++ b/translations/bn/8-Reinforcement/1-QLearning/solution/assignment-solution.ipynb
@@ -0,0 +1,454 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "coopTranslator": {
+ "original_hash": "eadbd20d2a075efb602615ad90b1e97a",
+ "translation_date": "2025-08-30T00:08:54+00:00",
+ "source_file": "8-Reinforcement/1-QLearning/solution/assignment-solution.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [
+ "# পিটার এবং নেকড়ে: বাস্তবসম্মত পরিবেশ\n",
+ "\n",
+ "আমাদের পরিস্থিতিতে, পিটার প্রায় ক্লান্ত বা ক্ষুধার্ত না হয়েই চলাফেরা করতে পারত। কিন্তু একটি আরও বাস্তবসম্মত জগতে, তাকে মাঝে মাঝে বসে বিশ্রাম নিতে হবে এবং নিজেকে খাওয়াতে হবে। চলুন আমাদের জগৎটিকে আরও বাস্তবসম্মত করি, নিম্নলিখিত নিয়মগুলো প্রয়োগ করে:\n",
+ "\n",
+ "1. এক জায়গা থেকে আরেক জায়গায় যাওয়ার সময়, পিটার **শক্তি** হারাবে এবং কিছু **ক্লান্তি** অর্জন করবে।\n",
+ "2. পিটার আপেল খেয়ে আরও শক্তি পেতে পারে।\n",
+ "3. পিটার গাছের নিচে বা ঘাসের উপর বিশ্রাম নিয়ে ক্লান্তি দূর করতে পারে (অর্থাৎ, এমন একটি বোর্ড লোকেশনে হাঁটা যেখানে গাছ বা ঘাস আছে - সবুজ ক্ষেত্র)।\n",
+ "4. পিটারকে নেকড়েকে খুঁজে বের করে হত্যা করতে হবে।\n",
+ "5. নেকড়েকে হত্যা করার জন্য, পিটারের নির্দিষ্ট মাত্রার শক্তি এবং ক্লান্তি থাকা প্রয়োজন, অন্যথায় সে যুদ্ধে হেরে যাবে।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import random\n",
+ "import math\n",
+ "from rlboard import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\n\n\n\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "width, height = 8,8\n",
+ "m = Board(width,height)\n",
+ "m.randomize(seed=13)\n",
+ "m.plot()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "actions = { \"U\" : (0,-1), \"D\" : (0,1), \"L\" : (-1,0), \"R\" : (1,0) }\n",
+ "action_idx = { a : i for i,a in enumerate(actions.keys()) }"
+ ]
+ },
+ {
+ "source": [
+ "## স্টেট সংজ্ঞায়িত করা\n",
+ "\n",
+ "আমাদের নতুন গেমের নিয়মে, প্রতিটি বোর্ড স্টেটে শক্তি এবং ক্লান্তি ট্র্যাক করতে হবে। তাই আমরা একটি অবজেক্ট `state` তৈরি করব যা বর্তমান সমস্যার স্টেট সম্পর্কিত সমস্ত প্রয়োজনীয় তথ্য বহন করবে, যার মধ্যে বোর্ডের অবস্থা, শক্তি এবং ক্লান্তির বর্তমান স্তর, এবং টার্মিনাল স্টেটে থাকা অবস্থায় আমরা নেকড়েকে হারাতে পারি কিনা তা অন্তর্ভুক্ত থাকবে:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class state:\n",
+ " def __init__(self,board,energy=10,fatigue=0,init=True):\n",
+ " self.board = board\n",
+ " self.energy = energy\n",
+ " self.fatigue = fatigue\n",
+ " self.dead = False\n",
+ " if init:\n",
+ " self.board.random_start()\n",
+ " self.update()\n",
+ "\n",
+ " def at(self):\n",
+ " return self.board.at()\n",
+ "\n",
+ " def update(self):\n",
+ " if self.at() == Board.Cell.water:\n",
+ " self.dead = True\n",
+ " return\n",
+ " if self.at() == Board.Cell.tree:\n",
+ " self.fatigue = 0\n",
+ " if self.at() == Board.Cell.apple:\n",
+ " self.energy = 10\n",
+ "\n",
+ " def move(self,a):\n",
+ " self.board.move(a)\n",
+ " self.energy -= 1\n",
+ " self.fatigue += 1\n",
+ " self.update()\n",
+ "\n",
+ " def is_winning(self):\n",
+ " return self.energy > self.fatigue"
+ ]
+ },
+ {
+ "source": [
+ "চলুন র্যান্ডম ওয়াক ব্যবহার করে সমস্যাটি সমাধানের চেষ্টা করি এবং দেখি আমরা সফল হই কিনা:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 5
+ }
+ ],
+ "source": [
+ "def random_policy(state):\n",
+ " return random.choice(list(actions))\n",
+ "\n",
+ "def walk(board,policy):\n",
+ " n = 0 # number of steps\n",
+ " s = state(board)\n",
+ " while True:\n",
+ " if s.at() == Board.Cell.wolf:\n",
+ " if s.is_winning():\n",
+ " return n # success!\n",
+ " else:\n",
+ " return -n # failure!\n",
+ " if s.at() == Board.Cell.water:\n",
+ " return 0 # died\n",
+ " a = actions[policy(m)]\n",
+ " s.move(a)\n",
+ " n+=1\n",
+ "\n",
+ "walk(m,random_policy)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Killed by wolf = 5, won: 1 times, drown: 94 times\n"
+ ]
+ }
+ ],
+ "source": [
+ "def print_statistics(policy):\n",
+ " s,w,n = 0,0,0\n",
+ " for _ in range(100):\n",
+ " z = walk(m,policy)\n",
+ " if z<0:\n",
+ " w+=1\n",
+ " elif z==0:\n",
+ " n+=1\n",
+ " else:\n",
+ " s+=1\n",
+ " print(f\"Killed by wolf = {w}, won: {s} times, drown: {n} times\")\n",
+ "\n",
+ "print_statistics(random_policy)"
+ ]
+ },
+ {
+ "source": [
+ "## পুরস্কার ফাংশন\n",
+ "\n",
+ "একটি পুরস্কার ফাংশন হল একটি পদ্ধতি যা এজেন্টের কর্মের জন্য একটি মান নির্ধারণ করে। এটি এজেন্টকে তার লক্ষ্য অর্জনের জন্য সঠিক সিদ্ধান্ত নিতে উৎসাহিত করে।\n",
+ "\n",
+ "### কীভাবে এটি কাজ করে\n",
+ "\n",
+ "পুরস্কার ফাংশন এজেন্টের পরিবেশ থেকে ইনপুট গ্রহণ করে এবং একটি সংখ্যা প্রদান করে যা এজেন্টের কর্মের গুণমান নির্দেশ করে। এই সংখ্যা এজেন্টের শেখার প্রক্রিয়ায় গুরুত্বপূর্ণ ভূমিকা পালন করে।\n",
+ "\n",
+ "### উদাহরণ\n",
+ "\n",
+ "নিম্নলিখিত উদাহরণটি একটি সাধারণ পুরস্কার ফাংশন দেখায়:\n",
+ "\n",
+ "```python\n",
+ "def reward_function(state, action):\n",
+ " if action == \"move_forward\" and state == \"clear_path\":\n",
+ " return 10 # উচ্চ পুরস্কার\n",
+ " elif action == \"move_forward\" and state == \"obstacle_ahead\":\n",
+ " return -10 # শাস্তি\n",
+ " else:\n",
+ " return 0 # নিরপেক্ষ\n",
+ "```\n",
+ "\n",
+ "### গুরুত্বপূর্ণ বিষয়\n",
+ "\n",
+ "- [!NOTE] পুরস্কার ফাংশনটি এজেন্টের লক্ষ্য এবং পরিবেশের সাথে সামঞ্জস্যপূর্ণ হতে হবে।\n",
+ "- [!WARNING] ভুলভাবে ডিজাইন করা পুরস্কার ফাংশন এজেন্টকে অপ্রত্যাশিত আচরণ শেখাতে পারে।\n",
+ "- [!TIP] পুরস্কার ফাংশনটি সহজ এবং কার্যকর রাখার চেষ্টা করুন।\n",
+ "- [!IMPORTANT] পুরস্কার ফাংশনটি এজেন্টের শেখার গতি এবং দক্ষতার উপর সরাসরি প্রভাব ফেলে।\n",
+ "- [!CAUTION] পুরস্কার ফাংশনটি পরীক্ষা এবং পরিমার্জন করা প্রয়োজন যাতে এটি সঠিকভাবে কাজ করে।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def reward(s):\n",
+ " r = s.energy-s.fatigue\n",
+ " if s.at()==Board.Cell.wolf:\n",
+ " return 100 if s.is_winning() else -100\n",
+ " if s.at()==Board.Cell.water:\n",
+ " return -100\n",
+ " return r"
+ ]
+ },
+ {
+ "source": [
+ "## কিউ-লার্নিং অ্যালগরিদম\n",
+ "\n",
+ "আসল শেখার অ্যালগরিদম প্রায় অপরিবর্তিত থাকে, আমরা শুধু বোর্ড অবস্থানের পরিবর্তে `state` ব্যবহার করি।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def probs(v,eps=1e-4):\n",
+ " v = v-v.min()+eps\n",
+ " v = v/v.sum()\n",
+ " return v"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ ""
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "from IPython.display import clear_output\n",
+ "\n",
+ "lpath = []\n",
+ "\n",
+ "for epoch in range(10000):\n",
+ " clear_output(wait=True)\n",
+ " print(f\"Epoch = {epoch}\",end='')\n",
+ "\n",
+ " # Pick initial point\n",
+ " s = state(m)\n",
+ " \n",
+ " # Start travelling\n",
+ " n=0\n",
+ " cum_reward = 0\n",
+ " while True:\n",
+ " x,y = s.board.human\n",
+ " v = probs(Q[x,y])\n",
+ " while True:\n",
+ " a = random.choices(list(actions),weights=v)[0]\n",
+ " dpos = actions[a]\n",
+ " if s.board.is_valid(s.board.move_pos(s.board.human,dpos)):\n",
+ " break \n",
+ " s.move(dpos)\n",
+ " r = reward(s)\n",
+ " if abs(r)==100: # end of game\n",
+ " print(f\" {n} steps\",end='\\r')\n",
+ " lpath.append(n)\n",
+ " break\n",
+ " alpha = np.exp(-n / 3000)\n",
+ " gamma = 0.5\n",
+ " ai = action_idx[a]\n",
+ " Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max())\n",
+ " n+=1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\n\n\n\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "m.plot(Q)"
+ ]
+ },
+ {
+ "source": [
+ "## ফলাফল\n",
+ "\n",
+ "চলুন দেখি আমরা পিটারকে নেকড়ের সাথে লড়াই করার জন্য প্রশিক্ষণ দিতে সফল হয়েছি কিনা!\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Killed by wolf = 1, won: 9 times, drown: 90 times\n"
+ ]
+ }
+ ],
+ "source": [
+ "def qpolicy(m):\n",
+ " x,y = m.human\n",
+ " v = probs(Q[x,y])\n",
+ " a = random.choices(list(actions),weights=v)[0]\n",
+ " return a\n",
+ "\n",
+ "print_statistics(qpolicy)"
+ ]
+ },
+ {
+ "source": [
+ "আমরা এখন ডুবে যাওয়ার ঘটনা অনেক কম দেখি, কিন্তু পিটার এখনও সবসময় নেকড়েকে মারতে সক্ষম হয় না। পরীক্ষা করে দেখুন এবং হাইপারপ্যারামিটার নিয়ে খেলে এই ফলাফল উন্নত করতে পারেন কিনা।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 13
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\n\n\n\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "plt.plot(lpath)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/1-QLearning/solution/notebook.ipynb b/translations/bn/8-Reinforcement/1-QLearning/solution/notebook.ipynb
new file mode 100644
index 000000000..d588f9afc
--- /dev/null
+++ b/translations/bn/8-Reinforcement/1-QLearning/solution/notebook.ipynb
@@ -0,0 +1,577 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "coopTranslator": {
+ "original_hash": "488431336543f71f14d4aaf0399e3381",
+ "translation_date": "2025-08-30T00:05:04+00:00",
+ "source_file": "8-Reinforcement/1-QLearning/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [
+ "# পিটার এবং নেকড়ে: রিইনফোর্সমেন্ট লার্নিং প্রাইমার\n",
+ "\n",
+ "এই টিউটোরিয়ালে, আমরা পথ খোঁজার সমস্যায় রিইনফোর্সমেন্ট লার্নিং প্রয়োগ করতে শিখব। এই সেটিংটি রাশিয়ান সুরকার [সের্গেই প্রোকোফিয়েভ](https://en.wikipedia.org/wiki/Sergei_Prokofiev) এর [পিটার এবং নেকড়ে](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) সঙ্গীতধর্মী রূপকথা দ্বারা অনুপ্রাণিত। এটি একটি গল্প যেখানে তরুণ পথিক পিটার সাহসের সাথে তার বাড়ি থেকে বেরিয়ে বনের ফাঁকা জায়গায় নেকড়েকে তাড়ানোর জন্য যায়। আমরা এমন মেশিন লার্নিং অ্যালগরিদম প্রশিক্ষণ দেব যা পিটারকে আশেপাশের এলাকা অন্বেষণ করতে এবং একটি সর্বোত্তম নেভিগেশন মানচিত্র তৈরি করতে সাহায্য করবে।\n",
+ "\n",
+ "প্রথমে, চলুন কিছু দরকারী লাইব্রেরি ইমপোর্ট করি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import random\n",
+ "import math"
+ ]
+ },
+ {
+ "source": [
+ "## রিইনফোর্সমেন্ট লার্নিং-এর ওভারভিউ\n",
+ "\n",
+ "**রিইনফোর্সমেন্ট লার্নিং** (RL) একটি শেখার পদ্ধতি যা আমাদেরকে একটি **এজেন্ট**-এর **পরিবেশ**-এ **অনুকূল আচরণ** শেখার সুযোগ দেয়, যেখানে আমরা অনেক পরীক্ষা-নিরীক্ষা চালাই। এই পরিবেশে একটি এজেন্টের অবশ্যই একটি **লক্ষ্য** থাকতে হবে, যা একটি **রিওয়ার্ড ফাংশন** দ্বারা সংজ্ঞায়িত।\n",
+ "\n",
+ "## পরিবেশ\n",
+ "\n",
+ "সহজতার জন্য, চলুন পিটারের জগৎকে `width` x `height` আকারের একটি বর্গাকার বোর্ড হিসেবে কল্পনা করি। এই বোর্ডের প্রতিটি সেল হতে পারে:\n",
+ "* **মাটি**, যেখানে পিটার এবং অন্যান্য প্রাণীরা হাঁটতে পারে\n",
+ "* **পানি**, যেখানে আপনি স্পষ্টতই হাঁটতে পারবেন না\n",
+ "* **গাছ** বা **ঘাস** - এমন একটি জায়গা যেখানে আপনি কিছুক্ষণ বিশ্রাম নিতে পারেন\n",
+ "* **আপেল**, যা এমন কিছু যা পিটার খুঁজে পেলে খুশি হবে এবং নিজেকে খাওয়াতে পারবে\n",
+ "* **নেকড়ে**, যা বিপজ্জনক এবং এড়িয়ে চলা উচিত\n",
+ "\n",
+ "পরিবেশের সাথে কাজ করার জন্য, আমরা `Board` নামে একটি ক্লাস সংজ্ঞায়িত করব। এই নোটবুকটি খুব বেশি জটিল না করার জন্য, বোর্ডের সাথে কাজ করার সমস্ত কোড আমরা একটি আলাদা `rlboard` মডিউলে সরিয়ে রেখেছি, যা আমরা এখন ইমপোর্ট করব। আপনি এই মডিউলের ভিতরে তাকিয়ে বাস্তবায়নের অভ্যন্তরীণ বিষয়গুলি সম্পর্কে আরও বিশদ জানতে পারেন।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from rlboard import *"
+ ]
+ },
+ {
+ "source": [
+ "এখন চলুন একটি র্যান্ডম বোর্ড তৈরি করি এবং দেখি এটি কেমন দেখায়:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\n\n\n\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "width, height = 8,8\n",
+ "m = Board(width,height)\n",
+ "m.randomize(seed=13)\n",
+ "m.plot()"
+ ]
+ },
+ {
+ "source": [
+ "## কার্যক্রম এবং নীতি\n",
+ "\n",
+ "আমাদের উদাহরণে, পিটারের লক্ষ্য হবে একটি আপেল খুঁজে বের করা, একইসাথে নেকড়ে এবং অন্যান্য বাধা এড়িয়ে চলা। এটি করতে, সে মূলত হাঁটতে পারে যতক্ষণ না সে একটি আপেল খুঁজে পায়। তাই, যেকোনো অবস্থানে সে নিচের চারটি কার্যক্রমের মধ্যে একটি বেছে নিতে পারে: উপরে, নিচে, বামে এবং ডানে। আমরা এই কার্যক্রমগুলোকে একটি ডিকশনারি হিসেবে সংজ্ঞায়িত করব এবং সেগুলোকে সংশ্লিষ্ট কোঅর্ডিনেট পরিবর্তনের জোড়ার সাথে মানচিত্রে সংযুক্ত করব। উদাহরণস্বরূপ, ডানে (`R`) চলা একটি জোড়া `(1,0)` এর সাথে সম্পর্কিত হবে।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "actions = { \"U\" : (0,-1), \"D\" : (0,1), \"L\" : (-1,0), \"R\" : (1,0) }\n",
+ "action_idx = { a : i for i,a in enumerate(actions.keys()) }"
+ ]
+ },
+ {
+ "source": [
+ "আমাদের এজেন্ট (পিটার)-এর কৌশল একটি তথাকথিত **নীতি** দ্বারা সংজ্ঞায়িত হয়। চলুন সবচেয়ে সহজ নীতি, যাকে **র্যান্ডম ওয়াক** বলা হয়, তা বিবেচনা করি।\n",
+ "\n",
+ "## র্যান্ডম ওয়াক\n",
+ "\n",
+ "প্রথমে চলুন একটি র্যান্ডম ওয়াক কৌশল বাস্তবায়ন করে আমাদের সমস্যার সমাধান করি।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "18"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 5
+ }
+ ],
+ "source": [
+ "def random_policy(m):\n",
+ " return random.choice(list(actions))\n",
+ "\n",
+ "def walk(m,policy,start_position=None):\n",
+ " n = 0 # number of steps\n",
+ " # set initial position\n",
+ " if start_position:\n",
+ " m.human = start_position \n",
+ " else:\n",
+ " m.random_start()\n",
+ " while True:\n",
+ " if m.at() == Board.Cell.apple:\n",
+ " return n # success!\n",
+ " if m.at() in [Board.Cell.wolf, Board.Cell.water]:\n",
+ " return -1 # eaten by wolf or drowned\n",
+ " while True:\n",
+ " a = actions[policy(m)]\n",
+ " new_pos = m.move_pos(m.human,a)\n",
+ " if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water:\n",
+ " m.move(a) # do the actual move\n",
+ " break\n",
+ " n+=1\n",
+ "\n",
+ "walk(m,random_policy)"
+ ]
+ },
+ {
+ "source": [
+ "চলুন র্যান্ডম ওয়াক পরীক্ষা কয়েকবার চালাই এবং গড়ে কতগুলো ধাপ নেওয়া হয়েছে তা দেখি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Average path length = 32.87096774193548, eaten by wolf: 7 times\n"
+ ]
+ }
+ ],
+ "source": [
+ "def print_statistics(policy):\n",
+ " s,w,n = 0,0,0\n",
+ " for _ in range(100):\n",
+ " z = walk(m,policy)\n",
+ " if z<0:\n",
+ " w+=1\n",
+ " else:\n",
+ " s += z\n",
+ " n += 1\n",
+ " print(f\"Average path length = {s/n}, eaten by wolf: {w} times\")\n",
+ "\n",
+ "print_statistics(random_policy)"
+ ]
+ },
+ {
+ "source": [
+ "## পুরস্কার ফাংশন\n",
+ "\n",
+ "আমাদের নীতিকে আরও বুদ্ধিমান করতে, আমাদের বুঝতে হবে কোন পদক্ষেপগুলি অন্যগুলোর তুলনায় \"ভালো\"।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "move_reward = -0.1\n",
+ "goal_reward = 10\n",
+ "end_reward = -10\n",
+ "\n",
+ "def reward(m,pos=None):\n",
+ " pos = pos or m.human\n",
+ " if not m.is_valid(pos):\n",
+ " return end_reward\n",
+ " x = m.at(pos)\n",
+ " if x==Board.Cell.water or x == Board.Cell.wolf:\n",
+ " return end_reward\n",
+ " if x==Board.Cell.apple:\n",
+ " return goal_reward\n",
+ " return move_reward"
+ ]
+ },
+ {
+ "source": [
+ "## কিউ-লার্নিং\n",
+ "\n",
+ "একটি কিউ-টেবিল বা বহু-মাত্রিক অ্যারে তৈরি করুন। যেহেতু আমাদের বোর্ডের মাত্রা `width` x `height`, আমরা কিউ-টেবিলকে একটি numpy অ্যারে দিয়ে উপস্থাপন করতে পারি যার আকৃতি হবে `width` x `height` x `len(actions)`।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)"
+ ]
+ },
+ {
+ "source": [
+ "Q-টেবিলটি বোর্ডে টেবিলটি চিত্রিত করার জন্য প্লট ফাংশনে পাস করুন:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\n\n\n\n",
+ "image/png": "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1fB4PKxatYoRI0bw4YcfMn/+fDp27Mj69eutjlZjx44d2O12rrrqKv71r3+xcOFCCgoKOHDggNXRanz66acMGjSIDh064Ha7efHFF1m0aFFY/QX42muv8bvf/Q6n08mll17Kn/70J1577bVGXacUtzhC586d2b59O/369aNNmzZs2bKF7Oxsq2PVkp2dzY8//kj//v1JTU3l+++/p0uXLlbHqhEVFUXr1q1RStG/f38CgQCHDh2iVatWVkerkZaWhmmatGnThvPOO4+ioiKSkpKIj4+3OlqNdu3asWfPHs4//3zOPPNMtm/fTufOneudj/Fky87OJjc3l/79+9OiRQs2btzY6O8XKW5xhO7du1NQUMD8+fN57733eP/99znvvPOsjlXLeeedx5dffsn69eu55557yMvLo3v37lbHquFwOOjcuTNvvvkmLpeLoUOHopQiKyvL6mg1MjIySElJYebMmXi9XiZNmkRWVhaJiYlWR6vRsWNHXC4Xf/vb31i7di0vv/wy55xzTlgVd69evdi4cSPLly/nmWeeYc2aNY0+dBcms7yLcPPFF1/w3Xff8cMPP4TdmCJAcnIyubm5vPfee1x99dVhVdrV+vfvz9atW8nJyWHlypVhtSVb7b777uPee+9lypQpfP/991bHOaq3336bwsJClixZwrZt26yOcwSbzcaWLVv4/PPPUUoxY8aMRl+nFLeoU7du3ejWrZvVMeo1ZMgQqyMc09SpU62OUC+lFH/5y1+sjlGvVq1aceedd1odo14XX3zxSVuXDJUIIUSEkeIWQogII8UthBARRopbCCEijBS3EEJEGCluIYSIMMcsbqXU6Uqpz5RS3yulvlNK/SG0PF0p9YlSKjf0OS20XCmlnldK7VBKbVJKndvY/wghhDiVHM8WdxC4T2vdFbgA+L1SqivwELBCa90JWBH6GuBXQKfQx3jgxQZPLYQQp7BjFrfWulBr/Z/Q7UrgByALuA6YF3rYPOD60O3rgPm6yv8BqUqp8LlAgxBCRLifNcatlGoHnAOsBVporQtDd+0HWoRuZwE/Hva0vaFlP32t8Uqp9Uqp9YGA52fGFkKIU9dxF7dSKhFYBEzSWte6ar2uumr4z7pyuNZ6tta6t9a6t8MR93OeKoQQp7TjKm6llIOq0l6otX4/tLioeggk9Ln6Ir4FwOmHPb11aJkQQogG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1r+LXq+XioqKsM5Y3/tEhcObKD09Xd9///1Wx6iTy+Xi4MGDtGvXzuoodSosLCQmJob09HSro9Rp27ZttG/fPqyHUTZu3MjZZ59tdYw6BQIBvv56F4cONf7F+n+p2NhSzjnHR6tGmv2oIeTl5ZGZmdnoM9WciGeeeYbS0tKj7yTSWlv+kZmZqcNZbm6unj17ttUx6vXBBx/o1atXWx2jXo8//rguLS21OkadTNPUEyZMsDpGvUpKSnSvXjm66pJg4fnRsuXXevHixVZ/q+o1a9YsnZuba3WMeoV68aidKWPcQggRYaS4hRAiwkhxCyFEhJHiFkKICCPFLYQQEUaKWwghIowUtxBCRBgpbiGEiDBS3EIIEWGkuIUQIsJIcQshRISR4hZCiAgjxS2EEBFGilsIISKMFLcQQkQYKW4hhIgwTba4V69eHdZTZAWDQdatW2d1jHqVlJSQm5trdYx67dixg5KSEqtj1Oubb74hGAxaHSOiuVwuNm/ebHWMeu3du5eCgoKTsq4wmXOy4axfv54PPviA2NhY/vWvf3HxxRdz2WWXWR2rlnfffZeNGzcSHR3NkiVLGD16NGeeeabVsWp55plnqKiowGazEQgEeOSRR4iLi7M6Vg2Px8O0adNwOByYpklSUhKTJ0+2OlYtO3bsYO7cucTExLBkyRKys7MZNmyY1bEizssvv8zu3btxOBy89dZbTJo0iebNm1sdq4Zpmjz22GM1G4pKKf70pz9hszXednGT2uLWWrNhwwZM0+QPf/gDLVu25PPPPw+rLW+tNf/85z/p3r07d999N0VFRezatSvsMs6bN48bbriB3/72t3zyySe43W6rY9Xi9Xr597//zejRo7nxxhuZP39+2H0Pd+3axf79+5kwYQJnn302H374YVhljARaaxYuXMill17K+PHj2bhxI8XFxWH1fTRNk7fffpvhw4dz8803884772CaZqOus0kVd35+Pps2baKyspJf/epXjB49mtjYWFavXm11tBrvv/8+F1xwAXPnzmXy5MlMmzaNhQsXUlFRYXW0GlOnTiUnJ4fbbruN5cuX88YbbzB+/HirY9Uybtw4Jk2axI033ojP5+P5559nypQpVseqUVlZyfz588nKymLw4MEMHjyYiy66iEWLFlkdLaL87W9/48477+Shhx7ixRdf5B//+AdTp05t9GL8OcaP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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "m.plot(Q)"
+ ]
+ },
+ {
+ "source": [
+ "## কিউ-লার্নিং এর মূল বিষয়: বেলম্যান সমীকরণ এবং শেখার অ্যালগরিদম\n",
+ "\n",
+ "আমাদের শেখার অ্যালগরিদমের জন্য একটি ছদ্ম-কোড লিখুন:\n",
+ "\n",
+ "* সমস্ত অবস্থান এবং ক্রিয়ার জন্য সমান সংখ্যায় Q-টেবিল Q আরম্ভ করুন\n",
+ "* শেখার হার সেট করুন $\\alpha\\leftarrow 1$\n",
+ "* বহুবার সিমুলেশন পুনরাবৃত্তি করুন\n",
+ " 1. যেকোনো র্যান্ডম অবস্থান থেকে শুরু করুন\n",
+ " 1. পুনরাবৃত্তি করুন\n",
+ " 1. অবস্থান $s$ এ একটি ক্রিয়া $a$ নির্বাচন করুন\n",
+ " 2. ক্রিয়া সম্পাদন করে নতুন অবস্থান $s'$ এ যান\n",
+ " 3. যদি আমরা খেলার শেষ অবস্থার সম্মুখীন হই, অথবা মোট পুরস্কার খুব কম হয় - সিমুলেশন থেকে বেরিয়ে আসুন \n",
+ " 4. নতুন অবস্থানে পুরস্কার $r$ গণনা করুন\n",
+ " 5. বেলম্যান সমীকরণ অনুযায়ী Q-ফাংশন আপডেট করুন: $Q(s,a)\\leftarrow (1-\\alpha)Q(s,a)+\\alpha(r+\\gamma\\max_{a'}Q(s',a'))$\n",
+ " 6. $s\\leftarrow s'$\n",
+ " 7. মোট পুরস্কার আপডেট করুন এবং $\\alpha$ কমান।\n",
+ "\n",
+ "## শোষণ বনাম অনুসন্ধান\n",
+ "\n",
+ "সেরা পদ্ধতি হলো শোষণ এবং অনুসন্ধানের মধ্যে ভারসাম্য বজায় রাখা। যখন আমরা আমাদের পরিবেশ সম্পর্কে আরও শিখি, তখন আমরা আরও বেশি সম্ভাবনা নিয়ে সর্বোত্তম পথ অনুসরণ করব, তবে মাঝে মাঝে অনাবিষ্কৃত পথ বেছে নেওয়া উচিত।\n",
+ "\n",
+ "## পাইথন বাস্তবায়ন\n",
+ "\n",
+ "এখন আমরা শেখার অ্যালগরিদম বাস্তবায়ন করতে প্রস্তুত। তার আগে, আমাদের এমন একটি ফাংশন প্রয়োজন যা Q-টেবিলের যেকোনো সংখ্যা সংশ্লিষ্ট ক্রিয়ার জন্য সম্ভাবনার ভেক্টরে রূপান্তর করবে:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def probs(v,eps=1e-4):\n",
+ " v = v-v.min()+eps\n",
+ " v = v/v.sum()\n",
+ " return v"
+ ]
+ },
+ {
+ "source": [
+ "আমরা মূল ভেক্টরে একটি ছোট পরিমাণ `eps` যোগ করি যাতে প্রাথমিক ক্ষেত্রে, যখন ভেক্টরের সমস্ত উপাদান অভিন্ন হয়, তখন 0 দিয়ে ভাগ করার সমস্যা এড়ানো যায়।\n",
+ "\n",
+ "আমরা যে প্রকৃত শিক্ষণ অ্যালগরিদমটি চালাব তা ৫০০০টি পরীক্ষার জন্য, যাকে **epochs** ও বলা হয়:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ ""
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "from IPython.display import clear_output\n",
+ "\n",
+ "lpath = []\n",
+ "\n",
+ "for epoch in range(10000):\n",
+ " clear_output(wait=True)\n",
+ " print(f\"Epoch = {epoch}\",end='')\n",
+ "\n",
+ " # Pick initial point\n",
+ " m.random_start()\n",
+ " \n",
+ " # Start travelling\n",
+ " n=0\n",
+ " cum_reward = 0\n",
+ " while True:\n",
+ " x,y = m.human\n",
+ " v = probs(Q[x,y])\n",
+ " a = random.choices(list(actions),weights=v)[0]\n",
+ " dpos = actions[a]\n",
+ " m.move(dpos,check_correctness=False) # we allow player to move outside the board, which terminates episode\n",
+ " r = reward(m)\n",
+ " cum_reward += r\n",
+ " if r==end_reward or cum_reward < -1000:\n",
+ " print(f\" {n} steps\",end='\\r')\n",
+ " lpath.append(n)\n",
+ " break\n",
+ " alpha = np.exp(-n / 3000)\n",
+ " gamma = 0.5\n",
+ " ai = action_idx[a]\n",
+ " Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max())\n",
+ " n+=1"
+ ]
+ },
+ {
+ "source": [
+ "এই অ্যালগরিদমটি কার্যকর করার পরে, Q-টেবিলটি এমন মানগুলির সাথে আপডেট হওয়া উচিত যা প্রতিটি ধাপে বিভিন্ন ক্রিয়ার আকর্ষণীয়তা সংজ্ঞায়িত করে। এখানে টেবিলটি চিত্রিত করুন:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\n\n\n\n",
+ "image/png": "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DBhgaPG22+307NmTbt26hQv1W2+9xWuvvUbv3r0544wzDP/lEqvUr7UIevPNN7n55ptPuWhX8Xg8XHPNNaxcuTJCyequZcuWMWHCBGbMmMFzzz3HE088YXSkOkkIgc1mw2w289RTT7Fs2TKWLl164r9YCywWS/h2dtdddx2apjFv3jw+/vhjo6PFLFW4I2TBggXcddddR/VnCyFwOBwnbDUIIUhISDhq27Zt27j55pv57rvvopK3LiguLmbt2rUsWLCAl19+mcTERFq0aMHatWuNjlbnTZkyhT179sTkxcCxY8fy9NNPs3v3bj744AOj48QkVbhrSNM03n77bSZPnkxZWdlR32vVqhWzZ88+YX+d1WplyZIlpKSkHDVJZ/v27Vx55ZXs2LGjQY42SU5O5qyzzmLZsmWMGzeOyy67jBdffJFdu3ZRVlbWIF+TSLHb7XTp0oWcnJxqRzwZyW63M3bsWDZv3szKlStj/t+6trt0VOGuASklK1eu5Prrr6ekpCS8vXHjxvTv359vv/2WzMzMk/pHPfvss/n111+55557jmp95+bm0q9fP/Lz86PyHGKZxWKhdevWLF68mBUrVjBnzhzuv/9+9u/fz7XXXsvy5cvZs2eP0THrrAsvvJDmzZvz5ptvxmTxdjgcPPjggyxZsiTmuw1r+xeLKtw1oOs6f//734/q027atCnTpk3jk08+oVGjRid9rKrp8ZMmTeK22247agnQiooK5s6dG/Otjmg477zzWLZsGX6/n48//pg777yTKVOm8N5777FmzRreeOMNHnnkEbxer9FRj+nLL7/kvPPOi8klXYUQjBkzBiEE//d//2d0nGMSQvDMM8+wZs2amOzWqZKZmUnLli354YcfauV8qnDXgBCCVq1ahdcZsVqtTJ8+nVGjRpGcnPy73z4JIcjIyOC+++5j/Pjx4e12u73WR1IkJCQwatSomFnf4qabbjpqpl9cXBwPP/wwo0eP5txzz+XKK6/kiSeeCA91ixUrVqzgvPPOIy4uzugo1frLX/5Cy5YtefLJJ2PqtasihOCuu+7il19+4ZNPPonJjFWFe9OmTbVyPlW4a0AIwfTp05k8eTJt27Zl/fr1jB49+jcXGn/vf7S0tDRmzJjByy+/TJs2bZg9e3a4ZVRbqropYr0rok2bNgwaNIi33nqLjh070r17d7766isOHDhg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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "m.plot(Q)"
+ ]
+ },
+ {
+ "source": [
+ "## নীতিমালা পরীক্ষা করা\n",
+ "\n",
+ "যেহেতু Q-Table প্রতিটি অবস্থায় প্রতিটি ক্রিয়ার \"আকর্ষণীয়তা\" তালিকাভুক্ত করে, এটি আমাদের জগতে কার্যকর নেভিগেশন সংজ্ঞায়িত করতে ব্যবহার করা বেশ সহজ। সবচেয়ে সহজ ক্ষেত্রে, আমরা কেবল সেই ক্রিয়াটি নির্বাচন করতে পারি যা Q-Table-এ সর্বোচ্চ মানের সাথে মিলে যায়:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "2"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 13
+ }
+ ],
+ "source": [
+ "def qpolicy_strict(m):\n",
+ " x,y = m.human\n",
+ " v = probs(Q[x,y])\n",
+ " a = list(actions)[np.argmax(v)]\n",
+ " return a\n",
+ "\n",
+ "walk(m,qpolicy_strict)"
+ ]
+ },
+ {
+ "source": [
+ "যদি আপনি উপরের কোডটি একাধিকবার চেষ্টা করেন, আপনি লক্ষ্য করতে পারেন যে কখনও কখনও এটি শুধু \"অচল\" হয়ে যায়, এবং আপনাকে নোটবুকের STOP বোতাম চাপতে হয় এটি থামানোর জন্য। \n",
+ "\n",
+ "> **টাস্ক ১:** `walk` ফাংশনটি সংশোধন করুন যাতে এটি পথের সর্বাধিক দৈর্ঘ্য একটি নির্দিষ্ট সংখ্যক ধাপে (ধরা যাক, ১০০) সীমাবদ্ধ করে, এবং উপরের কোডটি মাঝে মাঝে এই মানটি ফেরত দেয় তা পর্যবেক্ষণ করুন।\n",
+ "\n",
+ "> **টাস্ক ২:** `walk` ফাংশনটি সংশোধন করুন যাতে এটি পূর্বে যেখানে গিয়েছিল সেই জায়গাগুলিতে আবার না যায়। এটি `walk`-কে লুপিং থেকে রোধ করবে, তবে এজেন্ট এখনও এমন একটি স্থানে \"ফাঁদে\" পড়তে পারে যেখান থেকে এটি বের হতে অক্ষম।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Average path length = 3.45, eaten by wolf: 0 times\n"
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "def qpolicy(m):\n",
+ " x,y = m.human\n",
+ " v = probs(Q[x,y])\n",
+ " a = random.choices(list(actions),weights=v)[0]\n",
+ " return a\n",
+ "\n",
+ "print_statistics(qpolicy)"
+ ]
+ },
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 15
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\n\n\n\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "plt.plot(lpath)"
+ ]
+ },
+ {
+ "source": [
+ "আমরা এখানে যা দেখতে পাচ্ছি তা হলো প্রথমে গড় পথের দৈর্ঘ্য বৃদ্ধি পেয়েছে। এটি সম্ভবত এই কারণে হয়েছে যে, যখন আমরা পরিবেশ সম্পর্কে কিছুই জানি না - তখন আমরা খারাপ অবস্থায়, যেমন জল বা নেকড়ের ফাঁদে পড়ার সম্ভাবনা বেশি। যখন আমরা আরও শিখি এবং এই জ্ঞান ব্যবহার করতে শুরু করি, তখন আমরা পরিবেশটি আরও দীর্ঘ সময় ধরে অন্বেষণ করতে পারি, তবে এখনও আপেল কোথায় রয়েছে তা ভালোভাবে জানি না।\n",
+ "\n",
+ "যখন আমরা যথেষ্ট শিখে যাই, তখন এজেন্টের জন্য লক্ষ্য অর্জন করা সহজ হয়ে যায়, এবং পথের দৈর্ঘ্য কমতে শুরু করে। তবে, আমরা এখনও অন্বেষণের জন্য উন্মুক্ত থাকি, তাই আমরা প্রায়ই সেরা পথ থেকে সরে যাই এবং নতুন বিকল্পগুলি অন্বেষণ করি, যা পথটিকে আদর্শের চেয়ে দীর্ঘ করে তোলে।\n",
+ "\n",
+ "এই গ্রাফে আমরা আরও যা লক্ষ্য করি, তা হলো এক পর্যায়ে পথের দৈর্ঘ্য হঠাৎ বৃদ্ধি পেয়েছে। এটি প্রক্রিয়ার স্টোকাস্টিক প্রকৃতিকে নির্দেশ করে, এবং এটি দেখায় যে আমরা কোনো এক সময়ে Q-Table এর সহগগুলিকে \"বিকৃত\" করতে পারি, নতুন মান দিয়ে সেগুলি ওভাররাইট করার মাধ্যমে। এটি আদর্শভাবে শেখার হার কমিয়ে (অর্থাৎ, প্রশিক্ষণের শেষের দিকে আমরা Q-Table এর মানগুলোকে কেবলমাত্র ছোট মান দিয়ে সামঞ্জস্য করি) হ্রাস করা উচিত।\n",
+ "\n",
+ "সামগ্রিকভাবে, এটি মনে রাখা গুরুত্বপূর্ণ যে শেখার প্রক্রিয়ার সাফল্য এবং গুণমান উল্লেখযোগ্যভাবে নির্ভর করে বিভিন্ন প্যারামিটারের উপর, যেমন শেখার হার, শেখার হারের ক্ষয় এবং ডিসকাউন্ট ফ্যাক্টর। এগুলোকে প্রায়ই **হাইপারপ্যারামিটার** বলা হয়, যাতে সেগুলোকে **প্যারামিটার** থেকে আলাদা করা যায়, যা আমরা প্রশিক্ষণের সময় অপ্টিমাইজ করি (যেমন Q-Table এর সহগ)। সেরা হাইপারপ্যারামিটার মান খুঁজে বের করার প্রক্রিয়াকে বলা হয় **হাইপারপ্যারামিটার অপ্টিমাইজেশন**, এবং এটি একটি আলাদা আলোচনার যোগ্য।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "## অনুশীলন\n",
+ "#### একটি আরও বাস্তবসম্মত পিটার এবং নেকড়ে বিশ্ব\n",
+ "\n",
+ "আমাদের পরিস্থিতিতে, পিটার প্রায় ক্লান্ত বা ক্ষুধার্ত না হয়ে এক জায়গা থেকে অন্য জায়গায় যেতে পারত। একটি আরও বাস্তবসম্মত বিশ্বে, তাকে মাঝে মাঝে বসে বিশ্রাম নিতে হবে এবং নিজেকে খাওয়াতে হবে। চলুন আমাদের বিশ্বকে আরও বাস্তবসম্মত করি নিম্নলিখিত নিয়মগুলো প্রয়োগ করে:\n",
+ "\n",
+ "1. এক জায়গা থেকে অন্য জায়গায় যাওয়ার সময়, পিটার **শক্তি** হারাবে এবং কিছু **ক্লান্তি** অর্জন করবে।\n",
+ "2. পিটার আপেল খেয়ে আরও শক্তি অর্জন করতে পারে।\n",
+ "3. পিটার গাছের নিচে বা ঘাসের উপর বিশ্রাম নিয়ে ক্লান্তি দূর করতে পারে (অর্থাৎ, বোর্ডের এমন জায়গায় হাঁটা যেখানে গাছ বা ঘাস আছে - সবুজ ক্ষেত্র)।\n",
+ "4. পিটারকে নেকড়েকে খুঁজে বের করে হত্যা করতে হবে।\n",
+ "5. নেকড়েকে হত্যা করার জন্য, পিটারের নির্দিষ্ট মাত্রার শক্তি এবং ক্লান্তি থাকা প্রয়োজন, অন্যথায় সে যুদ্ধে হেরে যাবে।\n",
+ "\n",
+ "উপরের নিয়ম অনুযায়ী পুরস্কার ফাংশনটি পরিবর্তন করুন, রিইনফোর্সমেন্ট লার্নিং অ্যালগরিদম চালিয়ে গেমটি জেতার সেরা কৌশল শিখুন এবং র্যান্ডম হাঁটার ফলাফলগুলোর সাথে আপনার অ্যালগরিদমের ফলাফল তুলনা করুন, গেম জেতা এবং হারার সংখ্যার ভিত্তিতে।\n",
+ "\n",
+ "> **Note**: এটি কাজ করার জন্য আপনাকে হাইপারপ্যারামিটারগুলো সামঞ্জস্য করতে হতে পারে, বিশেষত epochs-এর সংখ্যা। কারণ গেমের সফলতা (নেকড়ের সাথে যুদ্ধ) একটি বিরল ঘটনা, আপনি অনেক দীর্ঘ প্রশিক্ষণের সময় আশা করতে পারেন।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/2-Gym/README.md b/translations/bn/8-Reinforcement/2-Gym/README.md
new file mode 100644
index 000000000..9cff79cbd
--- /dev/null
+++ b/translations/bn/8-Reinforcement/2-Gym/README.md
@@ -0,0 +1,333 @@
+
+## প্রয়োজনীয়তা
+
+এই পাঠে আমরা **OpenAI Gym** নামক একটি লাইব্রেরি ব্যবহার করব বিভিন্ন **পরিবেশ** সিমুলেট করার জন্য। আপনি এই পাঠের কোড লোকাল মেশিনে (যেমন Visual Studio Code) চালাতে পারেন, যেখানে সিমুলেশন একটি নতুন উইন্ডোতে খুলবে। অনলাইনে কোড চালানোর সময়, আপনাকে কিছু কোড পরিবর্তন করতে হতে পারে, যেমনটি [এখানে](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7) বর্ণনা করা হয়েছে।
+
+## OpenAI Gym
+
+পূর্ববর্তী পাঠে, গেমের নিয়ম এবং স্টেট `Board` ক্লাস দ্বারা নির্ধারিত ছিল যা আমরা নিজেরাই সংজ্ঞায়িত করেছিলাম। এখানে আমরা একটি বিশেষ **সিমুলেশন পরিবেশ** ব্যবহার করব, যা ভারসাম্য রক্ষার জন্য ফিজিক্স সিমুলেট করবে। রিইনফোর্সমেন্ট লার্নিং অ্যালগরিদম প্রশিক্ষণের জন্য সবচেয়ে জনপ্রিয় সিমুলেশন পরিবেশগুলির একটি হল [Gym](https://gym.openai.com/), যা [OpenAI](https://openai.com/) দ্বারা রক্ষণাবেক্ষণ করা হয়। এই জিম ব্যবহার করে আমরা কার্টপোল সিমুলেশন থেকে শুরু করে অ্যাটারি গেম পর্যন্ত বিভিন্ন **পরিবেশ** তৈরি করতে পারি।
+
+> **Note**: OpenAI Gym-এ উপলব্ধ অন্যান্য পরিবেশ দেখতে পারেন [এখানে](https://gym.openai.com/envs/#classic_control)।
+
+প্রথমে, জিম ইনস্টল করি এবং প্রয়োজনীয় লাইব্রেরি ইমপোর্ট করি (কোড ব্লক 1):
+
+```python
+import sys
+!{sys.executable} -m pip install gym
+
+import gym
+import matplotlib.pyplot as plt
+import numpy as np
+import random
+```
+
+## অনুশীলন - একটি কার্টপোল পরিবেশ ইনিশিয়ালাইজ করা
+
+কার্টপোল ভারসাম্য সমস্যার সাথে কাজ করতে, আমাদের সংশ্লিষ্ট পরিবেশ ইনিশিয়ালাইজ করতে হবে। প্রতিটি পরিবেশের সাথে যুক্ত থাকে:
+
+- **Observation space**, যা পরিবেশ থেকে প্রাপ্ত তথ্যের কাঠামো নির্ধারণ করে। কার্টপোল সমস্যার জন্য, আমরা পোলের অবস্থান, বেগ এবং অন্যান্য কিছু মান পাই।
+
+- **Action space**, যা সম্ভাব্য ক্রিয়াগুলি নির্ধারণ করে। আমাদের ক্ষেত্রে, অ্যাকশন স্পেস ডিসক্রিট এবং দুটি ক্রিয়া নিয়ে গঠিত - **বাম** এবং **ডান**। (কোড ব্লক 2)
+
+1. ইনিশিয়ালাইজ করতে, নিচের কোডটি টাইপ করুন:
+
+ ```python
+ env = gym.make("CartPole-v1")
+ print(env.action_space)
+ print(env.observation_space)
+ print(env.action_space.sample())
+ ```
+
+পরিবেশটি কীভাবে কাজ করে তা দেখতে, 100 ধাপের জন্য একটি ছোট সিমুলেশন চালাই। প্রতিটি ধাপে, আমরা একটি ক্রিয়া প্রদান করি - এই সিমুলেশনে আমরা `action_space` থেকে এলোমেলোভাবে একটি ক্রিয়া নির্বাচন করি।
+
+1. নিচের কোডটি চালান এবং এটি কী ফলাফল দেয় তা দেখুন।
+
+ ✅ মনে রাখবেন, এই কোডটি লোকাল পাইথন ইনস্টলেশনে চালানোই উত্তম! (কোড ব্লক 3)
+
+ ```python
+ env.reset()
+
+ for i in range(100):
+ env.render()
+ env.step(env.action_space.sample())
+ env.close()
+ ```
+
+ আপনি এরকম কিছু দেখতে পাবেন:
+
+ 
+
+1. সিমুলেশনের সময়, আমাদের সিদ্ধান্ত নেওয়ার জন্য পর্যবেক্ষণগুলি পেতে হবে। প্রকৃতপক্ষে, `step` ফাংশন বর্তমান পর্যবেক্ষণ, একটি রিওয়ার্ড ফাংশন এবং `done` ফ্ল্যাগ প্রদান করে যা নির্দেশ করে সিমুলেশন চালিয়ে যাওয়া উচিত কিনা: (কোড ব্লক 4)
+
+ ```python
+ env.reset()
+
+ done = False
+ while not done:
+ env.render()
+ obs, rew, done, info = env.step(env.action_space.sample())
+ print(f"{obs} -> {rew}")
+ env.close()
+ ```
+
+ আপনি নোটবুক আউটপুটে এরকম কিছু দেখতে পাবেন:
+
+ ```text
+ [ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0
+ [ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0
+ [ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0
+ [ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0
+ [ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0
+ ...
+ [ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0
+ [ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0
+ ```
+
+ সিমুলেশনের প্রতিটি ধাপে ফেরত দেওয়া পর্যবেক্ষণ ভেক্টরে নিম্নলিখিত মানগুলি থাকে:
+ - কার্টের অবস্থান
+ - কার্টের বেগ
+ - পোলের কোণ
+ - পোলের ঘূর্ণন হার
+
+1. এই সংখ্যাগুলির সর্বনিম্ন এবং সর্বাধিক মান পান: (কোড ব্লক 5)
+
+ ```python
+ print(env.observation_space.low)
+ print(env.observation_space.high)
+ ```
+
+ আপনি লক্ষ্য করতে পারেন যে প্রতিটি সিমুলেশন ধাপে রিওয়ার্ড মান সর্বদা 1। এর কারণ আমাদের লক্ষ্য যতটা সম্ভব দীর্ঘ সময় ধরে টিকে থাকা, অর্থাৎ পোলটিকে একটি যুক্তিসঙ্গত উল্লম্ব অবস্থানে যতটা সম্ভব দীর্ঘ সময় ধরে রাখা।
+
+ ✅ প্রকৃতপক্ষে, কার্টপোল সিমুলেশন সমাধান করা হয়েছে বলে বিবেচিত হয় যদি আমরা 100 ধারাবাহিক ট্রায়ালে গড়ে 195 রিওয়ার্ড অর্জন করতে পারি।
+
+## স্টেট ডিসক্রিটাইজেশন
+
+Q-Learning-এ, আমাদের একটি Q-টেবিল তৈরি করতে হবে যা প্রতিটি স্টেটে কী করতে হবে তা সংজ্ঞায়িত করে। এটি করতে, আমাদের স্টেট **ডিসক্রিট** হতে হবে, আরও নির্দিষ্টভাবে, এতে সীমিত সংখ্যক ডিসক্রিট মান থাকতে হবে। সুতরাং, আমাদের পর্যবেক্ষণগুলিকে **ডিসক্রিটাইজ** করতে হবে, অর্থাৎ তাদের একটি সীমিত সেটে ম্যাপ করতে হবে।
+
+এটি করার কয়েকটি উপায় রয়েছে:
+
+- **বিনে ভাগ করা**। যদি আমরা একটি নির্দিষ্ট মানের পরিসর জানি, আমরা এই পরিসরটিকে কয়েকটি **বিনে** ভাগ করতে পারি এবং তারপর মানটিকে সেই বিন নম্বর দ্বারা প্রতিস্থাপন করতে পারি যেখানে এটি অন্তর্ভুক্ত। এটি numpy-এর [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) পদ্ধতি ব্যবহার করে করা যেতে পারে। এই ক্ষেত্রে, আমরা স্টেটের আকার সঠিকভাবে জানব, কারণ এটি ডিজিটালাইজেশনের জন্য নির্বাচিত বিনের সংখ্যার উপর নির্ভর করবে।
+
+✅ আমরা লিনিয়ার ইন্টারপোলেশন ব্যবহার করে মানগুলিকে একটি সীমিত পরিসরে (যেমন, -20 থেকে 20) আনতে পারি এবং তারপর রাউন্ডিং করে সংখ্যাগুলিকে পূর্ণসংখ্যায় রূপান্তর করতে পারি। এটি আমাদের স্টেটের আকারের উপর কিছুটা কম নিয়ন্ত্রণ দেয়, বিশেষ করে যদি আমরা ইনপুট মানগুলির সঠিক পরিসর না জানি। উদাহরণস্বরূপ, আমাদের ক্ষেত্রে 4টির মধ্যে 2টি মানের উপরের/নিচের সীমা নেই, যা অসীম সংখ্যক স্টেটের ফলাফল হতে পারে।
+
+আমাদের উদাহরণে, আমরা দ্বিতীয় পদ্ধতিটি ব্যবহার করব। আপনি পরে লক্ষ্য করবেন যে, উপরের/নিচের সীমা সংজ্ঞায়িত না থাকা সত্ত্বেও, এই মানগুলি খুব কমই নির্দিষ্ট সীমিত পরিসরের বাইরে মান নেয়, তাই চরম মান সহ স্টেটগুলি খুব বিরল হবে।
+
+1. এখানে একটি ফাংশন রয়েছে যা আমাদের মডেল থেকে পর্যবেক্ষণ নেবে এবং 4টি পূর্ণসংখ্যার মানের একটি টুপল তৈরি করবে: (কোড ব্লক 6)
+
+ ```python
+ def discretize(x):
+ return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))
+ ```
+
+1. আসুন বিন ব্যবহার করে আরেকটি ডিসক্রিটাইজেশন পদ্ধতি অন্বেষণ করি: (কোড ব্লক 7)
+
+ ```python
+ def create_bins(i,num):
+ return np.arange(num+1)*(i[1]-i[0])/num+i[0]
+
+ print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10))
+
+ ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervals of values for each parameter
+ nbins = [20,20,10,10] # number of bins for each parameter
+ bins = [create_bins(ints[i],nbins[i]) for i in range(4)]
+
+ def discretize_bins(x):
+ return tuple(np.digitize(x[i],bins[i]) for i in range(4))
+ ```
+
+1. এখন একটি ছোট সিমুলেশন চালাই এবং এই ডিসক্রিট পরিবেশের মানগুলি পর্যবেক্ষণ করি। `discretize` এবং `discretize_bins` উভয় চেষ্টা করতে পারেন এবং পার্থক্য আছে কিনা তা দেখতে পারেন।
+
+ ✅ `discretize_bins` বিন নম্বর ফেরত দেয়, যা 0-ভিত্তিক। সুতরাং ইনপুট ভেরিয়েবলের মান 0-এর কাছাকাছি থাকলে এটি পরিসরের মাঝখানের সংখ্যা (10) ফেরত দেয়। `discretize`-এ, আমরা আউটপুট মানগুলির পরিসরের যত্ন নিইনি, তাদের নেতিবাচক হতে দিয়েছি, তাই স্টেট মানগুলি স্থানান্তরিত হয়নি এবং 0 মানে 0। (কোড ব্লক 8)
+
+ ```python
+ env.reset()
+
+ done = False
+ while not done:
+ #env.render()
+ obs, rew, done, info = env.step(env.action_space.sample())
+ #print(discretize_bins(obs))
+ print(discretize(obs))
+ env.close()
+ ```
+
+ ✅ পরিবেশটি কীভাবে কার্যকর হয় তা দেখতে চাইলে `env.render` দিয়ে শুরু হওয়া লাইনটি আনকমেন্ট করুন। অন্যথায়, আপনি এটি ব্যাকগ্রাউন্ডে কার্যকর করতে পারেন, যা দ্রুততর। আমরা আমাদের Q-Learning প্রক্রিয়ার সময় এই "অদৃশ্য" কার্যকরকরণটি ব্যবহার করব।
+
+## Q-টেবিলের কাঠামো
+
+পূর্ববর্তী পাঠে, স্টেটটি 0 থেকে 8 পর্যন্ত দুটি সংখ্যার একটি সাধারণ জোড়া ছিল, এবং তাই এটি একটি numpy টেনসর দ্বারা Q-টেবিল উপস্থাপন করা সুবিধাজনক ছিল যার আকার ছিল 8x8x2। যদি আমরা বিন ডিসক্রিটাইজেশন ব্যবহার করি, আমাদের স্টেট ভেক্টরের আকারও জানা থাকে, তাই আমরা একই পদ্ধতি ব্যবহার করতে পারি এবং স্টেটটিকে 20x20x10x10x2 আকারের একটি অ্যারে দ্বারা উপস্থাপন করতে পারি (এখানে 2 হল অ্যাকশন স্পেসের মাত্রা, এবং প্রথম মাত্রাগুলি পর্যবেক্ষণ স্পেসে প্রতিটি প্যারামিটারের জন্য ব্যবহৃত বিনের সংখ্যার সাথে সম্পর্কিত)।
+
+তবে, কখনও কখনও পর্যবেক্ষণ স্পেসের সঠিক মাত্রা জানা যায় না। `discretize` ফাংশনের ক্ষেত্রে, আমরা কখনই নিশ্চিত হতে পারি না যে আমাদের স্টেট নির্দিষ্ট সীমার মধ্যে থাকবে, কারণ কিছু আসল মান সীমাবদ্ধ নয়। সুতরাং, আমরা একটি ভিন্ন পদ্ধতি ব্যবহার করব এবং Q-টেবিলকে একটি ডিকশনারি দ্বারা উপস্থাপন করব।
+
+1. *(state, action)* জোড়াকে ডিকশনারি কী হিসাবে ব্যবহার করুন, এবং মানটি Q-টেবিল এন্ট্রি মানের সাথে সম্পর্কিত হবে। (কোড ব্লক 9)
+
+ ```python
+ Q = {}
+ actions = (0,1)
+
+ def qvalues(state):
+ return [Q.get((state,a),0) for a in actions]
+ ```
+
+ এখানে আমরা একটি ফাংশন `qvalues()`-ও সংজ্ঞায়িত করি, যা একটি প্রদত্ত স্টেটের জন্য Q-টেবিল মানগুলির একটি তালিকা ফেরত দেয় যা সমস্ত সম্ভাব্য ক্রিয়ার সাথে সম্পর্কিত। যদি এন্ট্রি Q-টেবিলে উপস্থিত না থাকে, আমরা ডিফল্ট হিসাবে 0 ফেরত দেব।
+
+## আসুন Q-Learning শুরু করি
+
+এখন আমরা পিটারকে ভারসাম্য রক্ষা করতে শেখানোর জন্য প্রস্তুত!
+
+1. প্রথমে, কিছু হাইপারপ্যারামিটার সেট করি: (কোড ব্লক 10)
+
+ ```python
+ # hyperparameters
+ alpha = 0.3
+ gamma = 0.9
+ epsilon = 0.90
+ ```
+
+ এখানে, `alpha` হল **লার্নিং রেট**, যা প্রতিটি ধাপে Q-টেবিলের বর্তমান মানগুলি কতটা সামঞ্জস্য করা উচিত তা নির্ধারণ করে। পূর্ববর্তী পাঠে আমরা 1 দিয়ে শুরু করেছিলাম এবং তারপর প্রশিক্ষণের সময় `alpha`-কে কম মানে নামিয়ে এনেছিলাম। এই উদাহরণে আমরা এটি ধ্রুবক রাখব শুধুমাত্র সরলতার জন্য, এবং আপনি পরে `alpha` মানগুলি সামঞ্জস্য করার সাথে পরীক্ষা করতে পারেন।
+
+ `gamma` হল **ডিসকাউন্ট ফ্যাক্টর**, যা দেখায় যে আমরা বর্তমান রিওয়ার্ডের তুলনায় ভবিষ্যতের রিওয়ার্ডকে কতটা অগ্রাধিকার দেব।
+
+ `epsilon` হল **এক্সপ্লোরেশন/এক্সপ্লয়টেশন ফ্যাক্টর**, যা নির্ধারণ করে যে আমরা এক্সপ্লোরেশনকে এক্সপ্লয়টেশনের তুলনায় বেশি পছন্দ করব কিনা। আমাদের অ্যালগরিদমে, আমরা `epsilon` শতাংশ ক্ষেত্রে Q-টেবিল মান অনুযায়ী পরবর্তী ক্রিয়া নির্বাচন করব, এবং বাকি ক্ষেত্রে আমরা একটি এলোমেলো ক্রিয়া কার্যকর করব। এটি আমাদের অনুসন্ধান স্থানের এমন এলাকাগুলি অন্বেষণ করতে দেবে যা আমরা আগে কখনও দেখিনি।
+
+ ✅ ভারসাম্য রক্ষার ক্ষেত্রে - এলোমেলো ক্রিয়া (এক্সপ্লোরেশন) একটি ভুল দিকের এলোমেলো ধাক্কার মতো কাজ করবে, এবং পোলটিকে এই "ভুলগুলি" থেকে ভারসাম্য পুনরুদ্ধার করতে শিখতে হবে।
+
+### অ্যালগরিদম উন্নত করা
+
+আমরা পূর্ববর্তী পাঠের অ্যালগরিদমে দুটি উন্নতি করতে পারি:
+
+- **গড় সামগ্রিক রিওয়ার্ড গণনা করা**, একাধিক সিমুলেশনের উপর ভিত্তি করে। আমরা প্রতি 5000 পুনরাবৃত্তিতে অগ্রগতি প্রিন্ট করব এবং আমরা সেই সময়ের উপর আমাদের সামগ্রিক রিওয়ার্ড গড় করব। এর মানে হল যে যদি আমরা 195 পয়েন্টের বেশি পাই - আমরা সমস্যাটি সমাধান হয়েছে বলে বিবেচনা করতে পারি, এমনকি প্রয়োজনীয় মানের চেয়েও উচ্চ মানের।
+
+- **সর্বাধিক গড় সামগ্রিক ফলাফল গণনা করা**, `Qmax`, এবং আমরা সেই ফলাফলের সাথে সম্পর্কিত Q-টেবিল সংরক্ষণ করব। যখন আপনি প্রশিক্ষণ চালাবেন, আপনি লক্ষ্য করবেন যে কখনও কখনও গড় সামগ্রিক ফলাফল কমতে শুরু করে, এবং আমরা সেই Q-টেবিলের মানগুলি রাখতে চাই যা প্রশিক্ষণের সময় পর্যবেক্ষণ করা সেরা মডেলের সাথে সম্পর্কিত।
+
+1. প্রতিটি সিমুলেশনে `rewards` ভেক্টরে সমস্ত সামগ্রিক রিওয়ার্ড সংগ্রহ করুন ভবিষ্যতে প্লট করার জন্য। (কোড ব্লক 11)
+
+ ```python
+ def probs(v,eps=1e-4):
+ v = v-v.min()+eps
+ v = v/v.sum()
+ return v
+
+ Qmax = 0
+ cum_rewards = []
+ rewards = []
+ for epoch in range(100000):
+ obs = env.reset()
+ done = False
+ cum_reward=0
+ # == do the simulation ==
+ while not done:
+ s = discretize(obs)
+ if random.random() Qmax:
+ Qmax = np.average(cum_rewards)
+ Qbest = Q
+ cum_rewards=[]
+ ```
+
+এই ফলাফলগুলি থেকে আপনি যা লক্ষ্য করতে পারেন:
+
+- **আমাদের লক্ষ্য কাছাকাছি**। আমরা 100+ ধারাবাহিক সিমুলেশনের উপর 195 সামগ্রিক রিওয়ার্ড অর্জনের লক্ষ্যের খুব কাছাকাছি, বা আমরা এটি ইতিমধ্যেই অর্জন করেছি! এমনকি যদি আমরা ছোট সংখ্যা পাই, আমরা এখনও জানি না, কারণ আমরা 5000 রান গড় করি, এবং আনুষ্ঠানিক মানদণ্ডে শুধুমাত্র 100 রান প্রয়োজন।
+
+- **রিওয়ার্ড কমতে শুরু করে**। কখনও কখনও রিওয়ার্ড কমতে শুরু করে, যার মানে আমরা Q-টেবিলে ইতিমধ্যে শেখা মানগুলিকে এমন মানগুলির সাথে "ধ্বংস" করতে পারি যা পরিস্থিতি আরও খারাপ করে তোলে।
+
+এই পর্যবেক্ষণটি আরও স্পষ্টভাবে দৃশ্যমান যদি আমরা প্রশিক্ষণের অগ্রগতি প্লট করি।
+
+## প্রশিক্ষণের অগ্রগতি প্লট করা
+
+প্রশিক্ষণের সময়, আমরা প্রতিটি পুনরাবৃত্তিতে সামগ্রিক রিওয়ার্ড মান `rewards` ভেক্টরে সংগ্রহ করেছি। এটি পুনরাবৃত্তি সংখ্যার বিপরীতে প্লট করলে এটি দেখতে এরকম হবে:
+
+```python
+plt.plot(rewards)
+```
+
+
+
+এই গ্রাফ থেকে কিছু বলা সম্ভব নয়, কারণ স্টোকাস্টিক প্রশিক্ষণ প্রক্রিয়ার প্রকৃতির কারণে প্রশিক্ষণ সেশনের দৈর্ঘ্য ব্যাপকভাবে পরিবর্তিত হয়। এই গ্রাফটি আরও অর্থবহ করতে, আমরা 100টি পরীক্ষার উপর **রানিং গড়** গণনা করতে পারি। এটি `np.convolve` ব্যবহার করে সুবিধাজনকভাবে করা যেতে পারে: (কোড ব্লক 12)
+
+```python
+def running_average(x,window):
+ return np.convolve(x,np.ones(window)/window,mode='valid')
+
+plt.plot(running_average(rewards,100))
+```
+
+
+
+## হাইপারপ্যারামিটার পরিবর্তন করা
+
+শেখার প্রক্রিয়াটি আরও স্থিতিশীল করতে, প্রশিক্ষণের সময় আমাদের কিছু হাইপারপ্যারামিটার সামঞ্জস্য করা বুদ্ধিমানের কাজ। বিশেষ করে:
+
+- **লার্নিং রেটের জন্য**, `alpha`, আমরা 1-এর কাছাকাছি মান দিয়ে শুরু করতে পারি এবং তারপর প্যারামিটারটি কমিয়ে রাখতে পারি। সময়ের সাথে সাথে, আমরা Q-টেবিলে ভাল সম্ভাব্য মান পেতে থাকব, এবং তাই আমাদের সেগুলি সামান্য সামঞ্জস্য করা উচিত, এবং নতুন মান দিয়ে সম্পূর্ণভাবে ওভাররাইট করা উচিত নয়।
+
+- **epsilon বৃদ্ধি করা**। আমরা `epsilon` ধীরে ধীরে বাড়াতে চাইতে পারি, যাতে কম এক্সপ্লোর করি এবং বেশি এক্সপ্লয়ট করি। এটি সম্ভবত কম `epsilon` মান দিয়ে শুরু করা এবং প্রায় 1 পর্যন্ত বাড়ানো বুদ্ধিমানের কাজ।
+> **টাস্ক ১**: হাইপারপ্যারামিটার মানগুলোর সাথে পরীক্ষা করুন এবং দেখুন আপনি কি উচ্চতর সামগ্রিক পুরস্কার অর্জন করতে পারেন। আপনি কি ১৯৫ এর উপরে পাচ্ছেন?
+> **টাস্ক ২**: সমস্যাটি আনুষ্ঠানিকভাবে সমাধান করতে, আপনাকে ১০০টি ধারাবাহিক রান জুড়ে ১৯৫ গড় পুরস্কার অর্জন করতে হবে। প্রশিক্ষণের সময় এটি পরিমাপ করুন এবং নিশ্চিত করুন যে আপনি সমস্যাটি আনুষ্ঠানিকভাবে সমাধান করেছেন!
+
+## ফলাফল কার্যকরভাবে দেখা
+
+প্রশিক্ষিত মডেলটি কীভাবে আচরণ করে তা আসলে দেখা বেশ আকর্ষণীয় হবে। চলুন সিমুলেশন চালাই এবং প্রশিক্ষণের সময় ব্যবহৃত একই অ্যাকশন নির্বাচন কৌশল অনুসরণ করি, Q-টেবিলের প্রোবাবিলিটি ডিস্ট্রিবিউশন অনুযায়ী স্যাম্পলিং করি: (কোড ব্লক ১৩)
+
+```python
+obs = env.reset()
+done = False
+while not done:
+ s = discretize(obs)
+ env.render()
+ v = probs(np.array(qvalues(s)))
+ a = random.choices(actions,weights=v)[0]
+ obs,_,done,_ = env.step(a)
+env.close()
+```
+
+আপনার কিছুটা এরকম দেখতে পাওয়া উচিত:
+
+
+
+---
+
+## 🚀চ্যালেঞ্জ
+
+> **টাস্ক ৩**: এখানে আমরা Q-টেবিলের চূড়ান্ত কপি ব্যবহার করছিলাম, যা হয়তো সেরা নাও হতে পারে। মনে রাখবেন যে আমরা সেরা পারফর্মিং Q-টেবিলটি `Qbest` ভেরিয়েবলে সংরক্ষণ করেছি! `Qbest`-কে `Q`-তে কপি করে একই উদাহরণটি চেষ্টা করুন এবং দেখুন কোনো পার্থক্য লক্ষ্য করেন কিনা।
+
+> **টাস্ক ৪**: এখানে আমরা প্রতিটি ধাপে সেরা অ্যাকশন নির্বাচন করছিলাম না, বরং সংশ্লিষ্ট প্রোবাবিলিটি ডিস্ট্রিবিউশন দিয়ে স্যাম্পলিং করছিলাম। সর্বোচ্চ Q-টেবিল মানের সাথে সর্বদা সেরা অ্যাকশন নির্বাচন করা কি আরও যৌক্তিক হবে? এটি `np.argmax` ফাংশন ব্যবহার করে করা যেতে পারে, যা সর্বোচ্চ Q-টেবিল মানের সাথে সম্পর্কিত অ্যাকশন নম্বর খুঁজে বের করে। এই কৌশলটি বাস্তবায়ন করুন এবং দেখুন এটি ব্যালেন্সিং উন্নত করে কিনা।
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/48/)
+
+## অ্যাসাইনমেন্ট
+[একটি মাউন্টেন কার প্রশিক্ষণ দিন](assignment.md)
+
+## উপসংহার
+
+আমরা এখন শিখেছি কীভাবে এজেন্টদের প্রশিক্ষণ দিয়ে ভালো ফলাফল অর্জন করা যায়, শুধুমাত্র একটি রিওয়ার্ড ফাংশন প্রদান করে যা গেমের কাঙ্ক্ষিত অবস্থা সংজ্ঞায়িত করে এবং তাদের বুদ্ধিমত্তার সাথে সার্চ স্পেস অন্বেষণ করার সুযোগ দিয়ে। আমরা সফলভাবে Q-লার্নিং অ্যালগরিদম প্রয়োগ করেছি ডিসক্রিট এবং কন্টিনিউয়াস এনভায়রনমেন্টের ক্ষেত্রে, তবে ডিসক্রিট অ্যাকশন সহ।
+
+এটি অধ্যয়ন করাও গুরুত্বপূর্ণ যে এমন পরিস্থিতি যেখানে অ্যাকশন স্টেট কন্টিনিউয়াস এবং অবজারভেশন স্পেস আরও জটিল, যেমন অ্যাটারি গেম স্ক্রিনের ছবি। এই ধরনের সমস্যায় প্রায়ই আরও শক্তিশালী মেশিন লার্নিং কৌশল, যেমন নিউরাল নেটওয়ার্ক, ব্যবহার করতে হয় ভালো ফলাফল অর্জনের জন্য। এই আরও উন্নত বিষয়গুলো আমাদের আসন্ন উন্নত AI কোর্সের বিষয়।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/2-Gym/assignment.md b/translations/bn/8-Reinforcement/2-Gym/assignment.md
new file mode 100644
index 000000000..43fd5e718
--- /dev/null
+++ b/translations/bn/8-Reinforcement/2-Gym/assignment.md
@@ -0,0 +1,55 @@
+
+# ট্রেন মাউন্টেন কার
+
+[OpenAI Gym](http://gym.openai.com) এমনভাবে ডিজাইন করা হয়েছে যাতে সব পরিবেশ একই API প্রদান করে - অর্থাৎ একই `reset`, `step` এবং `render` মেথড, এবং **action space** এবং **observation space** এর একই বিমূর্ততা। তাই একই রিইনফোর্সমেন্ট লার্নিং অ্যালগরিদমকে বিভিন্ন পরিবেশে সামান্য কোড পরিবর্তনের মাধ্যমে মানিয়ে নেওয়া সম্ভব।
+
+## একটি মাউন্টেন কার পরিবেশ
+
+[Mountain Car environment](https://gym.openai.com/envs/MountainCar-v0/) এ একটি গাড়ি একটি উপত্যকায় আটকে আছে:
+
+উদ্দেশ্য হলো উপত্যকা থেকে বেরিয়ে পতাকা দখল করা, প্রতিটি ধাপে নিম্নলিখিত কাজগুলোর মধ্যে একটি করে:
+
+| মান | অর্থ |
+|---|---|
+| 0 | বামে ত্বরান্বিত করুন |
+| 1 | ত্বরান্বিত করবেন না |
+| 2 | ডানে ত্বরান্বিত করুন |
+
+তবে, এই সমস্যার প্রধান কৌশল হলো গাড়ির ইঞ্জিন একবারে পাহাড়ে উঠার জন্য যথেষ্ট শক্তিশালী নয়। তাই সফল হওয়ার একমাত্র উপায় হলো গাড়িটিকে বারবার সামনে-পেছনে চালিয়ে গতি তৈরি করা।
+
+Observation space শুধুমাত্র দুটি মান নিয়ে গঠিত:
+
+| নম্বর | পর্যবেক্ষণ | সর্বনিম্ন | সর্বাধিক |
+|-----|--------------|-----|-----|
+| 0 | গাড়ির অবস্থান | -1.2 | 0.6 |
+| 1 | গাড়ির গতি | -0.07 | 0.07 |
+
+মাউন্টেন কারের জন্য পুরস্কার ব্যবস্থা বেশ জটিল:
+
+ * যদি এজেন্ট পতাকা (অবস্থান = 0.5) পাহাড়ের চূড়ায় পৌঁছায়, তাহলে 0 পুরস্কার দেওয়া হয়।
+ * যদি এজেন্টের অবস্থান 0.5 এর কম হয়, তাহলে -1 পুরস্কার দেওয়া হয়।
+
+পর্ব শেষ হয় যদি গাড়ির অবস্থান 0.5 এর বেশি হয়, অথবা পর্বের দৈর্ঘ্য 200 এর বেশি হয়।
+## নির্দেশনা
+
+আমাদের রিইনফোর্সমেন্ট লার্নিং অ্যালগরিদমকে মাউন্টেন কার সমস্যার সমাধানের জন্য মানিয়ে নিন। বিদ্যমান [notebook.ipynb](notebook.ipynb) কোড দিয়ে শুরু করুন, নতুন পরিবেশ প্রতিস্থাপন করুন, state discretization ফাংশন পরিবর্তন করুন, এবং বিদ্যমান অ্যালগরিদমকে সামান্য কোড পরিবর্তনের মাধ্যমে প্রশিক্ষণ দেওয়ার চেষ্টা করুন। হাইপারপ্যারামিটার সমন্বয় করে ফলাফল অপ্টিমাইজ করুন।
+
+> **Note**: অ্যালগরিদমকে সঠিকভাবে কাজ করানোর জন্য হাইপারপ্যারামিটার সমন্বয় প্রয়োজন হতে পারে।
+## মূল্যায়ন
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | --------- | -------- | ----------------- |
+| | Q-Learning অ্যালগরিদম সফলভাবে CartPole উদাহরণ থেকে মানিয়ে নেওয়া হয়েছে, সামান্য কোড পরিবর্তনের মাধ্যমে, যা 200 ধাপের মধ্যে পতাকা দখল করার সমস্যার সমাধান করতে সক্ষম। | একটি নতুন Q-Learning অ্যালগরিদম ইন্টারনেট থেকে গ্রহণ করা হয়েছে, তবে এটি ভালোভাবে ডকুমেন্টেড; অথবা বিদ্যমান অ্যালগরিদম গ্রহণ করা হয়েছে, কিন্তু কাঙ্ক্ষিত ফলাফল অর্জন করতে পারেনি। | শিক্ষার্থী কোনো অ্যালগরিদম সফলভাবে গ্রহণ করতে পারেনি, তবে সমাধানের দিকে উল্লেখযোগ্য পদক্ষেপ নিয়েছে (state discretization, Q-Table ডেটা স্ট্রাকচার ইত্যাদি বাস্তবায়ন করেছে)। |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/2-Gym/notebook.ipynb b/translations/bn/8-Reinforcement/2-Gym/notebook.ipynb
new file mode 100644
index 000000000..c0bacc55a
--- /dev/null
+++ b/translations/bn/8-Reinforcement/2-Gym/notebook.ipynb
@@ -0,0 +1,394 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.4"
+ },
+ "orig_nbformat": 4,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.4 64-bit ('base': conda)"
+ },
+ "interpreter": {
+ "hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
+ },
+ "coopTranslator": {
+ "original_hash": "f22f8f3daed4b6d34648d1254763105b",
+ "translation_date": "2025-08-30T00:10:44+00:00",
+ "source_file": "8-Reinforcement/2-Gym/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [
+ "## কার্টপোল স্কেটিং\n",
+ "\n",
+ "> **সমস্যা**: যদি পিটারকে নেকড়ের কাছ থেকে পালাতে হয়, তাহলে তাকে নেকড়ের চেয়ে দ্রুত চলতে সক্ষম হতে হবে। আমরা দেখব কীভাবে পিটার স্কেটিং শিখতে পারে, বিশেষ করে, ভারসাম্য বজায় রাখতে, Q-Learning ব্যবহার করে।\n",
+ "\n",
+ "প্রথমে, জিম ইনস্টল করি এবং প্রয়োজনীয় লাইব্রেরিগুলো ইমপোর্ট করি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#code block 1"
+ ]
+ },
+ {
+ "source": [
+ "## একটি কার্টপোল পরিবেশ তৈরি করুন\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "#code block 2"
+ ],
+ "cell_type": "code",
+ "metadata": {},
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "source": [
+ "পরিবেশ কীভাবে কাজ করে তা দেখতে, চলুন ১০০ ধাপের জন্য একটি ছোট সিমুলেশন চালাই।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "#code block 3"
+ ],
+ "cell_type": "code",
+ "metadata": {},
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "source": [
+ "সিমুলেশনের সময়, আমাদের পর্যবেক্ষণগুলি পেতে হবে যাতে সিদ্ধান্ত নেওয়া যায় কীভাবে কাজ করতে হবে। প্রকৃতপক্ষে, `step` ফাংশন আমাদের বর্তমান পর্যবেক্ষণ, পুরস্কার ফাংশন এবং `done` ফ্ল্যাগ ফেরত দেয় যা নির্দেশ করে যে সিমুলেশন চালিয়ে যাওয়া অর্থপূর্ণ কিনা:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "#code block 4"
+ ],
+ "cell_type": "code",
+ "metadata": {},
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "source": [
+ "আমরা সেই সংখ্যাগুলোর সর্বনিম্ন এবং সর্বোচ্চ মান পেতে পারি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]\n[4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]\n"
+ ]
+ }
+ ],
+ "source": [
+ "#code block 5"
+ ]
+ },
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#code block 6"
+ ]
+ },
+ {
+ "source": [
+ "চলুন বিন ব্যবহার করে অন্যান্য বিচ্ছিন্নকরণ পদ্ধতি অন্বেষণ করি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Sample bins for interval (-5,5) with 10 bins\n [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.]\n"
+ ]
+ }
+ ],
+ "source": [
+ "#code block 7"
+ ]
+ },
+ {
+ "source": [
+ "এবার একটি সংক্ষিপ্ত সিমুলেশন চালাই এবং সেই বিচ্ছিন্ন পরিবেশের মানগুলি পর্যবেক্ষণ করি।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "(0, 0, -2, -2)\n(0, 1, -2, -5)\n(0, 2, -3, -8)\n(0, 3, -5, -11)\n(0, 3, -7, -14)\n(0, 4, -10, -17)\n(0, 3, -14, -15)\n(0, 3, -17, -12)\n(0, 3, -20, -16)\n(0, 4, -23, -19)\n"
+ ]
+ }
+ ],
+ "source": [
+ "#code block 8"
+ ]
+ },
+ {
+ "source": [
+ "## কিউ-টেবিলের গঠন\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#code block 9"
+ ]
+ },
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#code block 10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "0: 22.0, alpha=0.3, epsilon=0.9\n",
+ "5000: 70.1384, alpha=0.3, epsilon=0.9\n",
+ "10000: 121.8586, alpha=0.3, epsilon=0.9\n",
+ "15000: 149.6368, alpha=0.3, epsilon=0.9\n",
+ "20000: 168.2782, alpha=0.3, epsilon=0.9\n",
+ "25000: 196.7356, alpha=0.3, epsilon=0.9\n",
+ "30000: 220.7614, alpha=0.3, epsilon=0.9\n",
+ "35000: 233.2138, alpha=0.3, epsilon=0.9\n",
+ "40000: 248.22, alpha=0.3, epsilon=0.9\n",
+ "45000: 264.636, alpha=0.3, epsilon=0.9\n",
+ "50000: 276.926, alpha=0.3, epsilon=0.9\n",
+ "55000: 277.9438, alpha=0.3, epsilon=0.9\n",
+ "60000: 248.881, alpha=0.3, epsilon=0.9\n",
+ "65000: 272.529, alpha=0.3, epsilon=0.9\n",
+ "70000: 281.7972, alpha=0.3, epsilon=0.9\n",
+ "75000: 284.2844, alpha=0.3, epsilon=0.9\n",
+ "80000: 269.667, alpha=0.3, epsilon=0.9\n",
+ "85000: 273.8652, alpha=0.3, epsilon=0.9\n",
+ "90000: 278.2466, alpha=0.3, epsilon=0.9\n",
+ "95000: 269.1736, alpha=0.3, epsilon=0.9\n"
+ ]
+ }
+ ],
+ "source": [
+ "#code block 11"
+ ]
+ },
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 20
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\r\n\r\n\r\n\r\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "plt.plot(rewards)"
+ ]
+ },
+ {
+ "source": [
+ "এই গ্রাফ থেকে কিছু বলা সম্ভব নয়, কারণ স্টোকাস্টিক প্রশিক্ষণ প্রক্রিয়ার প্রকৃতির কারণে প্রশিক্ষণ সেশনের দৈর্ঘ্য ব্যাপকভাবে পরিবর্তিত হয়। এই গ্রাফটি আরও অর্থবহ করতে, আমরা পরীক্ষার সিরিজের উপর **চলমান গড়** গণনা করতে পারি, ধরুন ১০০। এটি সুবিধাজনকভাবে `np.convolve` ব্যবহার করে করা যেতে পারে:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 22
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\r\n\r\n\r\n\r\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "#code block 12"
+ ]
+ },
+ {
+ "source": [
+ "## হাইপারপ্যারামিটার পরিবর্তন এবং ফলাফল পর্যবেক্ষণ\n",
+ "\n",
+ "এখন এটি দেখতে আকর্ষণীয় হবে যে প্রশিক্ষিত মডেলটি কীভাবে আচরণ করে। চলুন সিমুলেশন চালাই, এবং আমরা প্রশিক্ষণের সময় ব্যবহৃত একই অ্যাকশন নির্বাচন কৌশল অনুসরণ করব: Q-টেবিলের প্রোবাবিলিটি ডিস্ট্রিবিউশন অনুযায়ী স্যাম্পলিং করা:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# code block 13"
+ ]
+ },
+ {
+ "source": [
+ "## ফলাফল একটি অ্যানিমেটেড GIF-এ সংরক্ষণ করা\n",
+ "\n",
+ "আপনি যদি আপনার বন্ধুদের মুগ্ধ করতে চান, তাহলে আপনি ব্যালেন্সিং পোলের অ্যানিমেটেড GIF ছবি পাঠাতে পারেন। এটি করতে, আমরা `env.render` ব্যবহার করে একটি ইমেজ ফ্রেম তৈরি করতে পারি এবং তারপর সেগুলো PIL লাইব্রেরি ব্যবহার করে অ্যানিমেটেড GIF-এ সংরক্ষণ করতে পারি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "360\n"
+ ]
+ }
+ ],
+ "source": [
+ "from PIL import Image\n",
+ "obs = env.reset()\n",
+ "done = False\n",
+ "i=0\n",
+ "ims = []\n",
+ "while not done:\n",
+ " s = discretize(obs)\n",
+ " img=env.render(mode='rgb_array')\n",
+ " ims.append(Image.fromarray(img))\n",
+ " v = probs(np.array([Qbest.get((s,a),0) for a in actions]))\n",
+ " a = random.choices(actions,weights=v)[0]\n",
+ " obs,_,done,_ = env.step(a)\n",
+ " i+=1\n",
+ "env.close()\n",
+ "ims[0].save('images/cartpole-balance.gif',save_all=True,append_images=ims[1::2],loop=0,duration=5)\n",
+ "print(i)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/2-Gym/solution/Julia/README.md b/translations/bn/8-Reinforcement/2-Gym/solution/Julia/README.md
new file mode 100644
index 000000000..6ecdf80b8
--- /dev/null
+++ b/translations/bn/8-Reinforcement/2-Gym/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/2-Gym/solution/R/README.md b/translations/bn/8-Reinforcement/2-Gym/solution/R/README.md
new file mode 100644
index 000000000..33e0297e5
--- /dev/null
+++ b/translations/bn/8-Reinforcement/2-Gym/solution/R/README.md
@@ -0,0 +1,15 @@
+
+এটি একটি অস্থায়ী প্লেসহোল্ডার
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/2-Gym/solution/notebook.ipynb b/translations/bn/8-Reinforcement/2-Gym/solution/notebook.ipynb
new file mode 100644
index 000000000..21dcb8cb3
--- /dev/null
+++ b/translations/bn/8-Reinforcement/2-Gym/solution/notebook.ipynb
@@ -0,0 +1,526 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 4,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ },
+ "coopTranslator": {
+ "original_hash": "5c0e485e58d63c506f1791c4dbf990ce",
+ "translation_date": "2025-08-30T00:12:53+00:00",
+ "source_file": "8-Reinforcement/2-Gym/solution/notebook.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [
+ "## কার্টপোল স্কেটিং\n",
+ "\n",
+ "> **সমস্যা**: যদি পিটারকে নেকড়ের কাছ থেকে পালাতে হয়, তাহলে তাকে নেকড়ের চেয়ে দ্রুত চলতে হবে। আমরা দেখব কীভাবে পিটার স্কেটিং শিখতে পারে, বিশেষ করে, ভারসাম্য বজায় রাখতে, Q-Learning ব্যবহার করে।\n",
+ "\n",
+ "প্রথমে, জিম ইনস্টল করি এবং প্রয়োজনীয় লাইব্রেরিগুলো ইমপোর্ট করি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Requirement already satisfied: gym in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (0.18.3)\n",
+ "Requirement already satisfied: Pillow<=8.2.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (7.0.0)\n",
+ "Requirement already satisfied: scipy in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (1.4.1)\n",
+ "Requirement already satisfied: numpy>=1.10.4 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (1.19.2)\n",
+ "Requirement already satisfied: cloudpickle<1.7.0,>=1.2.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (1.6.0)\n",
+ "Requirement already satisfied: pyglet<=1.5.15,>=1.4.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from gym) (1.5.15)\n",
+ "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
+ "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n"
+ ]
+ }
+ ],
+ "source": [
+ "import sys\n",
+ "!pip install gym \n",
+ "\n",
+ "import gym\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import random"
+ ]
+ },
+ {
+ "source": [
+ "## একটি কার্টপোল পরিবেশ তৈরি করুন\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "env = gym.make(\"CartPole-v1\")\n",
+ "print(env.action_space)\n",
+ "print(env.observation_space)\n",
+ "print(env.action_space.sample())"
+ ],
+ "cell_type": "code",
+ "metadata": {},
+ "execution_count": 2,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Discrete(2)\nBox(-3.4028234663852886e+38, 3.4028234663852886e+38, (4,), float32)\n0\n"
+ ]
+ }
+ ]
+ },
+ {
+ "source": [
+ "পরিবেশ কীভাবে কাজ করে তা দেখতে, চলুন ১০০ ধাপের জন্য একটি ছোট সিমুলেশন চালাই।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "env.reset()\n",
+ "\n",
+ "for i in range(100):\n",
+ " env.render()\n",
+ " env.step(env.action_space.sample())\n",
+ "env.close()"
+ ],
+ "cell_type": "code",
+ "metadata": {},
+ "execution_count": 3,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/gym/logger.py:30: UserWarning: \u001b[33mWARN: You are calling 'step()' even though this environment has already returned done = True. You should always call 'reset()' once you receive 'done = True' -- any further steps are undefined behavior.\u001b[0m\n warnings.warn(colorize('%s: %s'%('WARN', msg % args), 'yellow'))\n"
+ ]
+ }
+ ]
+ },
+ {
+ "source": [
+ "সিমুলেশনের সময়, আমাদের পর্যবেক্ষণগুলি পেতে হবে যাতে আমরা কীভাবে কাজ করব তা নির্ধারণ করতে পারি। প্রকৃতপক্ষে, `step` ফাংশন আমাদের বর্তমান পর্যবেক্ষণ, পুরস্কার ফাংশন, এবং `done` ফ্ল্যাগ ফেরত দেয় যা নির্দেশ করে যে সিমুলেশন চালিয়ে যাওয়া যৌক্তিক কিনা:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "env.reset()\n",
+ "\n",
+ "done = False\n",
+ "while not done:\n",
+ " env.render()\n",
+ " obs, rew, done, info = env.step(env.action_space.sample())\n",
+ " print(f\"{obs} -> {rew}\")\n",
+ "env.close()"
+ ],
+ "cell_type": "code",
+ "metadata": {},
+ "execution_count": 4,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[ 0.03044442 -0.19543914 -0.04496216 0.28125618] -> 1.0\n",
+ "[ 0.02653564 -0.38989186 -0.03933704 0.55942606] -> 1.0\n",
+ "[ 0.0187378 -0.19424049 -0.02814852 0.25461393] -> 1.0\n",
+ "[ 0.01485299 -0.38894946 -0.02305624 0.53828712] -> 1.0\n",
+ "[ 0.007074 -0.19351108 -0.0122905 0.23842953] -> 1.0\n",
+ "[ 0.00320378 0.00178427 -0.00752191 -0.05810469] -> 1.0\n",
+ "[ 0.00323946 0.19701326 -0.008684 -0.35315131] -> 1.0\n",
+ "[ 0.00717973 0.00201587 -0.01574703 -0.06321931] -> 1.0\n",
+ "[ 0.00722005 0.19736001 -0.01701141 -0.36082863] -> 1.0\n",
+ "[ 0.01116725 0.39271958 -0.02422798 -0.65882671] -> 1.0\n",
+ "[ 0.01902164 0.19794307 -0.03740452 -0.37387001] -> 1.0\n",
+ "[ 0.0229805 0.39357584 -0.04488192 -0.67810827] -> 1.0\n",
+ "[ 0.03085202 0.58929164 -0.05844408 -0.98457719] -> 1.0\n",
+ "[ 0.04263785 0.78514572 -0.07813563 -1.2950295 ] -> 1.0\n",
+ "[ 0.05834076 0.98116859 -0.10403622 -1.61111521] -> 1.0\n",
+ "[ 0.07796413 0.78741784 -0.13625852 -1.35259196] -> 1.0\n",
+ "[ 0.09371249 0.98396202 -0.16331036 -1.68461179] -> 1.0\n",
+ "[ 0.11339173 0.79106371 -0.1970026 -1.44691436] -> 1.0\n",
+ "[ 0.12921301 0.59883361 -0.22594088 -1.22169133] -> 1.0\n"
+ ]
+ }
+ ]
+ },
+ {
+ "source": [
+ "আমরা সেই সংখ্যাগুলোর সর্বনিম্ন এবং সর্বাধিক মান পেতে পারি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]\n[4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(env.observation_space.low)\n",
+ "print(env.observation_space.high)"
+ ]
+ },
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def discretize(x):\n",
+ " return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))"
+ ]
+ },
+ {
+ "source": [
+ "চলুন বিন ব্যবহার করে অন্যান্য বিচ্ছিন্নকরণ পদ্ধতি অন্বেষণ করি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Sample bins for interval (-5,5) with 10 bins\n [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.]\n"
+ ]
+ }
+ ],
+ "source": [
+ "def create_bins(i,num):\n",
+ " return np.arange(num+1)*(i[1]-i[0])/num+i[0]\n",
+ "\n",
+ "print(\"Sample bins for interval (-5,5) with 10 bins\\n\",create_bins((-5,5),10))\n",
+ "\n",
+ "ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervals of values for each parameter\n",
+ "nbins = [20,20,10,10] # number of bins for each parameter\n",
+ "bins = [create_bins(ints[i],nbins[i]) for i in range(4)]\n",
+ "\n",
+ "def discretize_bins(x):\n",
+ " return tuple(np.digitize(x[i],bins[i]) for i in range(4))"
+ ]
+ },
+ {
+ "source": [
+ "এবার একটি সংক্ষিপ্ত সিমুলেশন চালাই এবং সেই বিচ্ছিন্ন পরিবেশের মানগুলো পর্যবেক্ষণ করি।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "(0, 0, -1, -3)\n(0, 0, -2, 0)\n(0, 0, -2, -3)\n(0, 1, -3, -6)\n(0, 2, -4, -9)\n(0, 3, -6, -12)\n(0, 2, -8, -9)\n(0, 3, -10, -13)\n(0, 4, -13, -16)\n(0, 4, -16, -19)\n(0, 4, -20, -17)\n(0, 4, -24, -20)\n"
+ ]
+ }
+ ],
+ "source": [
+ "env.reset()\n",
+ "\n",
+ "done = False\n",
+ "while not done:\n",
+ " #env.render()\n",
+ " obs, rew, done, info = env.step(env.action_space.sample())\n",
+ " #print(discretize_bins(obs))\n",
+ " print(discretize(obs))\n",
+ "env.close()"
+ ]
+ },
+ {
+ "source": [
+ "## কিউ-টেবিলের গঠন\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q = {}\n",
+ "actions = (0,1)\n",
+ "\n",
+ "def qvalues(state):\n",
+ " return [Q.get((state,a),0) for a in actions]"
+ ]
+ },
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# hyperparameters\n",
+ "alpha = 0.3\n",
+ "gamma = 0.9\n",
+ "epsilon = 0.90"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "0: 108.0, alpha=0.3, epsilon=0.9\n"
+ ]
+ }
+ ],
+ "source": [
+ "def probs(v,eps=1e-4):\n",
+ " v = v-v.min()+eps\n",
+ " v = v/v.sum()\n",
+ " return v\n",
+ "\n",
+ "Qmax = 0\n",
+ "cum_rewards = []\n",
+ "rewards = []\n",
+ "for epoch in range(100000):\n",
+ " obs = env.reset()\n",
+ " done = False\n",
+ " cum_reward=0\n",
+ " # == do the simulation ==\n",
+ " while not done:\n",
+ " s = discretize(obs)\n",
+ " if random.random() Qmax:\n",
+ " Qmax = np.average(cum_rewards)\n",
+ " Qbest = Q\n",
+ " cum_rewards=[]"
+ ]
+ },
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 20
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\r\n\r\n\r\n\r\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "plt.plot(rewards)"
+ ]
+ },
+ {
+ "source": [
+ "এই গ্রাফ থেকে কিছু বলা সম্ভব নয়, কারণ স্টোকাস্টিক প্রশিক্ষণ প্রক্রিয়ার প্রকৃতির কারণে প্রশিক্ষণ সেশনের দৈর্ঘ্য ব্যাপকভাবে পরিবর্তিত হয়। এই গ্রাফটি আরও অর্থবহ করতে, আমরা পরীক্ষার সিরিজের উপর **চলমান গড়** গণনা করতে পারি, ধরুন ১০০। এটি সুবিধাজনকভাবে `np.convolve` ব্যবহার করে করা যেতে পারে:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 22
+ },
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": "
",
+ "image/svg+xml": "\r\n\r\n\r\n\r\n",
+ "image/png": "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\n"
+ },
+ "metadata": {
+ "needs_background": "light"
+ }
+ }
+ ],
+ "source": [
+ "def running_average(x,window):\n",
+ " return np.convolve(x,np.ones(window)/window,mode='valid')\n",
+ "\n",
+ "plt.plot(running_average(rewards,100))"
+ ]
+ },
+ {
+ "source": [
+ "## হাইপারপ্যারামিটার পরিবর্তন এবং ফলাফল পর্যবেক্ষণ\n",
+ "\n",
+ "এখন প্রশিক্ষিত মডেলটি কীভাবে আচরণ করে তা বাস্তবে দেখা বেশ আকর্ষণীয় হবে। চলুন সিমুলেশন চালাই, এবং আমরা প্রশিক্ষণের সময় ব্যবহৃত একই অ্যাকশন নির্বাচন কৌশল অনুসরণ করব: Q-টেবিলের প্রোবাবিলিটি ডিস্ট্রিবিউশন অনুযায়ী স্যাম্পলিং।\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "obs = env.reset()\n",
+ "done = False\n",
+ "while not done:\n",
+ " s = discretize(obs)\n",
+ " env.render()\n",
+ " v = probs(np.array(qvalues(s)))\n",
+ " a = random.choices(actions,weights=v)[0]\n",
+ " obs,_,done,_ = env.step(a)\n",
+ "env.close()"
+ ]
+ },
+ {
+ "source": [
+ "## ফলাফল একটি অ্যানিমেটেড GIF-এ সংরক্ষণ করা\n",
+ "\n",
+ "আপনি যদি আপনার বন্ধুদের মুগ্ধ করতে চান, তাহলে আপনি ব্যালেন্সিং পোলের অ্যানিমেটেড GIF ছবি পাঠাতে পারেন। এটি করতে, আমরা `env.render` ব্যবহার করে একটি ইমেজ ফ্রেম তৈরি করতে পারি এবং তারপর সেগুলো PIL লাইব্রেরি ব্যবহার করে অ্যানিমেটেড GIF-এ সংরক্ষণ করতে পারি:\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "360\n"
+ ]
+ }
+ ],
+ "source": [
+ "from PIL import Image\n",
+ "obs = env.reset()\n",
+ "done = False\n",
+ "i=0\n",
+ "ims = []\n",
+ "while not done:\n",
+ " s = discretize(obs)\n",
+ " img=env.render(mode='rgb_array')\n",
+ " ims.append(Image.fromarray(img))\n",
+ " v = probs(np.array([Qbest.get((s,a),0) for a in actions]))\n",
+ " a = random.choices(actions,weights=v)[0]\n",
+ " obs,_,done,_ = env.step(a)\n",
+ " i+=1\n",
+ "env.close()\n",
+ "ims[0].save('images/cartpole-balance.gif',save_all=True,append_images=ims[1::2],loop=0,duration=5)\n",
+ "print(i)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/8-Reinforcement/README.md b/translations/bn/8-Reinforcement/README.md
new file mode 100644
index 000000000..6466602c6
--- /dev/null
+++ b/translations/bn/8-Reinforcement/README.md
@@ -0,0 +1,67 @@
+
+# রিইনফোর্সমেন্ট লার্নিং-এর পরিচিতি
+
+রিইনফোর্সমেন্ট লার্নিং, RL, সুপারভাইজড লার্নিং এবং আনসুপারভাইজড লার্নিং-এর পাশাপাশি অন্যতম মৌলিক মেশিন লার্নিং প্যারাডাইম হিসেবে বিবেচিত হয়। RL মূলত সিদ্ধান্ত গ্রহণের উপর ভিত্তি করে: সঠিক সিদ্ধান্ত প্রদান করা বা অন্তত সেগুলো থেকে শেখা।
+
+ধরুন আপনার কাছে একটি সিমুলেটেড পরিবেশ আছে, যেমন শেয়ার বাজার। যদি আপনি একটি নির্দিষ্ট নিয়ম আরোপ করেন, তাহলে কী ঘটে? এর ইতিবাচক বা নেতিবাচক প্রভাব কি? যদি কিছু নেতিবাচক ঘটে, তাহলে আপনাকে এই _নেতিবাচক রিইনফোর্সমেন্ট_ থেকে শিখতে হবে এবং পথ পরিবর্তন করতে হবে। যদি এটি ইতিবাচক ফলাফল হয়, তাহলে আপনাকে সেই _ইতিবাচক রিইনফোর্সমেন্ট_ এর উপর ভিত্তি করে এগিয়ে যেতে হবে।
+
+
+
+> পিটার এবং তার বন্ধুরা ক্ষুধার্ত নেকড়ের হাত থেকে পালাতে হবে! ছবি: [জেন লুপার](https://twitter.com/jenlooper)
+
+## আঞ্চলিক বিষয়: পিটার এবং নেকড়ে (রাশিয়া)
+
+[পিটার এবং নেকড়ে](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) একটি সঙ্গীতধর্মী রূপকথা, যা রাশিয়ান সুরকার [সের্গেই প্রোকোফিয়েভ](https://en.wikipedia.org/wiki/Sergei_Prokofiev) লিখেছেন। এটি তরুণ পায়োনিয়ার পিটারের গল্প, যে সাহসিকতার সাথে তার বাড়ি থেকে বেরিয়ে বনাঞ্চলে নেকড়েকে তাড়ানোর জন্য যায়। এই অংশে, আমরা মেশিন লার্নিং অ্যালগরিদম প্রশিক্ষণ দেব যা পিটারকে সাহায্য করবে:
+
+- **অন্বেষণ**: আশেপাশের এলাকা পর্যবেক্ষণ করে একটি সর্বোত্তম নেভিগেশন মানচিত্র তৈরি করা।
+- **শেখা**: স্কেটবোর্ড ব্যবহার করা এবং এর উপর ভারসাম্য বজায় রাখা, যাতে দ্রুত চলাচল করা যায়।
+
+[](https://www.youtube.com/watch?v=Fmi5zHg4QSM)
+
+> 🎥 উপরের ছবিতে ক্লিক করে প্রোকোফিয়েভের "পিটার এবং নেকড়ে" শুনুন
+
+## রিইনফোর্সমেন্ট লার্নিং
+
+পূর্ববর্তী অংশগুলোতে, আপনি মেশিন লার্নিং সমস্যার দুটি উদাহরণ দেখেছেন:
+
+- **সুপারভাইজড**, যেখানে আমাদের কাছে ডেটাসেট থাকে যা সমস্যার সমাধানের নমুনা সমাধান প্রস্তাব করে। [ক্লাসিফিকেশন](../4-Classification/README.md) এবং [রিগ্রেশন](../2-Regression/README.md) সুপারভাইজড লার্নিং টাস্ক।
+- **আনসুপারভাইজড**, যেখানে আমাদের কাছে লেবেলযুক্ত প্রশিক্ষণ ডেটা থাকে না। আনসুপারভাইজড লার্নিং-এর প্রধান উদাহরণ হলো [ক্লাস্টারিং](../5-Clustering/README.md)।
+
+এই অংশে, আমরা আপনাকে একটি নতুন ধরনের লার্নিং সমস্যার সাথে পরিচয় করিয়ে দেব, যা লেবেলযুক্ত প্রশিক্ষণ ডেটার প্রয়োজন হয় না। এই ধরনের সমস্যার কয়েকটি ধরন রয়েছে:
+
+- **[সেমি-সুপারভাইজড লার্নিং](https://wikipedia.org/wiki/Semi-supervised_learning)**, যেখানে আমাদের কাছে প্রচুর অ-লেবেলযুক্ত ডেটা থাকে যা মডেল প্রি-ট্রেন করার জন্য ব্যবহার করা যেতে পারে।
+- **[রিইনফোর্সমেন্ট লার্নিং](https://wikipedia.org/wiki/Reinforcement_learning)**, যেখানে একটি এজেন্ট সিমুলেটেড পরিবেশে পরীক্ষা চালিয়ে কীভাবে আচরণ করতে হয় তা শেখে।
+
+### উদাহরণ - কম্পিউটার গেম
+
+ধরুন আপনি একটি কম্পিউটারকে গেম খেলতে শেখাতে চান, যেমন দাবা বা [সুপার মারিও](https://wikipedia.org/wiki/Super_Mario)। কম্পিউটারকে গেম খেলতে শেখানোর জন্য, আমাদের প্রয়োজন যে এটি প্রতিটি গেম স্টেটে কোন পদক্ষেপ নিতে হবে তা পূর্বাভাস দিতে পারে। যদিও এটি একটি ক্লাসিফিকেশন সমস্যার মতো মনে হতে পারে, এটি আসলে নয় - কারণ আমাদের কাছে স্টেট এবং সংশ্লিষ্ট অ্যাকশন সহ ডেটাসেট নেই। যদিও আমাদের কাছে কিছু ডেটা থাকতে পারে, যেমন বিদ্যমান দাবা ম্যাচ বা সুপার মারিও খেলার রেকর্ডিং, এটি সম্ভবত পর্যাপ্ত সংখ্যক সম্ভাব্য স্টেট কভার করবে না।
+
+বিদ্যমান গেম ডেটা খোঁজার পরিবর্তে, **রিইনফোর্সমেন্ট লার্নিং** (RL) এর ধারণা হলো *কম্পিউটারকে বারবার গেম খেলতে দেওয়া* এবং ফলাফল পর্যবেক্ষণ করা। তাই রিইনফোর্সমেন্ট লার্নিং প্রয়োগ করতে আমাদের দুটি জিনিস প্রয়োজন:
+
+- **একটি পরিবেশ** এবং **একটি সিমুলেটর**, যা আমাদের গেমটি বারবার খেলতে দেয়। এই সিমুলেটর গেমের সমস্ত নিয়ম, সম্ভাব্য স্টেট এবং অ্যাকশন সংজ্ঞায়িত করবে।
+
+- **একটি রিওয়ার্ড ফাংশন**, যা আমাদের জানাবে প্রতিটি পদক্ষেপ বা গেমে আমরা কতটা ভালো করেছি।
+
+অন্যান্য মেশিন লার্নিং এবং RL-এর মধ্যে প্রধান পার্থক্য হলো RL-এ আমরা সাধারণত গেম শেষ না হওয়া পর্যন্ত জানি না যে আমরা জিতেছি বা হেরেছি। তাই আমরা বলতে পারি না যে একটি নির্দিষ্ট পদক্ষেপ একাই ভালো বা খারাপ - আমরা শুধুমাত্র গেমের শেষে একটি রিওয়ার্ড পাই। এবং আমাদের লক্ষ্য হলো এমন অ্যালগরিদম ডিজাইন করা যা অনিশ্চিত পরিস্থিতিতে একটি মডেল প্রশিক্ষণ দিতে পারে। আমরা **Q-learning** নামে একটি RL অ্যালগরিদম সম্পর্কে শিখব।
+
+## পাঠসমূহ
+
+1. [রিইনফোর্সমেন্ট লার্নিং এবং Q-Learning-এর পরিচিতি](1-QLearning/README.md)
+2. [জিম সিমুলেশন পরিবেশ ব্যবহার করা](2-Gym/README.md)
+
+## ক্রেডিট
+
+"রিইনফোর্সমেন্ট লার্নিং-এর পরিচিতি" ♥️ দিয়ে লিখেছেন [দিমিত্রি সশনিকভ](http://soshnikov.com)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/9-Real-World/1-Applications/README.md b/translations/bn/9-Real-World/1-Applications/README.md
new file mode 100644
index 000000000..9d0c2eed8
--- /dev/null
+++ b/translations/bn/9-Real-World/1-Applications/README.md
@@ -0,0 +1,149 @@
+
+# পোস্টস্ক্রিপ্ট: বাস্তব জীবনে মেশিন লার্নিং
+
+
+> স্কেচনোট: [Tomomi Imura](https://www.twitter.com/girlie_mac)
+
+এই পাঠ্যক্রমে, আপনি ডেটা প্রশিক্ষণের জন্য প্রস্তুত করার এবং মেশিন লার্নিং মডেল তৈরি করার বিভিন্ন পদ্ধতি শিখেছেন। আপনি একাধিক ক্লাসিক রিগ্রেশন, ক্লাস্টারিং, ক্লাসিফিকেশন, প্রাকৃতিক ভাষা প্রক্রিয়াকরণ এবং টাইম সিরিজ মডেল তৈরি করেছেন। অভিনন্দন! এখন, আপনি হয়তো ভাবছেন, এই সবের উদ্দেশ্য কী... এই মডেলগুলোর বাস্তব জীবনে কী ব্যবহার রয়েছে?
+
+যদিও শিল্পে AI-এর প্রতি অনেক আগ্রহ দেখা গেছে, যা সাধারণত ডিপ লার্নিং ব্যবহার করে, তবুও ক্লাসিক্যাল মেশিন লার্নিং মডেলগুলোর মূল্যবান ব্যবহার রয়েছে। আপনি হয়তো আজই এই অ্যাপ্লিকেশনগুলোর কিছু ব্যবহার করছেন! এই পাঠে, আপনি দেখবেন কীভাবে আটটি ভিন্ন শিল্প এবং বিষয়-ভিত্তিক ক্ষেত্র এই ধরনের মডেল ব্যবহার করে তাদের অ্যাপ্লিকেশনগুলোকে আরও কার্যকর, নির্ভরযোগ্য, বুদ্ধিমান এবং ব্যবহারকারীদের জন্য মূল্যবান করে তোলে।
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/49/)
+
+## 💰 ফাইন্যান্স
+
+ফাইন্যান্স সেক্টরে মেশিন লার্নিং-এর জন্য অনেক সুযোগ রয়েছে। এই ক্ষেত্রের অনেক সমস্যাই মডেলিং এবং সমাধানের জন্য মেশিন লার্নিং ব্যবহার উপযোগী।
+
+### ক্রেডিট কার্ড জালিয়াতি সনাক্তকরণ
+
+আমরা এই কোর্সে [k-means ক্লাস্টারিং](../../5-Clustering/2-K-Means/README.md) সম্পর্কে শিখেছি, কিন্তু এটি কীভাবে ক্রেডিট কার্ড জালিয়াতি সম্পর্কিত সমস্যাগুলো সমাধানে ব্যবহার করা যেতে পারে?
+
+k-means ক্লাস্টারিং একটি ক্রেডিট কার্ড জালিয়াতি সনাক্তকরণ কৌশল, যা **আউটলায়ার ডিটেকশন** নামে পরিচিত, এর সময় কাজে লাগে। আউটলায়ার বা ডেটার সেট সম্পর্কে পর্যবেক্ষণে বিচ্যুতি আমাদের জানাতে পারে যে একটি ক্রেডিট কার্ড স্বাভাবিকভাবে ব্যবহার করা হচ্ছে কিনা বা কিছু অস্বাভাবিক ঘটছে কিনা। নিচের লিঙ্কে দেওয়া পেপারে দেখানো হয়েছে, আপনি k-means ক্লাস্টারিং অ্যালগরিদম ব্যবহার করে ক্রেডিট কার্ড ডেটা সাজাতে পারেন এবং প্রতিটি লেনদেনকে একটি ক্লাস্টারে বরাদ্দ করতে পারেন এটি কতটা আউটলায়ার বলে মনে হয় তার উপর ভিত্তি করে। এরপর, আপনি জালিয়াতি বনাম বৈধ লেনদেনের জন্য সবচেয়ে ঝুঁকিপূর্ণ ক্লাস্টারগুলো মূল্যায়ন করতে পারেন।
+[রেফারেন্স](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf)
+
+### সম্পদ ব্যবস্থাপনা
+
+সম্পদ ব্যবস্থাপনার ক্ষেত্রে, একজন ব্যক্তি বা প্রতিষ্ঠান তাদের ক্লায়েন্টদের পক্ষ থেকে বিনিয়োগ পরিচালনা করে। তাদের কাজ হলো দীর্ঘমেয়াদে সম্পদ টিকিয়ে রাখা এবং বৃদ্ধি করা, তাই এমন বিনিয়োগ বেছে নেওয়া গুরুত্বপূর্ণ যা ভালো পারফর্ম করে।
+
+কোনো নির্দিষ্ট বিনিয়োগ কীভাবে পারফর্ম করে তা মূল্যায়নের একটি উপায় হলো পরিসংখ্যানগত রিগ্রেশন। [লিনিয়ার রিগ্রেশন](../../2-Regression/1-Tools/README.md) একটি মূল্যবান টুল যা বুঝতে সাহায্য করে একটি ফান্ড কোনো বেঞ্চমার্কের তুলনায় কীভাবে পারফর্ম করে। আমরা এটাও নির্ধারণ করতে পারি যে রিগ্রেশনের ফলাফল পরিসংখ্যানগতভাবে গুরুত্বপূর্ণ কিনা বা এটি ক্লায়েন্টের বিনিয়োগে কতটা প্রভাব ফেলবে। আপনি আরও বিশ্লেষণ করতে পারেন মাল্টিপল রিগ্রেশন ব্যবহার করে, যেখানে অতিরিক্ত ঝুঁকির কারণগুলো বিবেচনায় নেওয়া যেতে পারে। একটি নির্দিষ্ট ফান্ডের জন্য এটি কীভাবে কাজ করবে তার উদাহরণ দেখতে নিচের পেপারটি দেখুন।
+[রেফারেন্স](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/)
+
+## 🎓 শিক্ষা
+
+শিক্ষা ক্ষেত্রেও মেশিন লার্নিং প্রয়োগের জন্য একটি খুবই আকর্ষণীয় ক্ষেত্র। এখানে চমৎকার সমস্যাগুলো সমাধান করা যেতে পারে, যেমন পরীক্ষায় বা প্রবন্ধে প্রতারণা সনাক্ত করা বা সংশোধন প্রক্রিয়ায় পক্ষপাতিত্ব পরিচালনা করা।
+
+### শিক্ষার্থীর আচরণ পূর্বাভাস
+
+[Coursera](https://coursera.com), একটি অনলাইন ওপেন কোর্স প্রদানকারী, তাদের টেক ব্লগে অনেক ইঞ্জিনিয়ারিং সিদ্ধান্ত নিয়ে আলোচনা করে। এই কেস স্টাডিতে, তারা একটি রিগ্রেশন লাইন প্লট করেছে যাতে একটি নিম্ন NPS (Net Promoter Score) রেটিং এবং কোর্স ধরে রাখা বা ছেড়ে দেওয়ার মধ্যে কোনো সম্পর্ক রয়েছে কিনা তা অন্বেষণ করা যায়।
+[রেফারেন্স](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a)
+
+### পক্ষপাতিত্ব কমানো
+
+[Grammarly](https://grammarly.com), একটি লেখার সহকারী যা বানান এবং ব্যাকরণ ত্রুটি পরীক্ষা করে, তাদের পণ্যগুলোর মধ্যে উন্নত [প্রাকৃতিক ভাষা প্রক্রিয়াকরণ সিস্টেম](../../6-NLP/README.md) ব্যবহার করে। তাদের টেক ব্লগে একটি আকর্ষণীয় কেস স্টাডি প্রকাশিত হয়েছে যেখানে তারা মেশিন লার্নিং-এ লিঙ্গ পক্ষপাতিত্ব মোকাবিলা করেছে, যা আপনি আমাদের [প্রারম্ভিক ন্যায্যতা পাঠে](../../1-Introduction/3-fairness/README.md) শিখেছেন।
+[রেফারেন্স](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/)
+
+## 👜 খুচরা
+
+খুচরা সেক্টর অবশ্যই মেশিন লার্নিং-এর সুবিধা নিতে পারে, সবকিছু থেকে শুরু করে একটি ভালো গ্রাহক যাত্রা তৈরি করা থেকে শুরু করে ইনভেন্টরি অপ্টিমাইজ করার জন্য।
+
+### গ্রাহক যাত্রা ব্যক্তিগতকরণ
+
+Wayfair, একটি কোম্পানি যা আসবাবপত্রের মতো গৃহস্থালির সামগ্রী বিক্রি করে, গ্রাহকদের তাদের পছন্দ এবং প্রয়োজনের জন্য সঠিক পণ্য খুঁজে পেতে সাহায্য করা অত্যন্ত গুরুত্বপূর্ণ। এই নিবন্ধে, কোম্পানির ইঞ্জিনিয়াররা বর্ণনা করেছেন কীভাবে তারা ML এবং NLP ব্যবহার করে "গ্রাহকদের জন্য সঠিক ফলাফল তুলে ধরেন"। বিশেষভাবে, তাদের Query Intent Engine তৈরি করা হয়েছে গ্রাহক পর্যালোচনাগুলোর উপর সত্তা নিষ্কাশন, ক্লাসিফায়ার প্রশিক্ষণ, সম্পদ এবং মতামত নিষ্কাশন এবং অনুভূতি ট্যাগিং ব্যবহার করে। এটি অনলাইন খুচরা বিক্রিতে NLP কীভাবে কাজ করে তার একটি ক্লাসিক ব্যবহার।
+[রেফারেন্স](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search)
+
+### ইনভেন্টরি ব্যবস্থাপনা
+
+[StitchFix](https://stitchfix.com)-এর মতো উদ্ভাবনী, চটপটে কোম্পানিগুলো সুপারিশ এবং ইনভেন্টরি ব্যবস্থাপনার জন্য ব্যাপকভাবে ML-এর উপর নির্ভর করে। তাদের স্টাইলিং টিম এবং মার্চেন্ডাইজিং টিম একসঙ্গে কাজ করে, প্রকৃতপক্ষে: "আমাদের একজন ডেটা বিজ্ঞানী একটি জেনেটিক অ্যালগরিদম নিয়ে পরীক্ষা-নিরীক্ষা করেছেন এবং এটি পোশাকের ক্ষেত্রে প্রয়োগ করেছেন যাতে ভবিষ্যদ্বাণী করা যায় যে এমন একটি সফল পোশাকের টুকরো কী হতে পারে যা আজ বিদ্যমান নেই। আমরা এটি মার্চেন্ডাইজ টিমের কাছে নিয়ে এসেছি এবং এখন তারা এটি একটি টুল হিসেবে ব্যবহার করতে পারে।"
+[রেফারেন্স](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/)
+
+## 🏥 স্বাস্থ্যসেবা
+
+স্বাস্থ্যসেবা সেক্টর গবেষণা কাজগুলো অপ্টিমাইজ করতে এবং রোগীদের পুনরায় ভর্তি বা রোগের বিস্তার বন্ধ করার মতো লজিস্টিক সমস্যাগুলো সমাধানে ML ব্যবহার করতে পারে।
+
+### ক্লিনিকাল ট্রায়াল ব্যবস্থাপনা
+
+ক্লিনিকাল ট্রায়ালে বিষাক্ততা ড্রাগ নির্মাতাদের জন্য একটি বড় উদ্বেগ। কতটা বিষাক্ততা সহনীয়? এই গবেষণায়, বিভিন্ন ক্লিনিকাল ট্রায়াল পদ্ধতি বিশ্লেষণ করে ক্লিনিকাল ট্রায়ালের ফলাফলগুলোর সম্ভাবনা পূর্বাভাসের জন্য একটি নতুন পদ্ধতি তৈরি করা হয়েছে। বিশেষভাবে, তারা র্যান্ডম ফরেস্ট ব্যবহার করে একটি [ক্লাসিফায়ার](../../4-Classification/README.md) তৈরি করতে সক্ষম হয়েছে যা ড্রাগের গ্রুপগুলোর মধ্যে পার্থক্য করতে পারে।
+[রেফারেন্স](https://www.sciencedirect.com/science/article/pii/S2451945616302914)
+
+### হাসপাতাল পুনরায় ভর্তি ব্যবস্থাপনা
+
+হাসপাতাল যত্ন ব্যয়বহুল, বিশেষত যখন রোগীদের পুনরায় ভর্তি করতে হয়। এই পেপারটি একটি কোম্পানির আলোচনা করে যারা [ক্লাস্টারিং](../../5-Clustering/README.md) অ্যালগরিদম ব্যবহার করে পুনরায় ভর্তি সম্ভাবনা পূর্বাভাস দেয়। এই ক্লাস্টারগুলো বিশ্লেষকদের "পুনরায় ভর্তি গ্রুপগুলো আবিষ্কার করতে সাহায্য করে যা একটি সাধারণ কারণ ভাগ করতে পারে।"
+[রেফারেন্স](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning)
+
+### রোগ ব্যবস্থাপনা
+
+সম্প্রতি মহামারীটি দেখিয়েছে কীভাবে মেশিন লার্নিং রোগের বিস্তার বন্ধ করতে সাহায্য করতে পারে। এই নিবন্ধে, আপনি ARIMA, লজিস্টিক কার্ভ, লিনিয়ার রিগ্রেশন এবং SARIMA-এর ব্যবহার চিনতে পারবেন। "এই কাজটি এই ভাইরাসের বিস্তারের হার গণনা করার এবং মৃত্যুর হার, পুনরুদ্ধার এবং নিশ্চিত কেসগুলো পূর্বাভাস দেওয়ার একটি প্রচেষ্টা, যাতে এটি আমাদের আরও ভালোভাবে প্রস্তুত হতে এবং বেঁচে থাকতে সাহায্য করতে পারে।"
+[রেফারেন্স](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/)
+
+## 🌲 প্রকৃতি এবং সবুজ প্রযুক্তি
+
+প্রকৃতি এবং বাস্তুসংস্থান অনেক সংবেদনশীল সিস্টেম নিয়ে গঠিত যেখানে প্রাণী এবং প্রকৃতির মধ্যে আন্তঃক্রিয়া গুরুত্বপূর্ণ। এই সিস্টেমগুলো সঠিকভাবে পরিমাপ করা এবং কিছু ঘটলে যথাযথভাবে কাজ করা গুরুত্বপূর্ণ, যেমন একটি বন আগুন বা প্রাণীর জনসংখ্যার হ্রাস।
+
+### বন ব্যবস্থাপনা
+
+আপনি আগের পাঠে [রিইনফোর্সমেন্ট লার্নিং](../../8-Reinforcement/README.md) সম্পর্কে শিখেছেন। এটি প্রকৃতিতে প্যাটার্ন পূর্বাভাস দেওয়ার সময় খুবই কার্যকর হতে পারে। বিশেষভাবে, এটি বন আগুন এবং আক্রমণাত্মক প্রজাতির বিস্তারের মতো বাস্তুসংস্থান সমস্যাগুলো ট্র্যাক করতে ব্যবহার করা যেতে পারে। কানাডায়, একটি গবেষক দল রিইনফোর্সমেন্ট লার্নিং ব্যবহার করে স্যাটেলাইট ইমেজ থেকে বন আগুনের গতিশীলতার মডেল তৈরি করেছে। একটি উদ্ভাবনী "স্পেশালি স্প্রেডিং প্রসেস (SSP)" ব্যবহার করে, তারা একটি বন আগুনকে "ল্যান্ডস্কেপের যেকোনো সেলে এজেন্ট" হিসেবে কল্পনা করেছে। "আগুন একটি অবস্থান থেকে যেকোনো সময়ে উত্তর, দক্ষিণ, পূর্ব বা পশ্চিমে ছড়িয়ে পড়া বা না ছড়িয়ে পড়ার মতো পদক্ষেপ নিতে পারে।"
+
+এই পদ্ধতি সাধারণ RL সেটআপকে উল্টে দেয় কারণ সংশ্লিষ্ট মার্কোভ ডিসিশন প্রসেস (MDP)-এর গতিশীলতা তাৎক্ষণিক আগুনের বিস্তারের জন্য একটি পরিচিত ফাংশন।" এই দলের দ্বারা ব্যবহৃত ক্লাসিক অ্যালগরিদম সম্পর্কে আরও পড়ুন নিচের লিঙ্কে।
+[রেফারেন্স](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full)
+
+### প্রাণীর গতিশীলতা সনাক্তকরণ
+
+যদিও ডিপ লার্নিং প্রাণীর গতিশীলতা ট্র্যাক করার ক্ষেত্রে বিপ্লব ঘটিয়েছে (আপনি [পোলার বিয়ার ট্র্যাকার](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) তৈরি করতে পারেন), ক্লাসিক্যাল ML এখনও এই কাজে একটি স্থান ধরে রেখেছে।
+
+ফার্ম প্রাণীর গতিশীলতা ট্র্যাক করার জন্য সেন্সর এবং IoT এই ধরনের ভিজ্যুয়াল প্রসেসিং ব্যবহার করে, তবে আরও মৌলিক ML কৌশলগুলো ডেটা প্রি-প্রসেস করার জন্য কার্যকর। উদাহরণস্বরূপ, এই পেপারে, বিভিন্ন ক্লাসিফায়ার অ্যালগরিদম ব্যবহার করে ভেড়ার অঙ্গভঙ্গি পর্যবেক্ষণ এবং বিশ্লেষণ করা হয়েছে। আপনি পৃষ্ঠা ৩৩৫-এ ROC কার্ভ চিনতে পারবেন।
+[রেফারেন্স](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf)
+
+### ⚡️ শক্তি ব্যবস্থাপনা
+
+আমাদের [টাইম সিরিজ পূর্বাভাস](../../7-TimeSeries/README.md) পাঠে, আমরা একটি শহরের জন্য সরবরাহ এবং চাহিদা বোঝার উপর ভিত্তি করে রাজস্ব তৈরি করতে স্মার্ট পার্কিং মিটার ধারণার কথা বলেছিলাম। এই নিবন্ধটি বিস্তারিতভাবে আলোচনা করে কীভাবে ক্লাস্টারিং, রিগ্রেশন এবং টাইম সিরিজ পূর্বাভাস একত্রিত হয়ে আয়ারল্যান্ডে ভবিষ্যতের শক্তি ব্যবহারের পূর্বাভাস দিতে সাহায্য করেছে, স্মার্ট মিটারিং-এর উপর ভিত্তি করে।
+[রেফারেন্স](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf)
+
+## 💼 বীমা
+
+বীমা সেক্টর আর্থিক এবং অ্যাকচুয়ারিয়াল মডেল তৈরি এবং অপ্টিমাইজ করতে ML ব্যবহার করে।
+
+### অস্থিরতা ব্যবস্থাপনা
+
+MetLife, একটি জীবন বীমা প্রদানকারী, তাদের আর্থিক মডেলগুলোতে অস্থিরতা বিশ্লেষণ এবং প্রশমনের উপায় সম্পর্কে খোলামেলা। এই নিবন্ধে আপনি বাইনারি এবং অর্ডিনাল ক্লাসিফিকেশন ভিজ্যুয়ালাইজেশন লক্ষ্য করবেন। আপনি পূর্বাভাস ভিজ্যুয়ালাইজেশনও আবিষ্কার করবেন।
+[রেফারেন্স](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf)
+
+## 🎨 শিল্প, সংস্কৃতি এবং সাহিত্য
+
+শিল্পে, উদাহরণস্বরূপ সাংবাদিকতায়, অনেক আকর্ষণীয় সমস্যা রয়েছে। ভুয়া খবর সনাক্ত করা একটি বড় সমস্যা কারণ এটি প্রমাণিত হয়েছে যে এটি মানুষের মতামতকে প্রভাবিত করতে এবং এমনকি গণতন্ত্রকে বিপর্যস্ত করতে পারে। জাদুঘরগুলোও ML ব্যবহার করে উপকৃত হতে পারে, যেমন নিদর্শনগুলোর মধ্যে সংযোগ খুঁজে বের করা থেকে শুরু করে সম্পদ পরিকল্পনা পর্যন্ত।
+
+### ভুয়া খবর সনাক্তকরণ
+
+আজকের মিডিয়ায় ভুয়া খবর সনাক্তকরণ একটি বিড়াল-ইঁদুরের খেলায় পরিণত হয়েছে। এই নিবন্ধে, গবেষকরা প্রস্তাব করেছেন যে আমরা অধ্যয়ন করা ML কৌশলগুলোর সমন্বয়ে একটি সিস্টেম পরীক্ষা করতে পারি এবং সেরা মডেলটি মোতায়েন করতে পারি: "এই সিস্টেমটি ডেটা থেকে বৈশিষ্ট্য নিষ্কাশনের জন্য প্রাকৃতিক ভাষা প্রক্রিয়াকরণের উপর ভিত্তি করে এবং তারপর এই বৈশিষ্ট্যগুলো ব্যবহার করা হয় মেশিন লার্নিং ক্লাসিফায়ার যেমন Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD), এবং Logistic Regression(LR) প্রশিক্ষণের জন্য।"
+[রেফারেন্স](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf)
+
+এই নিবন্ধটি দেখায় কীভাবে বিভিন্ন ML ক্ষেত্রের সমন্বয় আকর্ষণীয় ফলাফল তৈরি করতে পারে যা ভুয়া খবর ছড়ানো এবং প্রকৃত ক্ষতি তৈরি করা বন্ধ করতে সাহায্য করতে পারে; এই ক্ষেত্রে, প্রেরণা ছিল COVID চিকিৎসা সম্পর্কে গুজব ছড়ানো যা জনতার সহিংসতা উস্কে দিয়েছিল।
+
+### জাদুঘরের ML
+
+জাদুঘরগুলো AI বিপ্লবের দ্বারপ্রান্তে রয়েছে যেখানে সংগ্রহগুলো ক্যাটালগ এবং ডিজিটাইজ করা এবং নিদর্শনগুলোর মধ্যে সংযোগ খুঁজে পাওয়া প্রযুক্তির অগ্রগতির সাথে সহজ হয়ে উঠছে। [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) প্রকল্পগুলো ভ্যাটিকান আর্কাইভের মতো অপ্রাপ্য সংগ্রহের রহস্য উন্মোচনে সাহায্য করছে। তবে, জাদুঘরের ব্যবসায়িক দিকটি ML মডেল থেকে উপকৃত হয়।
+
+উদাহরণস্বরূপ, শিকাগোর আর্ট ইনস্টিটিউট মডেল তৈরি করেছে যা ভবিষ্যদ্বাণী করে দর্শকরা
+আরেকটি ক্ষেত্র চিহ্নিত করুন যা এই পাঠ্যক্রমে শেখা কিছু কৌশল থেকে উপকৃত হয় এবং খুঁজে বের করুন এটি কীভাবে মেশিন লার্নিং (ML) ব্যবহার করে।
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/50/)
+
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+Wayfair ডেটা সায়েন্স টিমের কাছে বেশ কিছু আকর্ষণীয় ভিডিও রয়েছে যেখানে তারা দেখিয়েছে কীভাবে তারা তাদের কোম্পানিতে মেশিন লার্নিং ব্যবহার করে। এটি [দেখার মতো](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos) হতে পারে!
+
+## অ্যাসাইনমেন্ট
+
+[একটি মেশিন লার্নিং স্ক্যাভেঞ্জার হান্ট](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/9-Real-World/1-Applications/assignment.md b/translations/bn/9-Real-World/1-Applications/assignment.md
new file mode 100644
index 000000000..c14f4722f
--- /dev/null
+++ b/translations/bn/9-Real-World/1-Applications/assignment.md
@@ -0,0 +1,27 @@
+
+# একটি এমএল স্ক্যাভেঞ্জার হান্ট
+
+## নির্দেশাবলী
+
+এই পাঠে, আপনি শিখেছেন কিভাবে অনেক বাস্তব জীবনের সমস্যাগুলি ক্লাসিকাল এমএল ব্যবহার করে সমাধান করা হয়েছে। যদিও ডিপ লার্নিং, এআই-এর নতুন প্রযুক্তি এবং টুলস, এবং নিউরাল নেটওয়ার্ক ব্যবহার করে এই সেক্টরগুলিতে টুল তৈরির গতি বৃদ্ধি পেয়েছে, এই পাঠ্যক্রমে শেখানো কৌশল ব্যবহার করে ক্লাসিক এমএল এখনও অনেক মূল্য বহন করে।
+
+এই অ্যাসাইনমেন্টে, কল্পনা করুন যে আপনি একটি হ্যাকাথনে অংশ নিচ্ছেন। পাঠ্যক্রমে যা শিখেছেন তা ব্যবহার করে একটি সেক্টরে সমস্যার সমাধানের জন্য ক্লাসিক এমএল ব্যবহার করে একটি সমাধান প্রস্তাব করুন। একটি উপস্থাপনা তৈরি করুন যেখানে আপনি আপনার ধারণা বাস্তবায়নের পরিকল্পনা আলোচনা করবেন। যদি আপনি নমুনা ডেটা সংগ্রহ করতে পারেন এবং আপনার ধারণাকে সমর্থন করার জন্য একটি এমএল মডেল তৈরি করতে পারেন, তাহলে অতিরিক্ত পয়েন্ট পাবেন!
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | ------------------------------------------------------------------- | ------------------------------------------------- | ---------------------- |
+| | একটি পাওয়ারপয়েন্ট উপস্থাপনা উপস্থাপন করা হয়েছে - মডেল তৈরি করার জন্য অতিরিক্ত পয়েন্ট | একটি অ-নতুন, সাধারণ উপস্থাপনা উপস্থাপন করা হয়েছে | কাজ অসম্পূর্ণ |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/9-Real-World/2-Debugging-ML-Models/README.md b/translations/bn/9-Real-World/2-Debugging-ML-Models/README.md
new file mode 100644
index 000000000..aad918e16
--- /dev/null
+++ b/translations/bn/9-Real-World/2-Debugging-ML-Models/README.md
@@ -0,0 +1,162 @@
+
+# পোস্টস্ক্রিপ্ট: মেশিন লার্নিং মডেল ডিবাগিংয়ে রেসপন্সিবল এআই ড্যাশবোর্ড কম্পোনেন্ট ব্যবহার
+
+## [পূর্ব-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/5/)
+
+## ভূমিকা
+
+মেশিন লার্নিং আমাদের দৈনন্দিন জীবনে গভীর প্রভাব ফেলে। স্বাস্থ্যসেবা, অর্থনীতি, শিক্ষা এবং কর্মসংস্থানের মতো গুরুত্বপূর্ণ ক্ষেত্রগুলোতে এআই ব্যবহৃত হচ্ছে, যা আমাদের ব্যক্তি এবং সমাজ উভয়ের ওপর প্রভাব ফেলে। উদাহরণস্বরূপ, স্বাস্থ্যসেবা নির্ণয় বা প্রতারণা সনাক্তকরণের মতো দৈনন্দিন সিদ্ধান্ত গ্রহণের কাজে সিস্টেম এবং মডেল ব্যবহৃত হয়। এর ফলে, এআই-এর উন্নতি এবং দ্রুত গ্রহণযোগ্যতার সঙ্গে সঙ্গে সামাজিক প্রত্যাশা এবং নিয়ন্ত্রণও পরিবর্তিত হচ্ছে। আমরা প্রায়ই দেখি যে এআই সিস্টেমগুলো প্রত্যাশা পূরণে ব্যর্থ হচ্ছে; নতুন চ্যালেঞ্জ উন্মোচিত হচ্ছে; এবং সরকার এআই সমাধানগুলো নিয়ন্ত্রণ করতে শুরু করেছে। তাই, এই মডেলগুলো বিশ্লেষণ করা গুরুত্বপূর্ণ যাতে সবার জন্য ন্যায্য, নির্ভরযোগ্য, অন্তর্ভুক্তিমূলক, স্বচ্ছ এবং দায়বদ্ধ ফলাফল নিশ্চিত করা যায়।
+
+এই পাঠ্যক্রমে, আমরা এমন কিছু ব্যবহারিক টুল নিয়ে আলোচনা করব যা দিয়ে মডেলের রেসপন্সিবল এআই সমস্যা আছে কিনা তা মূল্যায়ন করা যায়। প্রচলিত মেশিন লার্নিং ডিবাগিং কৌশলগুলো সাধারণত পরিমাণগত হিসাবের ওপর ভিত্তি করে, যেমন সামগ্রিক সঠিকতা বা গড় ত্রুটি হার। কল্পনা করুন, যদি আপনার ডেটাসেটে কিছু নির্দিষ্ট ডেমোগ্রাফিক (যেমন জাতি, লিঙ্গ, রাজনৈতিক মতামত, ধর্ম) অনুপস্থিত থাকে বা অতিরিক্তভাবে প্রতিনিধিত্ব করে, তাহলে কী হতে পারে। আবার, যদি মডেলের আউটপুট কোনো নির্দিষ্ট ডেমোগ্রাফিককে প্রাধান্য দেয়, তাহলে এটি সংবেদনশীল বৈশিষ্ট্য গোষ্ঠীগুলোর অতিরিক্ত বা কম প্রতিনিধিত্বের কারণ হতে পারে, যা মডেলের ন্যায্যতা, অন্তর্ভুক্তি বা নির্ভরযোগ্যতায় সমস্যা সৃষ্টি করতে পারে। আরেকটি বিষয় হলো, মেশিন লার্নিং মডেলগুলোকে "ব্ল্যাক বক্স" হিসেবে বিবেচনা করা হয়, যা মডেলের পূর্বাভাসের কারণ বোঝা এবং ব্যাখ্যা করা কঠিন করে তোলে। এই সমস্ত চ্যালেঞ্জগুলো ডেটা বিজ্ঞানী এবং এআই ডেভেলপারদের জন্য সমস্যা তৈরি করে যখন তাদের কাছে মডেলের ন্যায্যতা বা বিশ্বাসযোগ্যতা মূল্যায়নের জন্য যথাযথ টুল থাকে না।
+
+এই পাঠে, আপনি আপনার মডেল ডিবাগিং সম্পর্কে শিখবেন:
+
+- **ত্রুটি বিশ্লেষণ**: আপনার ডেটা বিতরণে মডেলের উচ্চ ত্রুটি হার কোথায় তা সনাক্ত করা।
+- **মডেল ওভারভিউ**: বিভিন্ন ডেটা কোহর্টের মধ্যে তুলনামূলক বিশ্লেষণ করে মডেলের পারফরম্যান্স মেট্রিকের বৈষম্য আবিষ্কার করা।
+- **ডেটা বিশ্লেষণ**: আপনার ডেটায় কোথায় অতিরিক্ত বা কম প্রতিনিধিত্ব থাকতে পারে তা তদন্ত করা, যা মডেলকে এক ডেটা ডেমোগ্রাফিকের পক্ষে বা বিপক্ষে পক্ষপাতিত্ব করতে প্রভাবিত করতে পারে।
+- **ফিচার ইম্পর্টেন্স**: বৈশ্বিক বা স্থানীয় স্তরে মডেলের পূর্বাভাসে কোন বৈশিষ্ট্যগুলো প্রভাব ফেলছে তা বোঝা।
+
+## পূর্বশর্ত
+
+পূর্বশর্ত হিসেবে, দয়া করে [ডেভেলপারদের জন্য রেসপন্সিবল এআই টুল](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard) পর্যালোচনা করুন।
+
+> 
+
+## ত্রুটি বিশ্লেষণ
+
+প্রচলিত মডেল পারফরম্যান্স মেট্রিক, যেমন সঠিকতা পরিমাপ, সাধারণত সঠিক বনাম ভুল পূর্বাভাসের ভিত্তিতে হিসাব করা হয়। উদাহরণস্বরূপ, একটি মডেল ৮৯% সঠিক এবং ০.০০১ ত্রুটি হারের সঙ্গে কাজ করছে বলে বিবেচনা করা যেতে পারে। তবে, ত্রুটিগুলো আপনার ডেটাসেটে সমানভাবে বিতরণ নাও হতে পারে। আপনি ৮৯% সঠিকতার স্কোর পেতে পারেন, কিন্তু দেখতে পারেন যে ডেটার কিছু নির্দিষ্ট অঞ্চলে মডেল ৪২% সময় ব্যর্থ হচ্ছে। এই ব্যর্থতার ধরণগুলো নির্দিষ্ট ডেটা গোষ্ঠীর জন্য ন্যায্যতা বা নির্ভরযোগ্যতার সমস্যার কারণ হতে পারে। মডেল কোথায় ভালো করছে বা করছে না তা বোঝা অত্যন্ত গুরুত্বপূর্ণ। ডেটার সেই অঞ্চলগুলো, যেখানে মডেলের ত্রুটি বেশি, একটি গুরুত্বপূর্ণ ডেটা ডেমোগ্রাফিক হতে পারে।
+
+
+
+আরএআই ড্যাশবোর্ডের ত্রুটি বিশ্লেষণ কম্পোনেন্ট একটি গাছের ভিজ্যুয়ালাইজেশনের মাধ্যমে মডেলের ব্যর্থতা বিভিন্ন কোহর্টে কীভাবে বিতরণ হয়েছে তা দেখায়। এটি আপনার ডেটাসেটে উচ্চ ত্রুটি হারের বৈশিষ্ট্য বা অঞ্চল সনাক্ত করতে সহায়তা করে। মডেলের বেশিরভাগ ত্রুটি কোথা থেকে আসছে তা দেখে আপনি মূল কারণ অনুসন্ধান শুরু করতে পারেন। আপনি ডেটার কোহর্ট তৈরি করেও বিশ্লেষণ করতে পারেন। এই ডেটা কোহর্টগুলো ডিবাগিং প্রক্রিয়ায় সহায়তা করে, যেমন কেন একটি কোহর্টে মডেলের পারফরম্যান্স ভালো, কিন্তু অন্যটিতে ত্রুটিপূর্ণ।
+
+
+
+গাছের মানচিত্রে দৃশ্যমান সূচকগুলো সমস্যার অঞ্চলগুলো দ্রুত সনাক্ত করতে সহায়তা করে। উদাহরণস্বরূপ, একটি গাছের নোড যত গাঢ় লাল রঙের হয়, ত্রুটি হার তত বেশি।
+
+হিট ম্যাপ হলো আরেকটি ভিজ্যুয়ালাইজেশন কার্যকারিতা, যা ব্যবহারকারীদের একটি বা দুটি বৈশিষ্ট্যের মাধ্যমে ত্রুটি হার বিশ্লেষণ করতে সহায়তা করে এবং মডেলের ত্রুটির কারণ সনাক্ত করতে সহায়তা করে।
+
+
+
+ত্রুটি বিশ্লেষণ ব্যবহার করুন যখন আপনাকে প্রয়োজন:
+
+* মডেলের ব্যর্থতা কীভাবে ডেটাসেট এবং বিভিন্ন ইনপুট ও বৈশিষ্ট্য মাত্রায় বিতরণ হয়েছে তা গভীরভাবে বোঝা।
+* সামগ্রিক পারফরম্যান্স মেট্রিক ভেঙে ত্রুটিপূর্ণ কোহর্ট সনাক্ত করা এবং লক্ষ্যভিত্তিক সমাধানের পদক্ষেপ নেওয়া।
+
+## মডেল ওভারভিউ
+
+একটি মেশিন লার্নিং মডেলের পারফরম্যান্স মূল্যায়ন করতে হলে এর আচরণ সম্পর্কে সামগ্রিক ধারণা পাওয়া প্রয়োজন। এটি একাধিক মেট্রিক পর্যালোচনা করে অর্জন করা যায়, যেমন ত্রুটি হার, সঠিকতা, রিকল, প্রিসিশন, বা এমএইই (গড় পরম ত্রুটি) এবং পারফরম্যান্স মেট্রিকের মধ্যে বৈষম্য খুঁজে বের করা। একটি মেট্রিক ভালো দেখাতে পারে, কিন্তু অন্য মেট্রিকে ত্রুটি প্রকাশ পেতে পারে। এছাড়া, পুরো ডেটাসেট বা কোহর্টের মধ্যে মেট্রিকের বৈষম্য তুলনা করলে মডেল কোথায় ভালো করছে বা করছে না তা বোঝা যায়। এটি বিশেষভাবে গুরুত্বপূর্ণ সংবেদনশীল বনাম অসংবেদনশীল বৈশিষ্ট্যের (যেমন রোগীর জাতি, লিঙ্গ, বা বয়স) মধ্যে মডেলের পারফরম্যান্স দেখতে, যাতে মডেলের সম্ভাব্য পক্ষপাতিত্ব উন্মোচিত হয়। উদাহরণস্বরূপ, যদি দেখা যায় যে মডেল একটি সংবেদনশীল বৈশিষ্ট্যযুক্ত কোহর্টে বেশি ত্রুটিপূর্ণ, তাহলে এটি মডেলের সম্ভাব্য পক্ষপাতিত্ব প্রকাশ করতে পারে।
+
+আরএআই ড্যাশবোর্ডের মডেল ওভারভিউ কম্পোনেন্ট কেবল ডেটা প্রতিনিধিত্বের পারফরম্যান্স মেট্রিক বিশ্লেষণে সহায়তা করে না, এটি ব্যবহারকারীদের বিভিন্ন কোহর্টের মধ্যে মডেলের আচরণ তুলনা করার ক্ষমতা দেয়।
+
+
+
+কম্পোনেন্টের বৈশিষ্ট্য-ভিত্তিক বিশ্লেষণ কার্যকারিতা ব্যবহারকারীদের একটি নির্দিষ্ট বৈশিষ্ট্যের মধ্যে ডেটা উপগোষ্ঠী সংকুচিত করতে এবং সূক্ষ্ম স্তরে অস্বাভাবিকতা সনাক্ত করতে সহায়তা করে। উদাহরণস্বরূপ, ড্যাশবোর্ডে একটি ব্যবহারকারী-নির্বাচিত বৈশিষ্ট্যের জন্য স্বয়ংক্রিয়ভাবে কোহর্ট তৈরি করার বুদ্ধিমত্তা অন্তর্নির্মিত রয়েছে (যেমন *"time_in_hospital < 3"* বা *"time_in_hospital >= 7"*)। এটি ব্যবহারকারীকে একটি বৃহত্তর ডেটা গোষ্ঠী থেকে একটি নির্দিষ্ট বৈশিষ্ট্য আলাদা করতে সক্ষম করে, যাতে এটি মডেলের ত্রুটিপূর্ণ ফলাফলের একটি মূল প্রভাবক কিনা তা দেখা যায়।
+
+
+
+মডেল ওভারভিউ কম্পোনেন্ট দুটি শ্রেণির বৈষম্য মেট্রিক সমর্থন করে:
+
+**মডেল পারফরম্যান্সে বৈষম্য**: এই মেট্রিকগুলো ডেটার উপগোষ্ঠীগুলোর মধ্যে নির্বাচিত পারফরম্যান্স মেট্রিকের মানের বৈষম্য (পার্থক্য) গণনা করে। উদাহরণ:
+
+* সঠিকতার হারে বৈষম্য
+* ত্রুটি হারে বৈষম্য
+* প্রিসিশনে বৈষম্য
+* রিকলে বৈষম্য
+* গড় পরম ত্রুটিতে (MAE) বৈষম্য
+
+**নির্বাচনের হারে বৈষম্য**: এই মেট্রিক উপগোষ্ঠীগুলোর মধ্যে নির্বাচনের হারের (অনুকূল পূর্বাভাস) পার্থক্য ধারণ করে। উদাহরণস্বরূপ, ঋণ অনুমোদনের হারে বৈষম্য। নির্বাচনের হার বলতে বোঝায় প্রতিটি শ্রেণির ডেটা পয়েন্টের ভগ্নাংশ যা ১ হিসেবে শ্রেণীবদ্ধ (বাইনারি শ্রেণীবিভাজনে) বা পূর্বাভাসের মানের বিতরণ (রিগ্রেশনে)।
+
+## ডেটা বিশ্লেষণ
+
+> "যদি আপনি ডেটাকে যথেষ্ট সময় ধরে নির্যাতন করেন, এটি যেকোনো কিছু স্বীকার করবে" - রোনাল্ড কোজ
+
+এই উক্তিটি চরম শোনালেও সত্য যে ডেটাকে এমনভাবে প্রক্রিয়াজাত করা যায় যাতে এটি যেকোনো সিদ্ধান্তকে সমর্থন করে। এই ধরনের প্রক্রিয়াজাতকরণ কখনও কখনও অনিচ্ছাকৃতভাবে ঘটে। আমরা সবাই পক্ষপাতের শিকার, এবং কখন আমরা ডেটায় পক্ষপাত আনছি তা সচেতনভাবে বোঝা কঠিন। এআই এবং মেশিন লার্নিং-এ ন্যায্যতা নিশ্চিত করা একটি জটিল চ্যালেঞ্জ।
+
+ডেটা হলো প্রচলিত মডেল পারফরম্যান্স মেট্রিকের একটি বড় অন্ধকার দিক। আপনার সঠিকতার স্কোর উচ্চ হতে পারে, কিন্তু এটি সবসময় আপনার ডেটাসেটে থাকা অন্তর্নিহিত পক্ষপাত প্রতিফলিত করে না। উদাহরণস্বরূপ, একটি কোম্পানির নির্বাহী পদে ২৭% নারী এবং ৭৩% পুরুষ থাকলে, এই ডেটার ওপর প্রশিক্ষিত একটি চাকরি বিজ্ঞাপন এআই মডেল মূলত পুরুষদের লক্ষ্য করে বিজ্ঞাপন দেখাতে পারে। ডেটায় এই ভারসাম্যহীনতা মডেলের পূর্বাভাসকে এক লিঙ্গের পক্ষে পক্ষপাতিত্ব করতে প্রভাবিত করেছে। এটি একটি ন্যায্যতার সমস্যা প্রকাশ করে যেখানে এআই মডেলে লিঙ্গ পক্ষপাত রয়েছে।
+
+আরএআই ড্যাশবোর্ডের ডেটা বিশ্লেষণ কম্পোনেন্ট ডেটাসেটে কোথায় অতিরিক্ত বা কম প্রতিনিধিত্ব রয়েছে তা সনাক্ত করতে সহায়তা করে। এটি ব্যবহারকারীদের ডেটা ভারসাম্যহীনতা বা একটি নির্দিষ্ট ডেটা গোষ্ঠীর প্রতিনিধিত্বের অভাব থেকে উদ্ভূত ত্রুটি এবং ন্যায্যতার সমস্যার মূল কারণ নির্ণয়ে সহায়তা করে। এটি ব্যবহারকারীদের পূর্বাভাস এবং প্রকৃত ফলাফল, ত্রুটি গোষ্ঠী এবং নির্দিষ্ট বৈশিষ্ট্যের ভিত্তিতে ডেটাসেট ভিজ্যুয়ালাইজ করতে সক্ষম করে। কখনও কখনও একটি কম প্রতিনিধিত্বকারী ডেটা গোষ্ঠী আবিষ্কার করা মডেলটি ভালোভাবে শিখছে না তা প্রকাশ করতে পারে, যার ফলে উচ্চ ত্রুটি দেখা দেয়। একটি পক্ষপাতযুক্ত ডেটা মডেল কেবল ন্যায্যতার সমস্যাই নয়, এটি দেখায় যে মডেলটি অন্তর্ভুক্তিমূলক বা নির্ভরযোগ্য নয়।
+
+
+
+ডেটা বিশ্লেষণ ব্যবহার করুন যখন আপনাকে প্রয়োজন:
+
+* বিভিন্ন ফিল্টার নির্বাচন করে আপনার ডেটাসেটের পরিসংখ্যান অন্বেষণ করা এবং বিভিন্ন মাত্রায় (কোহর্ট নামে পরিচিত) ডেটা বিভক্ত করা।
+* বিভিন্ন কোহর্ট এবং বৈশিষ্ট্য গোষ্ঠীর মধ্যে আপনার ডেটাসেটের বিতরণ বোঝা।
+* ন্যায্যতা, ত্রুটি বিশ্লেষণ এবং কারণ নির্ধারণ সম্পর্কিত আপনার অনুসন্ধানগুলো (ড্যাশবোর্ডের অন্যান্য কম্পোনেন্ট থেকে প্রাপ্ত) আপনার ডেটাসেটের বিতরণের ফলাফল কিনা তা নির্ধারণ করা।
+* প্রতিনিধিত্বের সমস্যাগুলো থেকে উদ্ভূত ত্রুটি কমাতে কোন অঞ্চলে আরও ডেটা সংগ্রহ করা প্রয়োজন তা সিদ্ধান্ত নেওয়া।
+
+## মডেল ব্যাখ্যা
+
+মেশিন লার্নিং মডেলগুলো সাধারণত "ব্ল্যাক বক্স" হিসেবে বিবেচিত হয়। একটি মডেলের পূর্বাভাসে কোন প্রধান বৈশিষ্ট্যগুলো প্রভাব ফেলে তা বোঝা চ্যালেঞ্জিং হতে পারে। একটি মডেল কেন একটি নির্দিষ্ট পূর্বাভাস করেছে তা স্বচ্ছভাবে জানানো গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যদি একটি এআই সিস্টেম পূর্বাভাস দেয় যে একজন ডায়াবেটিক রোগী ৩০ দিনের মধ্যে আবার হাসপাতালে ভর্তি হওয়ার ঝুঁকিতে রয়েছে, তবে এটি পূর্বাভাসের পেছনে থাকা ডেটা সমর্থন প্রদান করতে সক্ষম হওয়া উচিত। এই ধরনের সমর্থনকারী ডেটা সূচক স্বচ্ছতা আনে, যা ক্লিনিশিয়ান বা হাসপাতালগুলোকে সঠিক সিদ্ধান্ত নিতে সহায়তা করে। এছাড়া, একটি নির্দিষ্ট রোগীর জন্য মডেল কেন একটি পূর্বাভাস দিয়েছে তা ব্যাখ্যা করতে পারা স্বাস্থ্যবিধি সম্পর্কিত নিয়মকানুনে দায়বদ্ধতা নিশ্চিত করে। যখন আপনি মেশিন লার্নিং মডেল এমনভাবে ব্যবহার করছেন যা মানুষের জীবনে প্রভাব ফেলে, তখন মডেলের আচরণ কী প্রভাবিত করে তা বোঝা এবং ব্যাখ্যা করা অত্যন্ত গুরুত্বপূর্ণ। মডেল ব্যাখ্যা এবং ব্যাখ্যাত্মকতা নিম্নলিখিত প্রশ্নগুলোর উত্তর দিতে সহায়তা করে:
+
+* মডেল ডিবাগিং: আমার মডেল কেন এই ভুলটি করেছে? আমি কীভাবে আমার মডেল উন্নত করতে পারি?
+* মানব-এআই সহযোগিতা: আমি কীভাবে মডেলের সিদ্ধান্তগুলো বুঝতে এবং বিশ্বাস করতে পারি?
+* নিয়মতান্ত্রিক সম্মতি: আমার মডেল কি আইনি প্রয়োজনীয়তাগুলো পূরণ করে?
+
+আরএআই ড্যাশবোর্ডের ফিচার ইম্পর্টেন্স কম্পোনেন্ট আপনাকে ডিবাগ করতে এবং একটি মডেল কীভাবে পূর্বাভাস তৈরি করে তা ব্যাপকভাবে বুঝতে সহায়তা করে। এটি মেশিন লার্নিং পেশাদার এবং সিদ্ধান্ত গ্রহণকারীদের জন্য একটি কার্যকরী টুল, যা মডেলের আচরণে প্রভাব ফেলা বৈশিষ্ট্যগুলোর প্রমাণ দেখাতে এবং ব্যাখ্যা করতে সহায়তা করে। ব্যবহারকারীরা বৈশ্বিক এবং স্থানীয় ব্যাখ্যা উভয়ই অন্বেষণ করতে পারেন, যা মডেলের পূর্বাভাসে কোন বৈশিষ্ট্যগুলো প্রভাব ফেলেছে তা যাচাই করতে সহায়তা করে। বৈশ্বিক ব্যাখ্যা মডেলের সামগ্রিক পূর্বাভাসে প্রভাব ফেলা শীর্ষ বৈশিষ্ট্যগুলো তালিকাভুক্ত করে। স্থানীয় ব্যাখ্যা দেখায় যে একটি নির্দিষ্ট ক্ষেত্রে মডেলের পূর্বাভাসে কোন বৈশিষ্ট্যগুলো প্রভাব ফেলেছে। নির্দিষ্ট একটি ক্ষেত্রে ডিবাগিং বা অডিটিংয়ে স্থানীয় ব্যাখ্যা মূল্যায়ন করার ক্ষমতা মডেলটি সঠিক বা ভুল পূর্বাভাস কেন দিয়েছে তা আরও ভালোভাবে বুঝতে এবং ব্যাখ্যা করতে সহায়তা করে।
+
+
+
+* বৈশ্বিক ব্যাখ্যা: উদাহরণস্বরূপ, ডায়াবেটিস হাসপাতাল পুনঃভর্তি মডেলের সামগ্রিক আচরণে কোন বৈশিষ্ট্যগুলো প্রভাব ফেলে?
+* স্থানীয় ব্যাখ্যা: উদাহরণস্বরূপ, কেন ৬০ বছরের বেশি বয়সী এবং পূর্বে হাসপাতালে ভর্তি হওয়া একজন
+- **অতিরিক্ত বা অপর্যাপ্ত প্রতিনিধিত্ব**। ধারণাটি হলো একটি নির্দিষ্ট গোষ্ঠীকে একটি নির্দিষ্ট পেশায় দেখা যায় না, এবং যে কোনো পরিষেবা বা কার্যক্রম যা এটি প্রচার করে চলেছে, তা ক্ষতির কারণ হয়ে দাঁড়ায়।
+
+### Azure RAI ড্যাশবোর্ড
+
+[Azure RAI ড্যাশবোর্ড](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) ওপেন-সোর্স টুলের উপর ভিত্তি করে তৈরি, যা শীর্ষস্থানীয় একাডেমিক প্রতিষ্ঠান এবং সংস্থাগুলোর (যেমন Microsoft) দ্বারা উন্নত করা হয়েছে। এটি ডেটা বিজ্ঞানী এবং AI ডেভেলপারদের মডেলের আচরণ আরও ভালোভাবে বোঝা, এবং AI মডেল থেকে উদ্ভূত অপ্রত্যাশিত সমস্যাগুলি আবিষ্কার ও সমাধান করতে সহায়ক।
+
+- RAI ড্যাশবোর্ডের বিভিন্ন উপাদান কীভাবে ব্যবহার করবেন তা জানতে [ডকুমেন্টেশন](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) দেখুন।
+
+- Azure Machine Learning-এ আরও দায়িত্বশীল AI পরিস্থিতি ডিবাগ করার জন্য কিছু RAI ড্যাশবোর্ডের [নমুনা নোটবুক](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) দেখুন।
+
+---
+## 🚀 চ্যালেঞ্জ
+
+প্রথম থেকেই পরিসংখ্যানগত বা ডেটা পক্ষপাত এড়ানোর জন্য, আমাদের উচিত:
+
+- সিস্টেমে কাজ করা ব্যক্তিদের মধ্যে বিভিন্ন পটভূমি এবং দৃষ্টিভঙ্গি নিশ্চিত করা
+- এমন ডেটাসেটে বিনিয়োগ করা যা আমাদের সমাজের বৈচিত্র্যকে প্রতিফলিত করে
+- পক্ষপাত সনাক্ত এবং সংশোধন করার জন্য আরও উন্নত পদ্ধতি বিকাশ করা
+
+বাস্তব জীবনের সেই পরিস্থিতিগুলি নিয়ে ভাবুন যেখানে মডেল তৈরির এবং ব্যবহারের ক্ষেত্রে অন্যায় স্পষ্ট। আর কী বিষয় আমাদের বিবেচনা করা উচিত?
+
+## [পোস্ট-লেকচার কুইজ](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/6/)
+## পর্যালোচনা ও স্ব-অধ্যয়ন
+
+এই পাঠে, আপনি মেশিন লার্নিং-এ দায়িত্বশীল AI অন্তর্ভুক্ত করার কিছু ব্যবহারিক টুল সম্পর্কে শিখেছেন।
+
+এই ওয়ার্কশপটি দেখুন এবং বিষয়গুলো আরও গভীরভাবে জানুন:
+
+- দায়িত্বশীল AI ড্যাশবোর্ড: বাস্তবে RAI পরিচালনার জন্য একক প্ল্যাটফর্ম, Besmira Nushi এবং Mehrnoosh Sameki দ্বারা
+
+[](https://www.youtube.com/watch?v=f1oaDNl3djg "দায়িত্বশীল AI ড্যাশবোর্ড: বাস্তবে RAI পরিচালনার জন্য একক প্ল্যাটফর্ম")
+
+> 🎥 উপরের ছবিতে ক্লিক করুন ভিডিও দেখার জন্য: দায়িত্বশীল AI ড্যাশবোর্ড: বাস্তবে RAI পরিচালনার জন্য একক প্ল্যাটফর্ম, Besmira Nushi এবং Mehrnoosh Sameki দ্বারা
+
+দায়িত্বশীল AI এবং আরও বিশ্বাসযোগ্য মডেল তৈরির বিষয়ে আরও জানতে নিম্নলিখিত উপকরণগুলি দেখুন:
+
+- ML মডেল ডিবাগ করার জন্য Microsoft's RAI ড্যাশবোর্ড টুল: [দায়িত্বশীল AI টুল রিসোর্স](https://aka.ms/rai-dashboard)
+
+- দায়িত্বশীল AI টুলকিট অন্বেষণ করুন: [Github](https://github.com/microsoft/responsible-ai-toolbox)
+
+- Microsoft's RAI রিসোর্স সেন্টার: [দায়িত্বশীল AI রিসোর্স – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
+
+- Microsoft's FATE গবেষণা দল: [FATE: AI-তে ন্যায্যতা, জবাবদিহিতা, স্বচ্ছতা এবং নৈতিকতা - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
+
+## অ্যাসাইনমেন্ট
+
+[RAI ড্যাশবোর্ড অন্বেষণ করুন](assignment.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/9-Real-World/2-Debugging-ML-Models/assignment.md b/translations/bn/9-Real-World/2-Debugging-ML-Models/assignment.md
new file mode 100644
index 000000000..79eec5c19
--- /dev/null
+++ b/translations/bn/9-Real-World/2-Debugging-ML-Models/assignment.md
@@ -0,0 +1,25 @@
+
+# দায়িত্বশীল AI (RAI) ড্যাশবোর্ড অন্বেষণ করুন
+
+## নির্দেশনা
+
+এই পাঠে আপনি RAI ড্যাশবোর্ড সম্পর্কে শিখেছেন, যা "ওপেন-সোর্স" টুলের উপর ভিত্তি করে তৈরি একটি উপাদানসমূহের সংকলন। এটি ডেটা বিজ্ঞানীদের ত্রুটি বিশ্লেষণ, ডেটা অনুসন্ধান, ন্যায্যতা মূল্যায়ন, মডেল ব্যাখ্যা, কাউন্টারফ্যাক্ট/যদি-কি মূল্যায়ন এবং AI সিস্টেমে কারণমূলক বিশ্লেষণ করতে সহায়তা করে। এই অ্যাসাইনমেন্টের জন্য, RAI ড্যাশবোর্ডের কিছু নমুনা [নোটবুক](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) অন্বেষণ করুন এবং আপনার পর্যবেক্ষণ একটি পেপার বা প্রেজেন্টেশনে রিপোর্ট করুন।
+
+## মূল্যায়ন মানদণ্ড
+
+| মানদণ্ড | চমৎকার | পর্যাপ্ত | উন্নতির প্রয়োজন |
+| -------- | --------- | -------- | ----------------- |
+| | একটি পেপার বা পাওয়ারপয়েন্ট প্রেজেন্টেশন উপস্থাপন করা হয়েছে যেখানে RAI ড্যাশবোর্ডের উপাদানসমূহ, চালানো নোটবুক এবং সেখান থেকে প্রাপ্ত সিদ্ধান্তগুলি আলোচনা করা হয়েছে | একটি পেপার উপস্থাপন করা হয়েছে কিন্তু সিদ্ধান্ত ছাড়া | কোনো পেপার উপস্থাপন করা হয়নি |
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/9-Real-World/README.md b/translations/bn/9-Real-World/README.md
new file mode 100644
index 000000000..9eb376ba9
--- /dev/null
+++ b/translations/bn/9-Real-World/README.md
@@ -0,0 +1,32 @@
+
+# পোস্টস্ক্রিপ্ট: ক্লাসিক মেশিন লার্নিং-এর বাস্তব জীবনের প্রয়োগ
+
+এই পাঠক্রমের এই অংশে, আপনাকে ক্লাসিক্যাল মেশিন লার্নিং-এর কিছু বাস্তব জীবনের প্রয়োগের সাথে পরিচয় করানো হবে। আমরা ইন্টারনেট থেকে সাদা কাগজ এবং প্রবন্ধ সংগ্রহ করেছি যেখানে এই কৌশলগুলো ব্যবহার করা হয়েছে, যতটা সম্ভব নিউরাল নেটওয়ার্ক, ডিপ লার্নিং এবং AI এড়িয়ে। শিখুন কীভাবে মেশিন লার্নিং ব্যবসায়িক সিস্টেম, পরিবেশগত প্রয়োগ, অর্থনীতি, শিল্প ও সংস্কৃতি এবং আরও অনেক ক্ষেত্রে ব্যবহার করা হয়।
+
+
+
+> ছবি Alexis Fauvet এর তোলা Unsplash এ
+
+## পাঠ
+
+1. [মেশিন লার্নিং-এর বাস্তব জীবনের প্রয়োগ](1-Applications/README.md)
+2. [রেসপন্সিবল AI ড্যাশবোর্ড কম্পোনেন্ট ব্যবহার করে মেশিন লার্নিং মডেলের ডিবাগিং](2-Debugging-ML-Models/README.md)
+
+## কৃতজ্ঞতা
+
+"বাস্তব জীবনের প্রয়োগ" একটি দল লিখেছে, যার মধ্যে [Jen Looper](https://twitter.com/jenlooper) এবং [Ornella Altunyan](https://twitter.com/ornelladotcom) অন্তর্ভুক্ত।
+
+"রেসপন্সিবল AI ড্যাশবোর্ড কম্পোনেন্ট ব্যবহার করে মেশিন লার্নিং মডেলের ডিবাগিং" লিখেছেন [Ruth Yakubu](https://twitter.com/ruthieyakubu)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/CODE_OF_CONDUCT.md b/translations/bn/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..98aba0d59
--- /dev/null
+++ b/translations/bn/CODE_OF_CONDUCT.md
@@ -0,0 +1,23 @@
+
+# মাইক্রোসফট ওপেন সোর্স আচরণবিধি
+
+এই প্রকল্পটি [মাইক্রোসফট ওপেন সোর্স আচরণবিধি](https://opensource.microsoft.com/codeofconduct/) গ্রহণ করেছে।
+
+সম্পদসমূহ:
+
+- [মাইক্রোসফট ওপেন সোর্স আচরণবিধি](https://opensource.microsoft.com/codeofconduct/)
+- [মাইক্রোসফট আচরণবিধি FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
+- প্রশ্ন বা উদ্বেগের জন্য [opencode@microsoft.com](mailto:opencode@microsoft.com)-এ যোগাযোগ করুন
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/CONTRIBUTING.md b/translations/bn/CONTRIBUTING.md
new file mode 100644
index 000000000..d672e0643
--- /dev/null
+++ b/translations/bn/CONTRIBUTING.md
@@ -0,0 +1,25 @@
+
+# অবদান রাখা
+
+এই প্রকল্পে অবদান এবং পরামর্শকে স্বাগত জানানো হয়। বেশিরভাগ অবদান রাখার জন্য আপনাকে একটি Contributor License Agreement (CLA)-তে সম্মতি জানাতে হবে, যা নিশ্চিত করে যে আপনার অবদানের অধিকার আপনার আছে এবং আপনি আমাদের তা ব্যবহারের অধিকার প্রদান করছেন। বিস্তারিত জানতে ভিজিট করুন https://cla.microsoft.com।
+
+> গুরুত্বপূর্ণ: এই রিপোজিটরিতে টেক্সট অনুবাদ করার সময় দয়া করে মেশিন অনুবাদ ব্যবহার করবেন না। আমরা অনুবাদগুলো কমিউনিটির মাধ্যমে যাচাই করব, তাই শুধুমাত্র সেই ভাষাগুলোর জন্য অনুবাদে স্বেচ্ছাসেবী হোন, যেখানে আপনি দক্ষ।
+
+যখন আপনি একটি pull request জমা দেবেন, একটি CLA-bot স্বয়ংক্রিয়ভাবে নির্ধারণ করবে যে আপনাকে CLA প্রদান করতে হবে কিনা এবং PR-এ সঠিকভাবে লেবেল বা মন্তব্য যোগ করবে। বট প্রদত্ত নির্দেশাবলী অনুসরণ করুন। আপনাকে এটি শুধুমাত্র একবার করতে হবে, সমস্ত রিপোজিটরির জন্য যেখানে আমাদের CLA প্রয়োজন।
+
+এই প্রকল্পটি [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) গ্রহণ করেছে।
+আরও তথ্যের জন্য দেখুন [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
+অথবা [opencode@microsoft.com](mailto:opencode@microsoft.com)-এ যোগাযোগ করুন যদি আপনার অতিরিক্ত প্রশ্ন বা মন্তব্য থাকে।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/PyTorch_Fundamentals.ipynb b/translations/bn/PyTorch_Fundamentals.ipynb
new file mode 100644
index 000000000..8df65a987
--- /dev/null
+++ b/translations/bn/PyTorch_Fundamentals.ipynb
@@ -0,0 +1,2830 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 0,
+ "metadata": {
+ "colab": {
+ "provenance": [],
+ "gpuType": "T4",
+ "authorship_tag": "ABX9TyOgv0AozH1FKQBD+RkgT2bV",
+ "include_colab_link": true
+ },
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3"
+ },
+ "language_info": {
+ "name": "python"
+ },
+ "accelerator": "GPU",
+ "coopTranslator": {
+ "original_hash": "0ca21b6ee62904d616f2e36dc1cf0da7",
+ "translation_date": "2025-08-29T22:44:36+00:00",
+ "source_file": "PyTorch_Fundamentals.ipynb",
+ "language_code": "bn"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "view-in-github",
+ "colab_type": "text"
+ },
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "EHh5JllMh1rG",
+ "outputId": "f55755ad-c369-414c-85ec-6e9d4f061a02",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 35
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "'2.2.1+cu121'"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "string"
+ }
+ },
+ "metadata": {},
+ "execution_count": 1
+ }
+ ],
+ "source": [
+ "import torch\n",
+ "torch.__version__"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "print(\"I am excited to run this\")"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "UPlb-duwXAfz",
+ "outputId": "cfd687e4-1238-49f4-ab6b-ee1305b740d2"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "I am excited to run this\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import torch\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "print(torch.__version__)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "byWVlJ9wXDSk",
+ "outputId": "fd74a5c4-4d4a-41b2-ef3c-562ea3e4811f"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "2.2.1+cu121\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "Osm80zoEYklS"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# scalar\n",
+ "scalar = torch.tensor(7)\n",
+ "scalar"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "-o8wvJ-VXZmI",
+ "outputId": "558816f5-1205-4de1-fe1f-2f96e9bd79e6"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(7)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 4
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "scalar.ndim"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "mCZ2tXC4Y_Sg",
+ "outputId": "2d86dbdc-56e1-45c6-d3dd-14515f2a457a"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 5
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "scalar.item()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ssN00By0ZQgS",
+ "outputId": "490f40d1-5135-4969-a6d3-c8c902cdc473"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "7"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 6
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# vector\n",
+ "vector = torch.tensor([7, 7])\n",
+ "vector\n",
+ "#vector.ndim\n",
+ "#vector.item()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Bws__5wlZnmF",
+ "outputId": "944e38f9-5ba1-4ddc-a9c6-cfb6a19bb488"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([7, 7])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 7
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "vector.shape"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "9pjCvnsZZzNG",
+ "outputId": "e030a4da-8f81-4858-fbce-86da2aaafe52"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "torch.Size([2])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 8
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Matrix\n",
+ "MATRIX = torch.tensor([[7, 8],[9, 10]])\n",
+ "MATRIX"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "a747hI9SaBGW",
+ "outputId": "af835ddb-81ff-4981-badb-441567194d15"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[ 7, 8],\n",
+ " [ 9, 10]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 9
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "MATRIX.ndim"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "XdTfFa7vaRUj",
+ "outputId": "0fbbab9c-8263-4cad-a380-0d2a16ca499e"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "2"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 10
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "MATRIX[0]\n",
+ "MATRIX[1]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "TFeD3jSDafm7",
+ "outputId": "69b44ab3-5ba7-451a-c6b2-f019a03d0c96"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([ 9, 10])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 11
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Tensor\n",
+ "TENSOR = torch.tensor([[[1, 2, 3],[3,6,9], [2,4,5]]])\n",
+ "TENSOR"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ic3cE47tah42",
+ "outputId": "f250e295-91de-43ec-9d80-588a6fe0abde"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[[1, 2, 3],\n",
+ " [3, 6, 9],\n",
+ " [2, 4, 5]]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 12
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "TENSOR.shape"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Wvjf5fczbAM1",
+ "outputId": "9c72b5b8-bafe-4ae7-9883-b051e209eada"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "torch.Size([1, 3, 3])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 13
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "TENSOR.ndim"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "mwtXZwiMbN3m",
+ "outputId": "331a5e36-b1b0-4a5f-a9b8-e7049cbaa8f9"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "3"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 14
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "TENSOR[0]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "vzdZu_IfbP3J",
+ "outputId": "e24e7e71-e365-412d-ff50-fc094b56d2f3"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[1, 2, 3],\n",
+ " [3, 6, 9],\n",
+ " [2, 4, 5]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 15
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "A8OL9eWfcRrJ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "random_tensor = torch.rand(3,4)\n",
+ "random_tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "hAqSDE1EcVS_",
+ "outputId": "946171c3-d054-400c-f893-79110356888c"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[0.4414, 0.7681, 0.8385, 0.3166],\n",
+ " [0.0468, 0.5812, 0.0670, 0.9173],\n",
+ " [0.2959, 0.3276, 0.7411, 0.4643]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 16
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "random_tensor.ndim"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "g4fvPE5GcwzP",
+ "outputId": "8737f36b-6864-4059-eaed-6f9156c22306"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "2"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 17
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "random_tensor.shape"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "XsAg99QmdAU6",
+ "outputId": "35467c11-257c-4f16-99aa-eca930bcbc36"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "torch.Size([3, 4])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 18
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "random_tensor.size()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "cii1pNdVdB68",
+ "outputId": "fc8d2de6-9215-43de-99f7-7b0d7f7d20fa"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "torch.Size([3, 4])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 19
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "random_image_tensor = torch.rand(size=(3, 224, 224)) #color channels, height, width\n",
+ "random_image_tensor.ndim, random_image_tensor.shape"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "aTKq2j0cdDjb",
+ "outputId": "6be42057-20b9-4faf-d79d-8b65c42cc27e"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(3, torch.Size([3, 224, 224]))"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 20
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "random_tensor_ofownsize = torch.rand(size=(5,10,10))\n",
+ "random_tensor_ofownsize.ndim, random_tensor_ofownsize.shape\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "IyhDdj-Pd6nC",
+ "outputId": "43e5e334-6d4d-4b67-f87d-7d364c6d8c67"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(3, torch.Size([5, 10, 10]))"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 21
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "UOJW08uOert_"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "zero = torch.zeros(size=(3, 4))\n",
+ "zero"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "uGvXtaXyefie",
+ "outputId": "d40d3e28-8667-4d2f-8b62-f0829c6162ad"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[0., 0., 0., 0.],\n",
+ " [0., 0., 0., 0.],\n",
+ " [0., 0., 0., 0.]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 22
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "zero*random_tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "OyUkUPkDe0uH",
+ "outputId": "26c2e4be-36ba-4c6c-9a90-2704ec135828"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[0., 0., 0., 0.],\n",
+ " [0., 0., 0., 0.],\n",
+ " [0., 0., 0., 0.]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 23
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "ones = torch.ones(size=(3, 4))\n",
+ "ones\n"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "y_Ac62Aqe82G",
+ "outputId": "291de5d9-b9df-49de-c9d1-d098e3e9f4d8"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[1., 1., 1., 1.],\n",
+ " [1., 1., 1., 1.],\n",
+ " [1., 1., 1., 1.]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 24
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "ones.dtype"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "TvGOA9odfIEO",
+ "outputId": "45949ef4-6649-4b6c-d6af-2d4bfb8de832"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "torch.float32"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 25
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "ones*zero"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "--pTyge-fI-8",
+ "outputId": "c4d9bb7e-829b-43db-e2db-b1a2d64e61f0"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[0., 0., 0., 0.],\n",
+ " [0., 0., 0., 0.],\n",
+ " [0., 0., 0., 0.]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 26
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "qDcc7Z36fSJF"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "one_to_ten = torch.arange(start = 1, end = 11, step = 1)\n",
+ "one_to_ten"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "w3CZB4zUfR1s",
+ "outputId": "197fcba1-da0a-4b4a-ed11-3974bd6c01aa"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 27
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "ten_zeros = torch.zeros_like(one_to_ten)\n",
+ "ten_zeros"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "WZh99BwVfRy8",
+ "outputId": "51ef8bfb-6fa0-4099-ff66-b97d65b2ddea"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 28
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "টেনসর ডেটাটাইপস\n"
+ ],
+ "metadata": {
+ "id": "pGGhgsbUgqbW"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "float_32_tensor = torch.tensor([3.0, 6.0,9.0], dtype = None, device = None, requires_grad = False)\n",
+ "float_32_tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "JORJl4XkfRsx",
+ "outputId": "71114171-0f49-481f-b6fc-6cb48e2fb895"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([3., 6., 9.])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 29
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "float_32_tensor.dtype"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "6wOPPwGyfRLn",
+ "outputId": "f23776a1-b682-404a-9f67-d5bcb0402666"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "torch.float32"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 30
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "float_16_tensor = float_32_tensor.type(torch.float16)\n",
+ "float_16_tensor.dtype"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "tFsHCvmZfOYe",
+ "outputId": "d3aa305a-7591-47f5-97fd-61bff60b44bd"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "torch.float16"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 31
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "float_16_tensor*float_32_tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "TQiCGTPuwq0q",
+ "outputId": "98750fce-1ca3-4889-e269-8b753efdea96"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([ 9., 36., 81.])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 32
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "int_32_tensor = torch.tensor([3, 6, 9], dtype = torch.int32)\n",
+ "int_32_tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "5hlrLvGUw5D_",
+ "outputId": "41d890a0-9aee-446c-d906-631ce2ab0995"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([3, 6, 9], dtype=torch.int32)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 33
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "int_32_tensor*float_32_tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ihApD9u3xTNW",
+ "outputId": "d295eed0-6996-4e0f-8502-ff4b55cd1373"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([ 9., 36., 81.])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 34
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x = torch.arange(0,100,10)"
+ ],
+ "metadata": {
+ "id": "utKhlb_KxWDQ"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "p78D74E9Rj7Y",
+ "outputId": "781a1614-a900-41f5-9e5d-358f0b2390aa"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 36
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x.min()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "4BcSs5NeRkcj",
+ "outputId": "3f24a8dc-58e9-4a5f-9834-e85856a34f9d"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(0)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 37
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x.max()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "hinqvXVLRm4q",
+ "outputId": "5c7d8a53-3913-4ac1-bba3-5ba8ff68250a"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(90)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 38
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "torch.mean(x.type(torch.float32))"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "k7okc0_vRpnB",
+ "outputId": "91e5494f-dc57-417c-ea4d-25dbc547c893"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(45.)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 39
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x.type(torch.float32).mean()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "29QcDTjHRq10",
+ "outputId": "62937c6c-78e0-49f2-dde3-1543ee8f7907"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(45.)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 40
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x.sum()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "wlpY_G_sbdKF",
+ "outputId": "475d8258-af65-4011-a258-b93d4d8142d4"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(450)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 41
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x.argmax()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "GT6HJzwhbk4n",
+ "outputId": "2e455c20-c322-4bcf-d07c-1259d3ccefc6"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(9)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 42
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x.argmin()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "egL3oi2Mb19P",
+ "outputId": "f71fb32f-6338-44a3-b377-75bea0a3ab54"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(0)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 43
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x[0]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "p2U8DZKib3DP",
+ "outputId": "b9f613b9-74e9-45f4-ed01-05babb6a6793"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(0)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 44
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x[9]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "24qBFlGYcABe",
+ "outputId": "5813cfcb-7f63-4bd7-ee46-f95ccbfda939"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(90)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 45
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x = torch.arange(1, 10)\n",
+ "x.shape"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "0GPOxEzkcBHO",
+ "outputId": "aefbd903-4f4c-4d2c-c90f-eccd682fe018"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "torch.Size([9])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 46
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_reshaped = x.reshape(1,9)\n",
+ "x_reshaped, x_reshaped.shape"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "spmRgQjwddgp",
+ "outputId": "85a7c55c-2909-4ea2-fc68-386dddc65742"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9]]), torch.Size([1, 9]))"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 47
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_reshaped.view(1,9)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "tH2ahWGydqqP",
+ "outputId": "65d92263-4fc4-434a-c06d-c5e08436f7fe"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 48
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_stacked = torch.stack([x, x, x, x], dim = 1)\n",
+ "x_stacked"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "jgCeJcaud_-1",
+ "outputId": "7f293a37-6ef1-43b6-aee5-9d6d91c94f9e"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[1, 1, 1, 1],\n",
+ " [2, 2, 2, 2],\n",
+ " [3, 3, 3, 3],\n",
+ " [4, 4, 4, 4],\n",
+ " [5, 5, 5, 5],\n",
+ " [6, 6, 6, 6],\n",
+ " [7, 7, 7, 7],\n",
+ " [8, 8, 8, 8],\n",
+ " [9, 9, 9, 9]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 49
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_stacked.squeeze()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "XhJHIK6cfPse",
+ "outputId": "06c47b89-3a9e-453e-bcc3-00cbcb0b8b49"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[1, 1, 1, 1],\n",
+ " [2, 2, 2, 2],\n",
+ " [3, 3, 3, 3],\n",
+ " [4, 4, 4, 4],\n",
+ " [5, 5, 5, 5],\n",
+ " [6, 6, 6, 6],\n",
+ " [7, 7, 7, 7],\n",
+ " [8, 8, 8, 8],\n",
+ " [9, 9, 9, 9]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 50
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_stacked.unsqueeze(dim=1)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ej2c3Xxzf0tq",
+ "outputId": "94024061-eb37-446d-c4a8-e4d16cb6de81"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[[1, 1, 1, 1]],\n",
+ "\n",
+ " [[2, 2, 2, 2]],\n",
+ "\n",
+ " [[3, 3, 3, 3]],\n",
+ "\n",
+ " [[4, 4, 4, 4]],\n",
+ "\n",
+ " [[5, 5, 5, 5]],\n",
+ "\n",
+ " [[6, 6, 6, 6]],\n",
+ "\n",
+ " [[7, 7, 7, 7]],\n",
+ "\n",
+ " [[8, 8, 8, 8]],\n",
+ "\n",
+ " [[9, 9, 9, 9]]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 52
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_stacked.squeeze()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "4DJYo1a0f5M0",
+ "outputId": "efca2b47-1b14-44de-9a9a-2c83629d153f"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[1, 1, 1, 1],\n",
+ " [2, 2, 2, 2],\n",
+ " [3, 3, 3, 3],\n",
+ " [4, 4, 4, 4],\n",
+ " [5, 5, 5, 5],\n",
+ " [6, 6, 6, 6],\n",
+ " [7, 7, 7, 7],\n",
+ " [8, 8, 8, 8],\n",
+ " [9, 9, 9, 9]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 53
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_stacked.unsqueeze(dim=-2)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "J4iEjn2ah2HL",
+ "outputId": "22395593-7c16-4162-beae-dd2bbe7bda35"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[[1, 1, 1, 1]],\n",
+ "\n",
+ " [[2, 2, 2, 2]],\n",
+ "\n",
+ " [[3, 3, 3, 3]],\n",
+ "\n",
+ " [[4, 4, 4, 4]],\n",
+ "\n",
+ " [[5, 5, 5, 5]],\n",
+ "\n",
+ " [[6, 6, 6, 6]],\n",
+ "\n",
+ " [[7, 7, 7, 7]],\n",
+ "\n",
+ " [[8, 8, 8, 8]],\n",
+ "\n",
+ " [[9, 9, 9, 9]]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 55
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import torch\n",
+ "tensor = torch.tensor([1, 2, 3])\n",
+ "tensor = tensor - 10\n",
+ "tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "cFfiD7Nth7Z_",
+ "outputId": "1139e1f8-fc1a-46ca-d636-f2bc4fd2eef6"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([-9, -8, -7])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 7
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "torch.mul(tensor, 10)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "dyA7BM_GHhqE",
+ "outputId": "0e3b9671-d9e8-4a32-87bb-59bc05986142"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([-90, -80, -70])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 9
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "torch.sub(tensor, 100)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "owtUsZ1KNegI",
+ "outputId": "189b7b23-0041-4e09-b991-cd209a48506a"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([-109, -108, -107])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 10
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "torch.add(tensor, 100)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "K5STXlQONsyc",
+ "outputId": "00cbb79a-0a1d-4e21-86ec-5c91c37a2d01"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([91, 92, 93])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 11
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "torch.divide(tensor, 2)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "xqMGnzIUNvp0",
+ "outputId": "c894cf3e-f148-45f8-cfc8-d78740735306"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([-4.5000, -4.0000, -3.5000])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 13
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "torch.matmul(tensor, tensor)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ruGzKpV8NyBc",
+ "outputId": "fddb63bf-006f-48b6-ae28-287fbcda8bc5"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(194)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 15
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "tensor@tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "8GS3r9yTeGfD",
+ "outputId": "c80b12ac-30b5-4f3d-c38c-9e41ba511b0e"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(194)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 16
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "%%time\n",
+ "tensor@tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "QmuYHqXTemC0",
+ "outputId": "402fe3ba-70b5-4bb2-c83b-254db84ff810"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "CPU times: user 622 µs, sys: 0 ns, total: 622 µs\n",
+ "Wall time: 516 µs\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(194)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 17
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "%%time\n",
+ "torch.matmul(tensor,tensor)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "dGr1fzdNepd8",
+ "outputId": "97bd6c91-bc25-4b38-cdf5-f22dcdef243e"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "CPU times: user 424 µs, sys: 998 µs, total: 1.42 ms\n",
+ "Wall time: 1.43 ms\n"
+ ]
+ },
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(194)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 18
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "torch.rand(3,2)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "pGYDoK2gevfo",
+ "outputId": "2c8783d5-0453-47c5-c7ed-af10d25d6989"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[0.5999, 0.0073],\n",
+ " [0.9321, 0.3026],\n",
+ " [0.3463, 0.3872]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 20
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "torch.matmul(torch.rand(3,2), torch.rand(2,3))"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "KGBGQoB8e2DP",
+ "outputId": "4c2ef361-a2d0-41ee-c328-3992cbbc138d"
+ },
+ "execution_count": null,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[0.3528, 0.1893, 0.0714],\n",
+ " [1.2791, 0.7110, 0.2563],\n",
+ " [0.8812, 0.4553, 0.1803]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 23
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import torch"
+ ],
+ "metadata": {
+ "id": "ib8DMtkBe_LJ"
+ },
+ "execution_count": 1,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x = torch.rand(2,9)"
+ ],
+ "metadata": {
+ "id": "nJo8ZBdrQY1b"
+ },
+ "execution_count": 2,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "wi6oRv4MQfgf",
+ "outputId": "55c99f55-31f6-4cf5-ba4e-19a47c3a0167"
+ },
+ "execution_count": 3,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[0.5894, 0.4391, 0.2018, 0.5417, 0.3844, 0.3592, 0.9209, 0.9269, 0.0681],\n",
+ " [0.0746, 0.1740, 0.6821, 0.6890, 0.0999, 0.7444, 0.2391, 0.4625, 0.8302]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 3
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "y=torch.randn(2,3,5)\n",
+ "y"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Zpx8myAUQgoc",
+ "outputId": "07756d70-56bd-437c-c74e-9aecc1a77311"
+ },
+ "execution_count": 5,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[[ 1.5552, -0.4877, 0.5175, -1.7958, -0.6187],\n",
+ " [-0.3359, -1.9710, 0.0112, -1.7578, -1.5295],\n",
+ " [ 0.0932, 1.4079, 0.9108, 0.3328, -0.6978]],\n",
+ "\n",
+ " [[-0.9406, -1.0809, -0.2595, 0.1282, 1.6605],\n",
+ " [ 1.1624, 1.0902, 1.7092, -0.2842, -1.3780],\n",
+ " [-0.1534, -1.2795, -0.5495, 0.9902, 0.1822]]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 5
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_original = torch.rand(size=(224,224,3))\n",
+ "x_original"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "s4U-X9bJQnWe",
+ "outputId": "657a7a76-962c-4b41-a76b-902d0482266c"
+ },
+ "execution_count": 6,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[[0.4549, 0.6809, 0.2118],\n",
+ " [0.4824, 0.9008, 0.8741],\n",
+ " [0.1715, 0.1757, 0.1845],\n",
+ " ...,\n",
+ " [0.8741, 0.6594, 0.2610],\n",
+ " [0.0092, 0.1984, 0.1955],\n",
+ " [0.4236, 0.4182, 0.0251]],\n",
+ "\n",
+ " [[0.9174, 0.1661, 0.5852],\n",
+ " [0.1837, 0.2351, 0.3810],\n",
+ " [0.3726, 0.4808, 0.8732],\n",
+ " ...,\n",
+ " [0.6794, 0.0554, 0.9202],\n",
+ " [0.0864, 0.8750, 0.3558],\n",
+ " [0.8445, 0.9759, 0.4934]],\n",
+ "\n",
+ " [[0.1600, 0.2635, 0.7194],\n",
+ " [0.9488, 0.3405, 0.3647],\n",
+ " [0.6683, 0.5168, 0.9592],\n",
+ " ...,\n",
+ " [0.0521, 0.0140, 0.2445],\n",
+ " [0.3596, 0.3999, 0.2730],\n",
+ " [0.5926, 0.9877, 0.7784]],\n",
+ "\n",
+ " ...,\n",
+ "\n",
+ " [[0.4794, 0.5635, 0.3764],\n",
+ " [0.9124, 0.6094, 0.5059],\n",
+ " [0.4528, 0.4447, 0.5021],\n",
+ " ...,\n",
+ " [0.0089, 0.4816, 0.8727],\n",
+ " [0.2173, 0.6296, 0.2347],\n",
+ " [0.2028, 0.9931, 0.7201]],\n",
+ "\n",
+ " [[0.3116, 0.6459, 0.4703],\n",
+ " [0.0148, 0.2345, 0.7149],\n",
+ " [0.8393, 0.5804, 0.6691],\n",
+ " ...,\n",
+ " [0.2105, 0.9460, 0.2696],\n",
+ " [0.5918, 0.9295, 0.2616],\n",
+ " [0.2537, 0.7819, 0.4700]],\n",
+ "\n",
+ " [[0.6654, 0.1200, 0.5841],\n",
+ " [0.9147, 0.5522, 0.6529],\n",
+ " [0.1799, 0.5276, 0.5415],\n",
+ " ...,\n",
+ " [0.7536, 0.4346, 0.8793],\n",
+ " [0.3793, 0.1750, 0.7792],\n",
+ " [0.9266, 0.8325, 0.9974]]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 6
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_permuted=x_original.permute(2, 0, 1)\n",
+ "print(x_original.shape)\n",
+ "print(x_permuted.shape)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "DD19_zvbQzHo",
+ "outputId": "1d64ce1b-eb48-47e3-90b6-7f1340e7f2b2"
+ },
+ "execution_count": 9,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "torch.Size([224, 224, 3])\n",
+ "torch.Size([3, 224, 224])\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_original[0,0,0]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "NnPmMk4ZRF7w",
+ "outputId": "2cd5da7f-4a23-4a76-8c4a-bb982113f2a4"
+ },
+ "execution_count": 10,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(0.4549)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 10
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_permuted[0,0,0]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Z0ylNoAARgTo",
+ "outputId": "ddca0298-cddf-4048-9b71-a791655e5bed"
+ },
+ "execution_count": 11,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(0.4549)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 11
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_original[0,0,0]=0.989"
+ ],
+ "metadata": {
+ "id": "RXw0xXsDRi4L"
+ },
+ "execution_count": 13,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_original[0,0,0]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "1sFdV6wzRo3f",
+ "outputId": "1cf87d2c-6d88-453a-d136-0f625a2800f1"
+ },
+ "execution_count": 14,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(0.9890)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 14
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x_permuted[0,0,0]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "xTX-hx2SR1wp",
+ "outputId": "0d4908c4-c3bc-44e3-8ec6-1487104cc209"
+ },
+ "execution_count": 15,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(0.9890)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 15
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x=torch.arange(1,10).reshape(1,3,3)\n",
+ "x, x.shape"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "mZomOe7gR4Q8",
+ "outputId": "0b3c922f-ec11-46de-b8a5-9f9533d866ad"
+ },
+ "execution_count": 18,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(tensor([[[1, 2, 3],\n",
+ " [4, 5, 6],\n",
+ " [7, 8, 9]]]),\n",
+ " torch.Size([1, 3, 3]))"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 18
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x[0]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "3y7v4SQvSBs1",
+ "outputId": "8c53307d-e628-404d-db66-56c6bdffab7c"
+ },
+ "execution_count": 19,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([[1, 2, 3],\n",
+ " [4, 5, 6],\n",
+ " [7, 8, 9]])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 19
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x[0][0]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "hf9uG4xLSNya",
+ "outputId": "3075bc42-9ffa-426b-8a86-95628ffcd824"
+ },
+ "execution_count": 21,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([1, 2, 3])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 21
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x[0][0][0]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "zA4G2Se4SRB3",
+ "outputId": "324312d2-ed0a-49eb-f81f-e904e53992fe"
+ },
+ "execution_count": 22,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(1)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 22
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x[0][2][2]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Mwy3zmKKSdbk",
+ "outputId": "d35172c3-b099-40a6-ddf1-a453c2adfa44"
+ },
+ "execution_count": 23,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor(9)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 23
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x[:,1,1]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "fE3nCM1KS7XT",
+ "outputId": "01f5d755-9737-4235-9f73-dce89ff6ba16"
+ },
+ "execution_count": 24,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([5])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 24
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x[0,0,:]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "luNDINKNTTxp",
+ "outputId": "091195ef-2f71-4602-e95f-529a69193150"
+ },
+ "execution_count": 25,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([1, 2, 3])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 25
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "x[0,:,2]"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "KG8A4xbfThCL",
+ "outputId": "5866bc41-9241-4619-be7b-e9206b3f80ab"
+ },
+ "execution_count": 26,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([3, 6, 9])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 26
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import numpy as np"
+ ],
+ "metadata": {
+ "id": "CZ3PX0qlTwHJ"
+ },
+ "execution_count": 27,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "array = np.arange(1.0, 8.0)"
+ ],
+ "metadata": {
+ "id": "UOBeTumiT3Lf"
+ },
+ "execution_count": 28,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "array"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "RzcO32E9UCQl",
+ "outputId": "430def24-c42c-461f-e5e7-398544c695d3"
+ },
+ "execution_count": 29,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([1., 2., 3., 4., 5., 6., 7.])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 29
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "tensor = torch.from_numpy(array)\n",
+ "tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "JJIL0q1DUC6O",
+ "outputId": "8a3b1d7c-4482-4d32-f34f-9212d9d3a177"
+ },
+ "execution_count": 32,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([1., 2., 3., 4., 5., 6., 7.], dtype=torch.float64)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 32
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "array[3]=11.0"
+ ],
+ "metadata": {
+ "id": "j3Ce6q3DUIEK"
+ },
+ "execution_count": 33,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "array"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "dc_BCVdjUsCc",
+ "outputId": "65537325-8b11-4f36-fc73-e56f30d6a036"
+ },
+ "execution_count": 34,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([ 1., 2., 3., 11., 5., 6., 7.])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 34
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "tensor"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "VG1e_eITUta2",
+ "outputId": "a26c5198-23b6-4a6d-d73a-ba20cd9782b8"
+ },
+ "execution_count": 35,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([ 1., 2., 3., 11., 5., 6., 7.], dtype=torch.float64)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 35
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "tensor = torch.ones(7)\n",
+ "tensor, tensor.dtype\n",
+ "numpy_tensor = tensor.numpy()\n",
+ "numpy_tensor, numpy_tensor.dtype"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Swt8JF8vUuev",
+ "outputId": "c9e5bf6a-6d2c-41d6-8327-366867ffdd2d"
+ },
+ "execution_count": 37,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(array([1., 1., 1., 1., 1., 1., 1.], dtype=float32), dtype('float32'))"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 37
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import torch\n",
+ "random_tensor_A = torch.rand(3,4)\n",
+ "random_tensor_B = torch.rand(3,4)\n",
+ "print(random_tensor_A)\n",
+ "print(random_tensor_B)\n",
+ "print(random_tensor_A == random_tensor_B)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "uGcagTteVFTD",
+ "outputId": "49405790-08e7-4210-b7f1-f00b904c7eb9"
+ },
+ "execution_count": 38,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "tensor([[0.9870, 0.6636, 0.6873, 0.8863],\n",
+ " [0.8386, 0.4169, 0.3587, 0.0265],\n",
+ " [0.2981, 0.6025, 0.5652, 0.5840]])\n",
+ "tensor([[0.9821, 0.3481, 0.0913, 0.4940],\n",
+ " [0.7495, 0.4387, 0.9582, 0.8659],\n",
+ " [0.5064, 0.6919, 0.0809, 0.9771]])\n",
+ "tensor([[False, False, False, False],\n",
+ " [False, False, False, False],\n",
+ " [False, False, False, False]])\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "RANDOM_SEED = 42\n",
+ "torch.manual_seed(RANDOM_SEED)\n",
+ "random_tensor_C = torch.rand(3,4)\n",
+ "torch.manual_seed(RANDOM_SEED)\n",
+ "random_tensor_D = torch.rand(3,4)\n",
+ "print(random_tensor_C)\n",
+ "print(random_tensor_D)\n",
+ "print(random_tensor_C == random_tensor_D)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "HznyXyEaWjLM",
+ "outputId": "25956434-01b6-4059-9054-c9978884ddc1"
+ },
+ "execution_count": 46,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "tensor([[0.8823, 0.9150, 0.3829, 0.9593],\n",
+ " [0.3904, 0.6009, 0.2566, 0.7936],\n",
+ " [0.9408, 0.1332, 0.9346, 0.5936]])\n",
+ "tensor([[0.8823, 0.9150, 0.3829, 0.9593],\n",
+ " [0.3904, 0.6009, 0.2566, 0.7936],\n",
+ " [0.9408, 0.1332, 0.9346, 0.5936]])\n",
+ "tensor([[True, True, True, True],\n",
+ " [True, True, True, True],\n",
+ " [True, True, True, True]])\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "!nvidia-smi"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "vltPTh0YXJSt",
+ "outputId": "807af6dc-a9ca-4301-ec32-b688dbde8be8"
+ },
+ "execution_count": 2,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Thu May 23 02:57:59 2024 \n",
+ "+---------------------------------------------------------------------------------------+\n",
+ "| NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |\n",
+ "|-----------------------------------------+----------------------+----------------------+\n",
+ "| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |\n",
+ "| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |\n",
+ "| | | MIG M. |\n",
+ "|=========================================+======================+======================|\n",
+ "| 0 Tesla T4 Off | 00000000:00:04.0 Off | 0 |\n",
+ "| N/A 60C P8 11W / 70W | 0MiB / 15360MiB | 0% Default |\n",
+ "| | | N/A |\n",
+ "+-----------------------------------------+----------------------+----------------------+\n",
+ " \n",
+ "+---------------------------------------------------------------------------------------+\n",
+ "| Processes: |\n",
+ "| GPU GI CI PID Type Process name GPU Memory |\n",
+ "| ID ID Usage |\n",
+ "|=======================================================================================|\n",
+ "| No running processes found |\n",
+ "+---------------------------------------------------------------------------------------+\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "import torch\n",
+ "torch.cuda.is_available()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "L6mMyPDyYh1j",
+ "outputId": "279c5dd8-c2a8-4fbd-f321-2f5d7c6e90e6"
+ },
+ "execution_count": 3,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 3
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
+ "device"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 35
+ },
+ "id": "oOdiYa7ZYytx",
+ "outputId": "d73b04fc-8963-4826-9722-08d118d5ab91"
+ },
+ "execution_count": 5,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "'cuda'"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "string"
+ }
+ },
+ "metadata": {},
+ "execution_count": 5
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "torch.cuda.device_count()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "vOdsazLqZFM5",
+ "outputId": "8189cd6a-9017-4663-a652-3e15c517d9c3"
+ },
+ "execution_count": 6,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "1"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 6
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "tensor = torch.tensor([1,2,3], device = \"cpu\")\n",
+ "print(tensor, tensor.device)"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "cdik9Vw3ZMv0",
+ "outputId": "044a68fd-83a1-409d-8e3b-655142ca0270"
+ },
+ "execution_count": 7,
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "tensor([1, 2, 3]) cpu\n"
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "tensor_on_gpu = tensor.to(device)\n",
+ "tensor_on_gpu"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "Zmp835rrZp-z",
+ "outputId": "37fa3413-18a3-47bf-ae51-5b36ff85a3ef"
+ },
+ "execution_count": 8,
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "tensor([1, 2, 3], device='cuda:0')"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 8
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "tensor_on_gpu.numpy()"
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 159
+ },
+ "id": "jhriaa8uZ1yM",
+ "outputId": "bc5a3226-1a12-4fea-8769-a44f21cdc323"
+ },
+ "execution_count": 10,
+ "outputs": [
+ {
+ "output_type": "error",
+ "ename": "TypeError",
+ "evalue": "can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtensor_on_gpu\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnumpy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mTypeError\u001b[0m: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first."
+ ]
+ }
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "tensor_on_cpu = tensor_on_gpu.cpu().numpy()"
+ ],
+ "metadata": {
+ "id": "LHGXK3GgaOzL"
+ },
+ "execution_count": 12,
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "source": [],
+ "metadata": {
+ "id": "j-El4LlCajfq"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/bn/README.md b/translations/bn/README.md
new file mode 100644
index 000000000..026392868
--- /dev/null
+++ b/translations/bn/README.md
@@ -0,0 +1,177 @@
+
+[](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE)
+[](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/)
+[](https://GitHub.com/microsoft/ML-For-Beginners/issues/)
+[](https://GitHub.com/microsoft/ML-For-Beginners/pulls/)
+[](http://makeapullrequest.com)
+
+[](https://GitHub.com/microsoft/ML-For-Beginners/watchers/)
+[](https://GitHub.com/microsoft/ML-For-Beginners/network/)
+[](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/)
+
+### 🌐 বহু ভাষার সমর্থন
+
+#### GitHub Action এর মাধ্যমে সমর্থিত (স্বয়ংক্রিয় এবং সর্বদা আপডেটেড)
+
+[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](../ar/README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](./README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](../th/README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md)
+
+#### কমিউনিটিতে যোগ দিন
+
+[](https://discord.gg/kzRShWzttr)
+
+# শিক্ষার্থীদের জন্য মেশিন লার্নিং - একটি পাঠক্রম
+
+> 🌍 বিশ্ব সংস্কৃতির মাধ্যমে মেশিন লার্নিং অন্বেষণ করার সময় আমাদের সাথে ভ্রমণ করুন 🌍
+
+Microsoft-এর Cloud Advocates আপনাদের জন্য ১২ সপ্তাহের, ২৬টি পাঠের একটি পাঠক্রম নিয়ে এসেছে যা সম্পূর্ণ **মেশিন লার্নিং** নিয়ে। এই পাঠক্রমে, আপনি **ক্লাসিক মেশিন লার্নিং** নামে পরিচিত বিষয়টি শিখবেন, যেখানে প্রধানত Scikit-learn লাইব্রেরি ব্যবহার করা হবে এবং ডিপ লার্নিং এড়ানো হবে, যা আমাদের [AI for Beginners' পাঠক্রমে](https://aka.ms/ai4beginners) অন্তর্ভুক্ত। এই পাঠগুলো আমাদের ['Data Science for Beginners' পাঠক্রমের](https://aka.ms/ds4beginners) সাথে জোড়া লাগিয়ে নিন!
+
+আমাদের সাথে বিশ্বজুড়ে ভ্রমণ করুন এবং এই ক্লাসিক কৌশলগুলো বিভিন্ন অঞ্চলের ডেটার উপর প্রয়োগ করুন। প্রতিটি পাঠে রয়েছে প্রাক-পাঠ এবং পর-পাঠ কুইজ, লিখিত নির্দেশনা, সমাধান, অ্যাসাইনমেন্ট এবং আরও অনেক কিছু। আমাদের প্রকল্প-ভিত্তিক শিক্ষাদান পদ্ধতি আপনাকে শেখার সময় তৈরি করতে সাহায্য করে, যা নতুন দক্ষতা অর্জনের একটি প্রমাণিত উপায়।
+
+**✍️ আমাদের লেখকদের প্রতি আন্তরিক ধন্যবাদ** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu এবং Amy Boyd
+
+**🎨 আমাদের চিত্রশিল্পীদের প্রতি ধন্যবাদ** Tomomi Imura, Dasani Madipalli, এবং Jen Looper
+
+**🙏 Microsoft Student Ambassador লেখক, পর্যালোচক এবং বিষয়বস্তু অবদানকারীদের প্রতি বিশেষ ধন্যবাদ**, বিশেষত Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila, এবং Snigdha Agarwal
+
+**🤩 Microsoft Student Ambassadors Eric Wanjau, Jasleen Sondhi, এবং Vidushi Gupta-কে আমাদের R পাঠের জন্য অতিরিক্ত কৃতজ্ঞতা!**
+
+# শুরু করার জন্য
+
+এই ধাপগুলো অনুসরণ করুন:
+1. **রিপোজিটরি ফর্ক করুন**: এই পৃষ্ঠার উপরের ডানদিকে "Fork" বোতামে ক্লিক করুন।
+2. **রিপোজিটরি ক্লোন করুন**: `git clone https://github.com/microsoft/ML-For-Beginners.git`
+
+> [এই কোর্সের জন্য সমস্ত অতিরিক্ত সম্পদ Microsoft Learn সংগ্রহে খুঁজুন](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
+
+**[শিক্ষার্থীরা](https://aka.ms/student-page)**, এই পাঠক্রমটি ব্যবহার করতে, সম্পূর্ণ রিপোজিটরি আপনার নিজস্ব GitHub অ্যাকাউন্টে ফর্ক করুন এবং নিজের বা একটি দলের সাথে অনুশীলন সম্পন্ন করুন:
+
+- প্রাক-পাঠ কুইজ দিয়ে শুরু করুন।
+- পাঠটি পড়ুন এবং কার্যক্রম সম্পন্ন করুন, প্রতিটি জ্ঞান যাচাইয়ের সময় বিরতি দিন এবং চিন্তা করুন।
+- পাঠগুলো বুঝে প্রকল্প তৈরি করার চেষ্টা করুন, সমাধান কোড চালানোর পরিবর্তে; তবে সেই কোড `/solution` ফোল্ডারে প্রকল্প-ভিত্তিক পাঠে উপলব্ধ।
+- পর-পাঠ কুইজ নিন।
+- চ্যালেঞ্জ সম্পন্ন করুন।
+- অ্যাসাইনমেন্ট সম্পন্ন করুন।
+- একটি পাঠ গোষ্ঠী সম্পন্ন করার পরে, [Discussion Board](https://github.com/microsoft/ML-For-Beginners/discussions)-এ যান এবং "শিখুন" PAT রুব্রিক পূরণ করে। একটি 'PAT' হল একটি Progress Assessment Tool যা আপনি আপনার শেখার উন্নতির জন্য পূরণ করেন। আপনি অন্যান্য PAT-এ প্রতিক্রিয়া জানাতে পারেন যাতে আমরা একসাথে শিখতে পারি।
+
+> আরও অধ্যয়নের জন্য, আমরা এই [Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott) মডিউল এবং শেখার পথ অনুসরণ করার পরামর্শ দিই।
+
+**শিক্ষকগণ**, আমরা এই পাঠক্রমটি কীভাবে ব্যবহার করবেন তার জন্য [কিছু পরামর্শ](for-teachers.md) অন্তর্ভুক্ত করেছি।
+
+---
+
+## ভিডিও ওয়াকথ্রু
+
+কিছু পাঠ সংক্ষিপ্ত ভিডিও আকারে উপলব্ধ। আপনি এই ভিডিওগুলো পাঠের মধ্যে বা [Microsoft Developer YouTube চ্যানেলের ML for Beginners প্লেলিস্টে](https://aka.ms/ml-beginners-videos) খুঁজে পেতে পারেন।
+
+[](https://aka.ms/ml-beginners-videos)
+
+---
+
+## টিমের সাথে পরিচিত হন
+
+[](https://youtu.be/Tj1XWrDSYJU)
+
+**Gif তৈরি করেছেন** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal)
+
+> 🎥 উপরের ছবিতে ক্লিক করুন প্রকল্প এবং যারা এটি তৈরি করেছেন তাদের সম্পর্কে একটি ভিডিও দেখতে!
+
+---
+
+## শিক্ষাদান পদ্ধতি
+
+আমরা এই পাঠক্রম তৈরি করার সময় দুটি শিক্ষাদান নীতি বেছে নিয়েছি: এটি হাতে-কলমে **প্রকল্প-ভিত্তিক** এবং এতে **প্রায়শই কুইজ** অন্তর্ভুক্ত রয়েছে। এছাড়াও, এই পাঠক্রমে একটি সাধারণ **থিম** রয়েছে যা এটিকে সংহতি প্রদান করে।
+
+প্রকল্পের সাথে সামঞ্জস্য রেখে বিষয়বস্তু নিশ্চিত করার মাধ্যমে, শিক্ষার্থীদের জন্য প্রক্রিয়াটি আরও আকর্ষণীয় হয়ে ওঠে এবং ধারণার ধারণক্ষমতা বৃদ্ধি পায়। এছাড়াও, একটি ক্লাসের আগে একটি কম ঝুঁকির কুইজ শিক্ষার্থীর একটি বিষয় শেখার উদ্দেশ্য স্থাপন করে, যখন ক্লাসের পরে একটি দ্বিতীয় কুইজ আরও ধারণক্ষমতা নিশ্চিত করে। এই পাঠক্রমটি নমনীয় এবং মজাদার করার জন্য ডিজাইন করা হয়েছে এবং এটি সম্পূর্ণ বা আংশিকভাবে নেওয়া যেতে পারে। প্রকল্পগুলো ছোট থেকে শুরু হয় এবং ১২ সপ্তাহের চক্রের শেষে ক্রমশ জটিল হয়ে ওঠে। এই পাঠক্রমে ML-এর বাস্তব জীবনের প্রয়োগের উপর একটি পোস্টস্ক্রিপ্টও অন্তর্ভুক্ত রয়েছে, যা অতিরিক্ত ক্রেডিট হিসাবে বা আলোচনার ভিত্তি হিসাবে ব্যবহার করা যেতে পারে।
+
+> আমাদের [Code of Conduct](CODE_OF_CONDUCT.md), [Contributing](CONTRIBUTING.md), এবং [Translation](TRANSLATIONS.md) নির্দেশিকা খুঁজুন। আমরা আপনার গঠনমূলক প্রতিক্রিয়া স্বাগত জানাই!
+
+## প্রতিটি পাঠে অন্তর্ভুক্ত রয়েছে
+
+- ঐচ্ছিক স্কেচনোট
+- ঐচ্ছিক সম্পূরক ভিডিও
+- ভিডিও ওয়াকথ্রু (কিছু পাঠে)
+- প্রাক-পাঠ প্রস্তুতি কুইজ
+- লিখিত পাঠ
+- প্রকল্প-ভিত্তিক পাঠের জন্য, প্রকল্পটি কীভাবে তৈরি করবেন তার ধাপে ধাপে নির্দেশিকা
+- জ্ঞান যাচাই
+- একটি চ্যালেঞ্জ
+- সম্পূরক পাঠ্য
+- অ্যাসাইনমেন্ট
+- পর-পাঠ কুইজ
+
+> **ভাষা সম্পর্কে একটি নোট**: এই পাঠগুলো প্রধানত Python-এ লেখা হয়েছে, তবে অনেকগুলো R-এও উপলব্ধ। একটি R পাঠ সম্পন্ন করতে, `/solution` ফোল্ডারে যান এবং R পাঠগুলো খুঁজুন। এগুলোতে `.rmd` এক্সটেনশন রয়েছে যা **R Markdown** ফাইলকে উপস্থাপন করে যা `কোড চাঙ্ক` (R বা অন্যান্য ভাষার) এবং একটি `YAML হেডার` (যা আউটপুট যেমন PDF ফরম্যাট করার নির্দেশ দেয়) একটি `Markdown ডকুমেন্ট`-এ এম্বেডিং হিসাবে সংজ্ঞায়িত করা যেতে পারে। এটি ডেটা সায়েন্সের জন্য একটি উদাহরণমূলক লেখার কাঠামো হিসাবে কাজ করে কারণ এটি আপনাকে আপনার কোড, এর আউটপুট এবং আপনার চিন্তাগুলো Markdown-এ লিখতে দেয়। তদ্ব্যতীত, R Markdown ডকুমেন্টগুলো PDF, HTML, বা Word-এর মতো আউটপুট ফরম্যাটে রেন্ডার করা যেতে পারে।
+
+> **কুইজ সম্পর্কে একটি নোট**: সমস্ত কুইজ [Quiz App ফোল্ডারে](../../quiz-app) অন্তর্ভুক্ত রয়েছে, মোট ৫২টি কুইজ, প্রতিটিতে তিনটি প্রশ্ন। এগুলো পাঠের মধ্যে থেকে লিঙ্ক করা হয়েছে তবে কুইজ অ্যাপটি স্থানীয়ভাবে চালানো যেতে পারে; `quiz-app` ফোল্ডারে নির্দেশনা অনুসরণ করে এটি স্থানীয়ভাবে হোস্ট করুন বা Azure-এ ডিপ্লয় করুন।
+
+| পাঠ নম্বর | বিষয় | পাঠ গোষ্ঠী | শেখার উদ্দেশ্য | লিঙ্ককৃত পাঠ | লেখক |
+| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: |
+| 01 | মেশিন লার্নিং-এর পরিচিতি | [Introduction](1-Introduction/README.md) | মেশিন লার্নিং-এর মৌলিক ধারণাগুলো শিখুন | [Lesson](1-Introduction/1-intro-to-ML/README.md) | Muhammad |
+| 02 | মেশিন লার্নিং-এর ইতিহাস | [Introduction](1-Introduction/README.md) | এই ক্ষেত্রের অন্তর্নিহিত ইতিহাস শিখুন | [Lesson](1-Introduction/2-history-of-ML/README.md) | Jen এবং Amy |
+| 03 | মেশিন লার্নিং এবং ন্যায্যতা | [Introduction](1-Introduction/README.md) | ন্যায্যতার চারপাশে গুরুত্বপূর্ণ দার্শনিক বিষয়গুলো কী যা শিক্ষার্থীদের ML মডেল তৈরি এবং প্রয়োগ করার সময় বিবেচনা করা উচিত? | [Lesson](1-Introduction/3-fairness/README.md) | Tomomi |
+| 04 | মেশিন লার্নিং-এর কৌশল | [Introduction](1-Introduction/README.md) | ML গবেষকরা মডেল তৈরি করতে কী কৌশল ব্যবহার করেন? | [Lesson](1-Introduction/4-techniques-of-ML/README.md) | Chris এবং Jen |
+| 05 | রিগ্রেশন পরিচিতি | [Regression](2-Regression/README.md) | রিগ্রেশন মডেলের জন্য পাইথন এবং স্কিকিট-লার্ন দিয়ে শুরু করুন |
+
|
+| 16 | প্রাকৃতিক ভাষা প্রক্রিয়াকরণে পরিচিতি ☕️ | [Natural language processing](6-NLP/README.md) | একটি সাধারণ বট তৈরি করে NLP সম্পর্কে মৌলিক ধারণা শিখুন | [Python](6-NLP/1-Introduction-to-NLP/README.md) | স্টিফেন |
+| 17 | সাধারণ NLP কাজ ☕️ | [Natural language processing](6-NLP/README.md) | ভাষার কাঠামো নিয়ে কাজ করার সময় প্রয়োজনীয় সাধারণ কাজগুলি বোঝার মাধ্যমে আপনার NLP জ্ঞান গভীর করুন | [Python](6-NLP/2-Tasks/README.md) | স্টিফেন |
+| 18 | অনুবাদ এবং অনুভূতি বিশ্লেষণ ♥️ | [Natural language processing](6-NLP/README.md) | জেন অস্টেনের সাথে অনুবাদ এবং অনুভূতি বিশ্লেষণ | [Python](6-NLP/3-Translation-Sentiment/README.md) | স্টিফেন |
+| 19 | ইউরোপের রোমান্টিক হোটেল ♥️ | [Natural language processing](6-NLP/README.md) | হোটেল রিভিউয়ের সাথে অনুভূতি বিশ্লেষণ ১ | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | স্টিফেন |
+| 20 | ইউরোপের রোমান্টিক হোটেল ♥️ | [Natural language processing](6-NLP/README.md) | হোটেল রিভিউয়ের সাথে অনুভূতি বিশ্লেষণ ২ | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | স্টিফেন |
+| 21 | টাইম সিরিজ পূর্বাভাসে পরিচিতি | [Time series](7-TimeSeries/README.md) | টাইম সিরিজ পূর্বাভাসে পরিচিতি | [Python](7-TimeSeries/1-Introduction/README.md) | ফ্রান্সেসকা |
+| 22 | ⚡️ বিশ্ব বিদ্যুৎ ব্যবহার ⚡️ - ARIMA সহ টাইম সিরিজ পূর্বাভাস | [Time series](7-TimeSeries/README.md) | ARIMA সহ টাইম সিরিজ পূর্বাভাস | [Python](7-TimeSeries/2-ARIMA/README.md) | ফ্রান্সেসকা |
+| 23 | ⚡️ বিশ্ব বিদ্যুৎ ব্যবহার ⚡️ - SVR সহ টাইম সিরিজ পূর্বাভাস | [Time series](7-TimeSeries/README.md) | সাপোর্ট ভেক্টর রিগ্রেসর সহ টাইম সিরিজ পূর্বাভাস | [Python](7-TimeSeries/3-SVR/README.md) | অনির্বাণ |
+| 24 | রিইনফোর্সমেন্ট লার্নিংয়ে পরিচিতি | [Reinforcement learning](8-Reinforcement/README.md) | কিউ-লার্নিং সহ রিইনফোর্সমেন্ট লার্নিংয়ে পরিচিতি | [Python](8-Reinforcement/1-QLearning/README.md) | দিমিত্রি |
+| 25 | পিটারকে নেকড়ে থেকে বাঁচান! 🐺 | [Reinforcement learning](8-Reinforcement/README.md) | রিইনফোর্সমেন্ট লার্নিং জিম | [Python](8-Reinforcement/2-Gym/README.md) | দিমিত্রি |
+| Postscript | বাস্তব জীবনের মেশিন লার্নিং দৃশ্য এবং প্রয়োগ | [ML in the Wild](9-Real-World/README.md) | ক্লাসিক্যাল মেশিন লার্নিংয়ের আকর্ষণীয় এবং প্রকাশক বাস্তব জীবনের প্রয়োগ | [Lesson](9-Real-World/1-Applications/README.md) | টিম |
+| Postscript | RAI ড্যাশবোর্ড ব্যবহার করে মডেল ডিবাগিং | [ML in the Wild](9-Real-World/README.md) | রেসপন্সিবল এআই ড্যাশবোর্ড কম্পোনেন্ট ব্যবহার করে মেশিন লার্নিংয়ে মডেল ডিবাগিং | [Lesson](9-Real-World/2-Debugging-ML-Models/README.md) | রুথ ইয়াকুব |
+
+> [এই কোর্সের জন্য সমস্ত অতিরিক্ত সম্পদ আমাদের Microsoft Learn সংগ্রহে খুঁজুন](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
+
+## অফলাইন অ্যাক্সেস
+
+আপনি [Docsify](https://docsify.js.org/#/) ব্যবহার করে এই ডকুমেন্টেশনটি অফলাইনে চালাতে পারেন। এই রিপোজিটরি ফর্ক করুন, আপনার লোকাল মেশিনে [Docsify ইনস্টল করুন](https://docsify.js.org/#/quickstart), এবং তারপর এই রিপোজিটরির রুট ফোল্ডারে `docsify serve` টাইপ করুন। ওয়েবসাইটটি আপনার লোকালহোস্টে পোর্ট ৩০০০-এ পরিবেশন করা হবে: `localhost:3000`।
+
+## পিডিএফ
+
+লিঙ্ক সহ কারিকুলামের একটি পিডিএফ [এখানে](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf) খুঁজুন।
+
+## 🎒 অন্যান্য কোর্সসমূহ
+
+আমাদের টিম অন্যান্য কোর্স তৈরি করে! দেখুন:
+
+- [Generative AI for Beginners](https://aka.ms/genai-beginners)
+- [Generative AI for Beginners .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet)
+- [Generative AI with JavaScript](https://github.com/microsoft/generative-ai-with-javascript)
+- [Generative AI with Java](https://github.com/microsoft/Generative-AI-for-beginners-java)
+- [AI for Beginners](https://aka.ms/ai-beginners)
+- [Data Science for Beginners](https://aka.ms/datascience-beginners)
+- [ML for Beginners](https://aka.ms/ml-beginners)
+- [Cybersecurity for Beginners](https://github.com/microsoft/Security-101)
+- [Web Dev for Beginners](https://aka.ms/webdev-beginners)
+- [IoT for Beginners](https://aka.ms/iot-beginners)
+- [XR Development for Beginners](https://github.com/microsoft/xr-development-for-beginners)
+- [Mastering GitHub Copilot for Paired Programming](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming)
+- [Mastering GitHub Copilot for C#/.NET Developers](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers)
+- [Choose Your Own Copilot Adventure](https://github.com/microsoft/CopilotAdventures)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/SECURITY.md b/translations/bn/SECURITY.md
new file mode 100644
index 000000000..23ee854ee
--- /dev/null
+++ b/translations/bn/SECURITY.md
@@ -0,0 +1,51 @@
+
+## নিরাপত্তা
+
+মাইক্রোসফট আমাদের সফটওয়্যার পণ্য এবং পরিষেবার নিরাপত্তাকে অত্যন্ত গুরুত্ব দেয়, যার মধ্যে রয়েছে আমাদের GitHub সংগঠনগুলোর মাধ্যমে পরিচালিত সমস্ত সোর্স কোড রিপোজিটরি। এই সংগঠনগুলোর মধ্যে রয়েছে [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), এবং [আমাদের GitHub সংগঠনগুলো](https://opensource.microsoft.com/)।
+
+আপনি যদি মনে করেন যে আপনি মাইক্রোসফটের মালিকানাধীন কোনো রিপোজিটরিতে একটি নিরাপত্তা দুর্বলতা খুঁজে পেয়েছেন যা [মাইক্রোসফটের নিরাপত্তা দুর্বলতার সংজ্ঞা](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott) পূরণ করে, তাহলে নিচে বর্ণিত পদ্ধতিতে আমাদের কাছে রিপোর্ট করুন।
+
+## নিরাপত্তা সমস্যা রিপোর্ট করা
+
+**অনুগ্রহ করে পাবলিক GitHub ইস্যুর মাধ্যমে নিরাপত্তা দুর্বলতা রিপোর্ট করবেন না।**
+
+এর পরিবর্তে, মাইক্রোসফট সিকিউরিটি রেসপন্স সেন্টার (MSRC)-এ রিপোর্ট করুন: [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report)।
+
+যদি আপনি লগ ইন না করে রিপোর্ট জমা দিতে চান, তাহলে [secure@microsoft.com](mailto:secure@microsoft.com) ইমেইল করুন। সম্ভব হলে, আমাদের PGP কী দিয়ে আপনার বার্তা এনক্রিপ্ট করুন; এটি [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc) থেকে ডাউনলোড করুন।
+
+আপনি ২৪ ঘণ্টার মধ্যে একটি উত্তর পাবেন। যদি কোনো কারণে না পান, তাহলে নিশ্চিত করতে ইমেইলের মাধ্যমে অনুসরণ করুন যে আমরা আপনার মূল বার্তা পেয়েছি। অতিরিক্ত তথ্য [microsoft.com/msrc](https://www.microsoft.com/msrc) এ পাওয়া যাবে।
+
+অনুগ্রহ করে নিচে তালিকাভুক্ত তথ্য (যতটা সম্ভব প্রদান করতে পারেন) অন্তর্ভুক্ত করুন যাতে আমরা সম্ভাব্য সমস্যার প্রকৃতি এবং পরিসর আরও ভালোভাবে বুঝতে পারি:
+
+ * সমস্যার ধরন (যেমন বাফার ওভারফ্লো, SQL ইনজেকশন, ক্রস-সাইট স্ক্রিপ্টিং ইত্যাদি)
+ * সমস্যার প্রকাশের সাথে সম্পর্কিত সোর্স ফাইলের পূর্ণ পথ
+ * প্রভাবিত সোর্স কোডের অবস্থান (ট্যাগ/ব্রাঞ্চ/কমিট বা সরাসরি URL)
+ * সমস্যাটি পুনরুত্পাদন করতে প্রয়োজনীয় বিশেষ কনফিগারেশন
+ * সমস্যাটি পুনরুত্পাদনের ধাপে ধাপে নির্দেশনা
+ * প্রুফ-অফ-কনসেপ্ট বা এক্সপ্লয়েট কোড (যদি সম্ভব হয়)
+ * সমস্যার প্রভাব, যার মধ্যে রয়েছে কীভাবে একজন আক্রমণকারী সমস্যাটি কাজে লাগাতে পারে
+
+এই তথ্য আমাদের রিপোর্ট দ্রুত যাচাই করতে সাহায্য করবে।
+
+যদি আপনি বাগ বাউন্টির জন্য রিপোর্ট করছেন, তাহলে আরও সম্পূর্ণ রিপোর্ট একটি উচ্চতর বাউন্টি পুরস্কারে অবদান রাখতে পারে। আমাদের সক্রিয় প্রোগ্রাম সম্পর্কে আরও বিস্তারিত জানতে [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) পৃষ্ঠাটি দেখুন।
+
+## পছন্দের ভাষা
+
+আমরা সমস্ত যোগাযোগ ইংরেজিতে করতে পছন্দ করি।
+
+## নীতি
+
+মাইক্রোসফট [সমন্বিত দুর্বলতা প্রকাশের](https://www.microsoft.com/en-us/msrc/cvd) নীতির অনুসরণ করে।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/SUPPORT.md b/translations/bn/SUPPORT.md
new file mode 100644
index 000000000..242af1eb0
--- /dev/null
+++ b/translations/bn/SUPPORT.md
@@ -0,0 +1,24 @@
+
+# সহায়তা
+## কীভাবে সমস্যা জানাবেন এবং সাহায্য পাবেন
+
+এই প্রকল্পটি বাগ এবং ফিচার অনুরোধ ট্র্যাক করার জন্য GitHub Issues ব্যবহার করে। নতুন সমস্যা জানানোর আগে বিদ্যমান সমস্যাগুলি অনুসন্ধান করুন যাতে ডুপ্লিকেট এড়ানো যায়। নতুন সমস্যার জন্য, আপনার বাগ বা ফিচার অনুরোধ একটি নতুন Issue হিসেবে জমা দিন।
+
+এই প্রকল্প ব্যবহার সম্পর্কে সাহায্য এবং প্রশ্নের জন্য, একটি Issue জমা দিন।
+
+## মাইক্রোসফট সাপোর্ট নীতি
+
+এই রিপোজিটরির জন্য সহায়তা শুধুমাত্র উপরে তালিকাভুক্ত রিসোর্সগুলিতে সীমাবদ্ধ।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/docs/_sidebar.md b/translations/bn/docs/_sidebar.md
new file mode 100644
index 000000000..bd5499609
--- /dev/null
+++ b/translations/bn/docs/_sidebar.md
@@ -0,0 +1,57 @@
+
+- পরিচিতি
+ - [মেশিন লার্নিং এর পরিচিতি](../1-Introduction/1-intro-to-ML/README.md)
+ - [মেশিন লার্নিং এর ইতিহাস](../1-Introduction/2-history-of-ML/README.md)
+ - [মেশিন লার্নিং এবং ন্যায্যতা](../1-Introduction/3-fairness/README.md)
+ - [মেশিন লার্নিং এর কৌশল](../1-Introduction/4-techniques-of-ML/README.md)
+
+- রিগ্রেশন
+ - [প্রয়োজনীয় সরঞ্জাম](../2-Regression/1-Tools/README.md)
+ - [ডেটা](../2-Regression/2-Data/README.md)
+ - [লিনিয়ার রিগ্রেশন](../2-Regression/3-Linear/README.md)
+ - [লজিস্টিক রিগ্রেশন](../2-Regression/4-Logistic/README.md)
+
+- একটি ওয়েব অ্যাপ তৈরি করুন
+ - [ওয়েব অ্যাপ](../3-Web-App/1-Web-App/README.md)
+
+- শ্রেণীবিভাগ
+ - [শ্রেণীবিভাগের পরিচিতি](../4-Classification/1-Introduction/README.md)
+ - [ক্লাসিফায়ার ১](../4-Classification/2-Classifiers-1/README.md)
+ - [ক্লাসিফায়ার ২](../4-Classification/3-Classifiers-2/README.md)
+ - [প্রয়োগকৃত মেশিন লার্নিং](../4-Classification/4-Applied/README.md)
+
+- ক্লাস্টারিং
+ - [আপনার ডেটা ভিজুয়ালাইজ করুন](../5-Clustering/1-Visualize/README.md)
+ - [কে-মিন্স](../5-Clustering/2-K-Means/README.md)
+
+- এনএলপি
+ - [এনএলপি এর পরিচিতি](../6-NLP/1-Introduction-to-NLP/README.md)
+ - [এনএলপি টাস্ক](../6-NLP/2-Tasks/README.md)
+ - [অনুবাদ এবং অনুভূতি](../6-NLP/3-Translation-Sentiment/README.md)
+ - [হোটেল রিভিউ ১](../6-NLP/4-Hotel-Reviews-1/README.md)
+ - [হোটেল রিভিউ ২](../6-NLP/5-Hotel-Reviews-2/README.md)
+
+- টাইম সিরিজ পূর্বাভাস
+ - [টাইম সিরিজ পূর্বাভাসের পরিচিতি](../7-TimeSeries/1-Introduction/README.md)
+ - [এআরআইএমএ](../7-TimeSeries/2-ARIMA/README.md)
+ - [এসভিআর](../7-TimeSeries/3-SVR/README.md)
+
+- রিইনফোর্সমেন্ট লার্নিং
+ - [কিউ-লার্নিং](../8-Reinforcement/1-QLearning/README.md)
+ - [জিম](../8-Reinforcement/2-Gym/README.md)
+
+- বাস্তব জীবনের মেশিন লার্নিং
+ - [প্রয়োগসমূহ](../9-Real-World/1-Applications/README.md)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় লেখা সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ ব্যবহার করার পরামর্শ দেওয়া হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
\ No newline at end of file
diff --git a/translations/bn/for-teachers.md b/translations/bn/for-teachers.md
new file mode 100644
index 000000000..4053a6225
--- /dev/null
+++ b/translations/bn/for-teachers.md
@@ -0,0 +1,37 @@
+
+## শিক্ষকদের জন্য
+
+আপনি কি আপনার ক্লাসরুমে এই পাঠ্যক্রমটি ব্যবহার করতে চান? নির্দ্বিধায় ব্যবহার করুন!
+
+আসলে, আপনি এটি GitHub-এর মাধ্যমেই ব্যবহার করতে পারেন GitHub Classroom ব্যবহার করে।
+
+এটি করতে, এই রিপোজিটরিটি ফর্ক করুন। আপনাকে প্রতিটি পাঠের জন্য একটি রিপোজিটরি তৈরি করতে হবে, তাই আপনাকে প্রতিটি ফোল্ডার আলাদা রিপোজিটরিতে বের করতে হবে। এভাবে, [GitHub Classroom](https://classroom.github.com/classrooms) প্রতিটি পাঠ আলাদাভাবে নিতে পারবে।
+
+এই [সম্পূর্ণ নির্দেশাবলী](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) আপনাকে ক্লাসরুম সেটআপ করার ধারণা দেবে।
+
+## রিপোজিটরি বর্তমান অবস্থায় ব্যবহার করা
+
+আপনি যদি GitHub Classroom ব্যবহার না করে এই রিপোজিটরিটি বর্তমান অবস্থায় ব্যবহার করতে চান, সেটিও সম্ভব। আপনাকে আপনার শিক্ষার্থীদের জানাতে হবে কোন পাঠটি একসঙ্গে কাজ করতে হবে।
+
+অনলাইন ফরম্যাটে (Zoom, Teams, বা অন্য কিছু) আপনি কুইজের জন্য ব্রেকআউট রুম তৈরি করতে পারেন এবং শিক্ষার্থীদের শেখার জন্য প্রস্তুত করতে মেন্টর করতে পারেন। তারপর শিক্ষার্থীদের কুইজের জন্য আমন্ত্রণ জানান এবং নির্দিষ্ট সময়ে তাদের উত্তর 'ইস্যু' হিসেবে জমা দিতে বলুন। আপনি একই কাজ অ্যাসাইনমেন্টের জন্যও করতে পারেন, যদি আপনি চান শিক্ষার্থীরা খোলামেলা পরিবেশে একসঙ্গে কাজ করুক।
+
+যদি আপনি আরও ব্যক্তিগত ফরম্যাট পছন্দ করেন, তাহলে আপনার শিক্ষার্থীদের পাঠ্যক্রমটি পাঠ ধরে ধরে তাদের নিজস্ব GitHub রিপোজিটরিতে ফর্ক করতে বলুন, যা প্রাইভেট রিপোজিটরি হবে, এবং আপনাকে অ্যাক্সেস দিন। এরপর তারা কুইজ এবং অ্যাসাইনমেন্টগুলো ব্যক্তিগতভাবে সম্পন্ন করতে পারবে এবং আপনার ক্লাসরুম রিপোজিটরিতে ইস্যুর মাধ্যমে সেগুলো জমা দিতে পারবে।
+
+অনলাইন ক্লাসরুম ফরম্যাটে এটি কাজ করার অনেক উপায় আছে। আমাদের জানান কোনটি আপনার জন্য সবচেয়ে ভালো কাজ করে!
+
+## আমাদের আপনার মতামত দিন!
+
+আমরা চাই এই পাঠ্যক্রমটি আপনার এবং আপনার শিক্ষার্থীদের জন্য কার্যকর হোক। আমাদের [মতামত দিন](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u)।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতা নিশ্চিত করার চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/quiz-app/README.md b/translations/bn/quiz-app/README.md
new file mode 100644
index 000000000..a2158e3cd
--- /dev/null
+++ b/translations/bn/quiz-app/README.md
@@ -0,0 +1,127 @@
+
+# কুইজ
+
+এই কুইজগুলো ML কারিকুলামের প্রাক-লেকচার এবং পোস্ট-লেকচার কুইজ, যা পাওয়া যাবে https://aka.ms/ml-beginners এ।
+
+## প্রজেক্ট সেটআপ
+
+```
+npm install
+```
+
+### ডেভেলপমেন্টের জন্য কম্পাইল এবং হট-রিলোড
+
+```
+npm run serve
+```
+
+### প্রোডাকশনের জন্য কম্পাইল এবং মিনিফাই
+
+```
+npm run build
+```
+
+### ফাইল লিন্ট এবং ফিক্স
+
+```
+npm run lint
+```
+
+### কনফিগারেশন কাস্টমাইজ করুন
+
+[Configuration Reference](https://cli.vuejs.org/config/) দেখুন।
+
+ক্রেডিট: এই কুইজ অ্যাপের মূল সংস্করণের জন্য ধন্যবাদ: https://github.com/arpan45/simple-quiz-vue
+
+## Azure-এ ডিপ্লয় করা
+
+এখানে একটি ধাপে ধাপে গাইড দেওয়া হলো যা আপনাকে শুরু করতে সাহায্য করবে:
+
+1. একটি GitHub রিপোজিটরি ফর্ক করুন
+আপনার স্ট্যাটিক ওয়েব অ্যাপ কোডটি আপনার GitHub রিপোজিটরিতে থাকতে হবে। এই রিপোজিটরিটি ফর্ক করুন।
+
+2. একটি Azure স্ট্যাটিক ওয়েব অ্যাপ তৈরি করুন
+- একটি [Azure অ্যাকাউন্ট](http://azure.microsoft.com) তৈরি করুন
+- [Azure পোর্টাল](https://portal.azure.com) এ যান
+- “Create a resource” এ ক্লিক করুন এবং “Static Web App” অনুসন্ধান করুন।
+- “Create” এ ক্লিক করুন।
+
+3. স্ট্যাটিক ওয়েব অ্যাপ কনফিগার করুন
+- #### বেসিকস:
+ - Subscription: আপনার Azure সাবস্ক্রিপশন নির্বাচন করুন।
+ - Resource Group: একটি নতুন রিসোর্স গ্রুপ তৈরি করুন অথবা বিদ্যমানটি ব্যবহার করুন।
+ - Name: আপনার স্ট্যাটিক ওয়েব অ্যাপের জন্য একটি নাম দিন।
+ - Region: আপনার ব্যবহারকারীদের কাছাকাছি অঞ্চল নির্বাচন করুন।
+
+- #### ডিপ্লয়মেন্ট ডিটেইলস:
+ - Source: “GitHub” নির্বাচন করুন।
+ - GitHub Account: Azure-কে আপনার GitHub অ্যাকাউন্টে অ্যাক্সেস করার অনুমতি দিন।
+ - Organization: আপনার GitHub অর্গানাইজেশন নির্বাচন করুন।
+ - Repository: আপনার স্ট্যাটিক ওয়েব অ্যাপের রিপোজিটরি নির্বাচন করুন।
+ - Branch: যে ব্রাঞ্চ থেকে ডিপ্লয় করতে চান তা নির্বাচন করুন।
+
+- #### বিল্ড ডিটেইলস:
+ - Build Presets: আপনার অ্যাপটি যে ফ্রেমওয়ার্ক দিয়ে তৈরি (যেমন React, Angular, Vue ইত্যাদি) তা নির্বাচন করুন।
+ - App Location: আপনার অ্যাপ কোডের অবস্থান নির্ধারণ করুন (যেমন, / যদি এটি রুটে থাকে)।
+ - API Location: যদি আপনার API থাকে, তার অবস্থান নির্ধারণ করুন (ঐচ্ছিক)।
+ - Output Location: যেখানে বিল্ড আউটপুট তৈরি হয় সেই ফোল্ডার নির্ধারণ করুন (যেমন, build বা dist)।
+
+4. রিভিউ এবং তৈরি করুন
+আপনার সেটিংস রিভিউ করুন এবং “Create” এ ক্লিক করুন। Azure প্রয়োজনীয় রিসোর্স সেটআপ করবে এবং আপনার রিপোজিটরিতে একটি GitHub Actions ওয়ার্কফ্লো তৈরি করবে।
+
+5. GitHub Actions ওয়ার্কফ্লো
+Azure স্বয়ংক্রিয়ভাবে আপনার রিপোজিটরিতে একটি GitHub Actions ওয়ার্কফ্লো ফাইল তৈরি করবে (.github/workflows/azure-static-web-apps-.yml)। এই ওয়ার্কফ্লো বিল্ড এবং ডিপ্লয়মেন্ট প্রক্রিয়া পরিচালনা করবে।
+
+6. ডিপ্লয়মেন্ট মনিটর করুন
+আপনার GitHub রিপোজিটরির “Actions” ট্যাবে যান।
+আপনার একটি ওয়ার্কফ্লো চলমান দেখতে পাবেন। এই ওয়ার্কফ্লো আপনার স্ট্যাটিক ওয়েব অ্যাপকে Azure-এ বিল্ড এবং ডিপ্লয় করবে।
+ওয়ার্কফ্লো সম্পন্ন হলে, আপনার অ্যাপটি প্রদত্ত Azure URL-এ লাইভ হবে।
+
+### উদাহরণ ওয়ার্কফ্লো ফাইল
+
+এখানে GitHub Actions ওয়ার্কফ্লো ফাইলের একটি উদাহরণ দেওয়া হলো:
+name: Azure Static Web Apps CI/CD
+```
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ types: [opened, synchronize, reopened, closed]
+ branches:
+ - main
+
+jobs:
+ build_and_deploy_job:
+ runs-on: ubuntu-latest
+ name: Build and Deploy Job
+ steps:
+ - uses: actions/checkout@v2
+ - name: Build And Deploy
+ id: builddeploy
+ uses: Azure/static-web-apps-deploy@v1
+ with:
+ azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
+ repo_token: ${{ secrets.GITHUB_TOKEN }}
+ action: "upload"
+ app_location: "/quiz-app" # App source code path
+ api_location: ""API source code path optional
+ output_location: "dist" #Built app content directory - optional
+```
+
+### অতিরিক্ত রিসোর্স
+- [Azure Static Web Apps Documentation](https://learn.microsoft.com/azure/static-web-apps/getting-started)
+- [GitHub Actions Documentation](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/bn/sketchnotes/LICENSE.md b/translations/bn/sketchnotes/LICENSE.md
new file mode 100644
index 000000000..240472db9
--- /dev/null
+++ b/translations/bn/sketchnotes/LICENSE.md
@@ -0,0 +1,201 @@
+
+অ্যাট্রিবিউশন-শেয়ারঅ্যালাইক ৪.০ ইন্টারন্যাশনাল
+
+=======================================================================
+
+ক্রিয়েটিভ কমন্স কর্পোরেশন ("ক্রিয়েটিভ কমন্স") একটি আইন সংস্থা নয় এবং আইনি সেবা বা পরামর্শ প্রদান করে না। ক্রিয়েটিভ কমন্স পাবলিক লাইসেন্স বিতরণ আইনজীবী-গ্রাহক বা অন্য কোনো সম্পর্ক তৈরি করে না। ক্রিয়েটিভ কমন্স তাদের লাইসেন্স এবং সংশ্লিষ্ট তথ্য "যেমন আছে" ভিত্তিতে প্রদান করে। ক্রিয়েটিভ কমন্স তাদের লাইসেন্স, লাইসেন্সের শর্তাবলীর অধীনে লাইসেন্সকৃত কোনো উপাদান, বা সংশ্লিষ্ট তথ্য সম্পর্কে কোনো গ্যারান্টি দেয় না। ক্রিয়েটিভ কমন্স তাদের ব্যবহারের ফলে সৃষ্ট ক্ষতির জন্য সম্পূর্ণ সীমার মধ্যে দায় অস্বীকার করে।
+
+ক্রিয়েটিভ কমন্স পাবলিক লাইসেন্স ব্যবহার
+
+ক্রিয়েটিভ কমন্স পাবলিক লাইসেন্স একটি মানসম্মত শর্তাবলী প্রদান করে যা সৃষ্টিকর্তা এবং অন্যান্য অধিকারধারীরা তাদের মূল সৃষ্টিকর্ম এবং কপিরাইট এবং নীচে উল্লিখিত নির্দিষ্ট অন্যান্য অধিকার সাপেক্ষে উপাদান ভাগ করার জন্য ব্যবহার করতে পারেন। নিম্নলিখিত বিবেচনাগুলি শুধুমাত্র তথ্যের উদ্দেশ্যে, সম্পূর্ণ নয় এবং আমাদের লাইসেন্সের অংশ নয়।
+
+ লাইসেন্সদাতাদের জন্য বিবেচনা: আমাদের পাবলিক লাইসেন্সগুলি
+ তাদের জন্য তৈরি যারা কপিরাইট এবং নির্দিষ্ট অন্যান্য
+ অধিকার দ্বারা সীমাবদ্ধ উপাদান ব্যবহারের জন্য জনসাধারণকে
+ অনুমতি দিতে অনুমোদিত। আমাদের লাইসেন্স অপরিবর্তনীয়।
+ লাইসেন্সদাতাদের তাদের নির্বাচিত লাইসেন্স প্রয়োগ করার
+ আগে এর শর্তাবলী পড়া এবং বোঝা উচিত। লাইসেন্সদাতাদের
+ লাইসেন্স প্রয়োগ করার আগে প্রয়োজনীয় সমস্ত অধিকার
+ সুরক্ষিত করা উচিত যাতে জনসাধারণ প্রত্যাশিতভাবে উপাদানটি
+ পুনরায় ব্যবহার করতে পারে। লাইসেন্সের আওতায় না থাকা
+ কোনো উপাদান স্পষ্টভাবে চিহ্নিত করা উচিত। এর মধ্যে
+ অন্তর্ভুক্ত রয়েছে অন্যান্য CC-লাইসেন্সকৃত উপাদান,
+ বা কপিরাইটের ব্যতিক্রম বা সীমাবদ্ধতার অধীনে ব্যবহৃত
+ উপাদান। লাইসেন্সদাতাদের জন্য আরও বিবেচনা:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ জনসাধারণের জন্য বিবেচনা: আমাদের পাবলিক লাইসেন্সগুলির
+ একটি ব্যবহার করে, একটি লাইসেন্সদাতা নির্দিষ্ট শর্তাবলী
+ এবং শর্তাবলীর অধীনে লাইসেন্সকৃত উপাদান ব্যবহারের জন্য
+ জনসাধারণকে অনুমতি প্রদান করে। যদি লাইসেন্সদাতার
+ অনুমতি কোনো কারণে প্রয়োজন না হয়—উদাহরণস্বরূপ,
+ কপিরাইটের কোনো প্রযোজ্য ব্যতিক্রম বা সীমাবদ্ধতার কারণে—
+ তবে সেই ব্যবহার লাইসেন্স দ্বারা নিয়ন্ত্রিত নয়।
+ আমাদের লাইসেন্স কেবল কপিরাইট এবং নির্দিষ্ট অন্যান্য
+ অধিকারগুলির অধীনে অনুমতি প্রদান করে যা একটি লাইসেন্সদাতা
+ প্রদান করার ক্ষমতা রাখে। লাইসেন্সকৃত উপাদানের ব্যবহার
+ অন্য কারণে এখনও সীমাবদ্ধ থাকতে পারে, যার মধ্যে রয়েছে
+ অন্যদের কপিরাইট বা উপাদানের উপর অন্যান্য অধিকার থাকা।
+ একটি লাইসেন্সদাতা বিশেষ অনুরোধ করতে পারে, যেমন সমস্ত
+ পরিবর্তন চিহ্নিত বা বর্ণনা করার জন্য বলা। যদিও আমাদের
+ লাইসেন্সগুলির দ্বারা এটি প্রয়োজন হয় না, আপনি যুক্তিসঙ্গত
+ ক্ষেত্রে সেই অনুরোধগুলিকে সম্মান করতে উৎসাহিত।
+ জনসাধারণের জন্য আরও বিবেচনা:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ারঅ্যালাইক ৪.০ ইন্টারন্যাশনাল পাবলিক লাইসেন্স
+
+লাইসেন্সকৃত অধিকার (নিচে সংজ্ঞায়িত) প্রয়োগ করার মাধ্যমে, আপনি এই ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ারঅ্যালাইক ৪.০ ইন্টারন্যাশনাল পাবলিক লাইসেন্স ("পাবলিক লাইসেন্স") এর শর্তাবলীর অধীনে আবদ্ধ হতে সম্মত হন। এই পাবলিক লাইসেন্সকে একটি চুক্তি হিসাবে ব্যাখ্যা করা হলে, আপনি এই শর্তাবলী গ্রহণের বিনিময়ে লাইসেন্সকৃত অধিকার প্রদান করা হয়, এবং লাইসেন্সদাতা এই শর্তাবলীর অধীনে লাইসেন্সকৃত উপাদান উপলব্ধ করার মাধ্যমে প্রাপ্ত সুবিধার বিনিময়ে আপনাকে এই অধিকার প্রদান করে।
+
+### ধারা ১ -- সংজ্ঞা।
+
+ a. **পরিবর্তিত উপাদান** বলতে বোঝায় এমন উপাদান যা কপিরাইট এবং অনুরূপ অধিকার সাপেক্ষে এবং যা লাইসেন্সকৃত উপাদান থেকে উদ্ভূত বা ভিত্তিক এবং যেখানে লাইসেন্সকৃত উপাদান অনুবাদ, পরিবর্তন, বিন্যাস, রূপান্তর বা অন্য কোনোভাবে সংশোধিত হয় যা কপিরাইট এবং অনুরূপ অধিকারধারীর অনুমতি প্রয়োজন।
+
+ b. **পরিবর্তকের লাইসেন্স** বলতে বোঝায় আপনার কপিরাইট এবং অনুরূপ অধিকার যা আপনি পরিবর্তিত উপাদানে আপনার অবদানের জন্য প্রয়োগ করেন এই পাবলিক লাইসেন্সের শর্তাবলীর অধীনে।
+
+ c. **BY-SA সামঞ্জস্যপূর্ণ লাইসেন্স** বলতে বোঝায় একটি লাইসেন্স যা creativecommons.org/compatiblelicenses এ তালিকাভুক্ত, যা ক্রিয়েটিভ কমন্স দ্বারা এই পাবলিক লাইসেন্সের সমতুল্য হিসাবে অনুমোদিত।
+
+ d. **কপিরাইট এবং অনুরূপ অধিকার** বলতে বোঝায় কপিরাইট এবং/অথবা কপিরাইটের সাথে ঘনিষ্ঠভাবে সম্পর্কিত অধিকার, যার মধ্যে অন্তর্ভুক্ত রয়েছে, কিন্তু সীমাবদ্ধ নয়, পারফরম্যান্স, সম্প্রচার, শব্দ রেকর্ডিং এবং Sui Generis ডেটাবেস অধিকার।
+
+ e. **কার্যকর প্রযুক্তিগত ব্যবস্থা** বলতে বোঝায় এমন ব্যবস্থা যা, যথাযথ কর্তৃপক্ষের অনুপস্থিতিতে, ২০ ডিসেম্বর, ১৯৯৬ তারিখে গৃহীত WIPO কপিরাইট চুক্তির ১১ অনুচ্ছেদের অধীনে আইন পূরণের অধীনে বাইপাস করা যাবে না।
+
+ f. **ব্যতিক্রম এবং সীমাবদ্ধতা** বলতে বোঝায় ন্যায্য ব্যবহার, ন্যায্য চুক্তি, এবং/অথবা কপিরাইট এবং অনুরূপ অধিকারগুলির জন্য প্রযোজ্য অন্য কোনো ব্যতিক্রম বা সীমাবদ্ধতা যা আপনার লাইসেন্সকৃত উপাদানের ব্যবহারের জন্য প্রযোজ্য।
+
+ g. **লাইসেন্স উপাদান** বলতে বোঝায় ক্রিয়েটিভ কমন্স পাবলিক লাইসেন্সের নামের মধ্যে তালিকাভুক্ত লাইসেন্স বৈশিষ্ট্য।
+
+ h. **লাইসেন্সকৃত উপাদান** বলতে বোঝায় শিল্পকর্ম বা সাহিত্যকর্ম, ডেটাবেস, বা অন্য কোনো উপাদান যা লাইসেন্সদাতা এই পাবলিক লাইসেন্স প্রয়োগ করেছে।
+
+ i. **লাইসেন্সকৃত অধিকার** বলতে বোঝায় এই পাবলিক লাইসেন্সের শর্তাবলীর অধীনে আপনাকে প্রদত্ত অধিকার, যা কেবলমাত্র কপিরাইট এবং অনুরূপ অধিকারগুলিতে সীমাবদ্ধ যা আপনার ব্যবহারের জন্য প্রযোজ্য এবং যা লাইসেন্সদাতার লাইসেন্স করার ক্ষমতা রয়েছে।
+
+ j. **লাইসেন্সদাতা** বলতে বোঝায় ব্যক্তি বা সত্তা যারা এই পাবলিক লাইসেন্সের অধীনে অধিকার প্রদান করে।
+
+ k. **ভাগ করা** বলতে বোঝায় এমন উপাদান জনসাধারণের কাছে সরবরাহ করা যা লাইসেন্সকৃত অধিকারগুলির অধীনে অনুমতি প্রয়োজন।
+
+ l. **Sui Generis ডেটাবেস অধিকার** বলতে বোঝায় কপিরাইট ছাড়া অন্য অধিকার যা Directive 96/9/EC দ্বারা সৃষ্ট।
+
+ m. **আপনি** বলতে বোঝায় ব্যক্তি বা সত্তা যারা এই পাবলিক লাইসেন্সের অধীনে লাইসেন্সকৃত অধিকার প্রয়োগ করে। "আপনার" এর একটি সংশ্লিষ্ট অর্থ রয়েছে।
+
+### ধারা ২ -- পরিধি।
+
+#### a. লাইসেন্স প্রদান।
+
+1. এই পাবলিক লাইসেন্সের শর্তাবলীর অধীনে, লাইসেন্সদাতা আপনাকে নিম্নলিখিত অধিকার প্রদান করে:
+
+ a. লাইসেন্সকৃত উপাদান পুনরুত্পাদন এবং ভাগ করা; এবং
+ b. পরিবর্তিত উপাদান তৈরি, পুনরুত্পাদন, এবং ভাগ করা।
+
+2. ব্যতিক্রম এবং সীমাবদ্ধতা: যদি আপনার ব্যবহারের জন্য ব্যতিক্রম এবং সীমাবদ্ধতা প্রযোজ্য হয়, তবে এই পাবলিক লাইসেন্স প্রযোজ্য নয়।
+
+3. মেয়াদ: এই পাবলিক লাইসেন্সের মেয়াদ ধারা ৬(a)-এ নির্ধারিত।
+
+4. মাধ্যম এবং ফরম্যাট: লাইসেন্সদাতা আপনাকে সমস্ত মাধ্যম এবং ফরম্যাটে লাইসেন্সকৃত অধিকার প্রয়োগ করার অনুমতি দেয়।
+
+5. নিম্নধারার প্রাপকদের জন্য শর্তাবলী:
+ a. লাইসেন্সকৃত উপাদান: প্রতিটি প্রাপক লাইসেন্সকৃত উপাদানের জন্য লাইসেন্সদাতার কাছ থেকে একটি প্রস্তাব পায়।
+ b. পরিবর্তিত উপাদান: প্রতিটি প্রাপক পরিবর্তিত উপাদানের জন্য লাইসেন্সদাতার কাছ থেকে একটি প্রস্তাব পায়।
+ c. কোনো নিম্নধারার সীমাবদ্ধতা নেই।
+
+6. অনুমোদন নয়: এই পাবলিক লাইসেন্সে কিছুই অনুমোদন বা অনুমোদনের ইঙ্গিত দেয় না।
+
+#### b. অন্যান্য অধিকার।
+
+1. নৈতিক অধিকার এই পাবলিক লাইসেন্সের অধীনে লাইসেন্সকৃত নয়।
+2. পেটেন্ট এবং ট্রেডমার্ক অধিকার এই পাবলিক লাইসেন্সের অধীনে লাইসেন্সকৃত নয়।
+3. লাইসেন্সদাতা কোনো রয়্যালটি সংগ্রহের অধিকার ত্যাগ করে।
+
+### ধারা ৩ -- লাইসেন্স শর্তাবলী।
+
+#### a. অ্যাট্রিবিউশন।
+1. আপনি যদি লাইসেন্সকৃত উপাদান ভাগ করেন, তবে আপনাকে নিম্নলিখিতগুলি বজায় রাখতে হবে:
+ a. সৃষ্টিকর্তার পরিচয়।
+ b. কপিরাইট নোটিশ।
+ c. পাবলিক লাইসেন্সের উল্লেখ।
+ d. ওয়ারেন্টি অস্বীকৃতির উল্লেখ।
+ e. একটি URI বা হাইপারলিঙ্ক।
+
+2. আপনি যুক্তিসঙ্গত পদ্ধতিতে এই শর্তগুলি পূরণ করতে পারেন।
+
+3. লাইসেন্সদাতার অনুরোধে, আপনাকে প্রয়োজনীয় তথ্য সরিয়ে ফেলতে হবে।
+
+#### b. শেয়ারঅ্যালাইক।
+1. আপনি যদি পরিবর্তিত উপাদান ভাগ করেন, তবে আপনাকে একই লাইসেন্স প্রয়োগ করতে হবে।
+2. আপনাকে অ্যাডাপ্টারের লাইসেন্সের পাঠ্য বা URI অন্তর্ভুক্ত করতে হবে।
+3. আপনি কোনো অতিরিক্ত শর্ত আরোপ করতে পারবেন না।
+
+### ধারা ৪ -- Sui Generis ডেটাবেস অধিকার।
+
+যেখানে লাইসেন্সকৃত অধিকার Sui Generis ডেটাবেস অধিকার অন্তর্ভুক্ত করে:
+
+a. আপনি ডেটাবেসের বিষয়বস্তু পুনরায় ব্যবহার করতে পারবেন।
+b. আপনি যদি ডেটাবেসের বিষয়বস্তু অন্তর্ভুক্ত করেন, তবে আপনাকে এই পাবলিক লাইসেন্সের শর্তাবলী মেনে চলতে হবে।
+অধিকার, তারপর সেই ডাটাবেস যেখানে আপনার Sui Generis Database অধিকার রয়েছে (কিন্তু এর পৃথক বিষয়বস্তু নয়) তা Adapted Material হিসেবে গণ্য হবে,
+
+যা Section 3(b)-এর উদ্দেশ্যেও অন্তর্ভুক্ত; এবং
+c. আপনি Section 3(a)-এর শর্তাবলী মেনে চলতে বাধ্য থাকবেন যদি আপনি ডাটাবেসের সমস্ত বা উল্লেখযোগ্য অংশ শেয়ার করেন।
+
+স্পষ্টতার জন্য, এই Section 4 আপনার বাধ্যবাধকতাগুলিকে সম্পূরক করে এবং এই Public License-এর অধীনে আপনার অধিকার যেখানে Licensed Rights অন্যান্য Copyright এবং Similar Rights অন্তর্ভুক্ত করে তা প্রতিস্থাপন করে না।
+
+
+Section 5 -- ওয়ারেন্টি থেকে অব্যাহতি এবং দায় সীমাবদ্ধতা।
+
+a. যদি Licensor আলাদাভাবে Undertake না করে, সম্ভব হলে, Licensor Licensed Material "যেমন আছে" এবং "যেমন পাওয়া যায়" ভিত্তিতে প্রদান করে এবং Licensed Material সম্পর্কে কোনো ধরনের উপস্থাপনা বা ওয়ারেন্টি প্রদান করে না, তা প্রকাশিত, অন্তর্নিহিত, আইনগত বা অন্য কোনোভাবে। এর মধ্যে অন্তর্ভুক্ত, কিন্তু সীমাবদ্ধ নয়, শিরোনামের ওয়ারেন্টি, বিক্রয়যোগ্যতা, নির্দিষ্ট উদ্দেশ্যের জন্য উপযুক্ততা, অ-লঙ্ঘন, লুকানো বা অন্যান্য ত্রুটির অনুপস্থিতি, সঠিকতা, বা ত্রুটির উপস্থিতি বা অনুপস্থিতি, তা জানা বা আবিষ্কারযোগ্য কিনা। যেখানে ওয়ারেন্টি থেকে অব্যাহতি সম্পূর্ণ বা আংশিকভাবে অনুমোদিত নয়, এই অব্যাহতি আপনার ক্ষেত্রে প্রযোজ্য নাও হতে পারে।
+
+b. সম্ভব হলে, কোনো অবস্থাতেই Licensor আপনার প্রতি কোনো আইনি তত্ত্ব (যার মধ্যে অন্তর্ভুক্ত, কিন্তু সীমাবদ্ধ নয়, অবহেলা) বা অন্য কোনোভাবে কোনো সরাসরি, বিশেষ, পরোক্ষ, ঘটনাক্রমে, ফলস্বরূপ, শাস্তিমূলক, উদাহরণস্বরূপ, বা অন্যান্য ক্ষতি, খরচ, ব্যয়, বা এই Public License বা Licensed Material ব্যবহারের কারণে উদ্ভূত ক্ষতির জন্য দায়ী থাকবে না, এমনকি যদি Licensor এই ধরনের ক্ষতি, খরচ, ব্যয়, বা ক্ষতির সম্ভাবনা সম্পর্কে অবগত থাকে। যেখানে দায় সীমাবদ্ধতা সম্পূর্ণ বা আংশিকভাবে অনুমোদিত নয়, এই সীমাবদ্ধতা আপনার ক্ষেত্রে প্রযোজ্য নাও হতে পারে।
+
+c. উপরের ওয়ারেন্টি থেকে অব্যাহতি এবং দায় সীমাবদ্ধতা এমনভাবে ব্যাখ্যা করা হবে যা সম্ভব হলে, একটি সম্পূর্ণ অব্যাহতি এবং সমস্ত দায় থেকে ছাড়ের সবচেয়ে কাছাকাছি প্রায় অনুমান করে।
+
+
+Section 6 -- মেয়াদ এবং সমাপ্তি।
+
+a. এই Public License Copyright এবং Similar Rights-এর মেয়াদের জন্য প্রযোজ্য যা এখানে লাইসেন্স করা হয়েছে। তবে, যদি আপনি এই Public License-এর শর্তাবলী মেনে চলতে ব্যর্থ হন, তাহলে এই Public License-এর অধীনে আপনার অধিকার স্বয়ংক্রিয়ভাবে বাতিল হয়ে যাবে।
+
+b. যেখানে Section 6(a)-এর অধীনে Licensed Material ব্যবহারের আপনার অধিকার বাতিল হয়েছে, তা পুনঃস্থাপিত হবে:
+
+1. স্বয়ংক্রিয়ভাবে সেই তারিখে যখন লঙ্ঘন সংশোধিত হয়, যদি তা আপনার লঙ্ঘন আবিষ্কারের ৩০ দিনের মধ্যে সংশোধিত হয়; অথবা
+2. Licensor-এর স্পষ্ট পুনঃস্থাপনের মাধ্যমে।
+
+স্পষ্টতার জন্য, এই Section 6(b) Licensor-এর আপনার লঙ্ঘনের জন্য প্রতিকার চাওয়ার অধিকারকে প্রভাবিত করে না।
+
+c. স্পষ্টতার জন্য, Licensor আলাদা শর্তাবলী বা শর্তে Licensed Material প্রদান করতে পারে বা যে কোনো সময় Licensed Material বিতরণ বন্ধ করতে পারে; তবে, এটি এই Public License বাতিল করবে না।
+
+d. Sections 1, 5, 6, 7, এবং 8 এই Public License-এর সমাপ্তির পরেও কার্যকর থাকবে।
+
+
+Section 7 -- অন্যান্য শর্তাবলী।
+
+a. Licensor আপনার দ্বারা যোগাযোগ করা কোনো অতিরিক্ত বা ভিন্ন শর্তাবলী দ্বারা বাধ্য থাকবে না যদি না স্পষ্টভাবে সম্মত হয়।
+
+b. Licensed Material সম্পর্কিত কোনো ব্যবস্থা, বোঝাপড়া, বা চুক্তি যা এখানে উল্লেখ করা হয়নি তা এই Public License-এর শর্তাবলী এবং শর্তাবলী থেকে আলাদা এবং স্বাধীন।
+
+
+Section 8 -- ব্যাখ্যা।
+
+a. স্পষ্টতার জন্য, এই Public License Licensed Material-এর কোনো ব্যবহারকে কমানো, সীমিত করা, বাধা দেওয়া, বা শর্ত আরোপ করা যা এই Public License-এর অধীনে অনুমতি ছাড়াই আইনত করা যেতে পারে তা কমায় না বা ব্যাখ্যা করা হবে না।
+
+b. সম্ভব হলে, যদি এই Public License-এর কোনো বিধান অকার্যকর বলে বিবেচিত হয়, তা স্বয়ংক্রিয়ভাবে প্রয়োজনীয় সর্বনিম্ন পরিমাণে সংশোধিত হবে যাতে তা কার্যকর হয়। যদি বিধান সংশোধন করা না যায়, তা এই Public License থেকে বিচ্ছিন্ন করা হবে যা অবশিষ্ট শর্তাবলী এবং শর্তাবলীর কার্যকারিতা প্রভাবিত করবে না।
+
+c. এই Public License-এর কোনো শর্ত বা শর্তাবলী মওকুফ করা হবে না এবং কোনো ব্যর্থতা মেনে নেওয়া হবে না যদি না Licensor স্পষ্টভাবে সম্মত হয়।
+
+d. এই Public License-এ কিছুই Licensor বা আপনার ক্ষেত্রে প্রযোজ্য কোনো অধিকার বা প্রতিরক্ষা সীমিত বা মওকুফ করার উদ্দেশ্যে নয়, যার মধ্যে অন্তর্ভুক্ত, কিন্তু সীমাবদ্ধ নয়, কোনো বিচারব্যবস্থা বা কর্তৃপক্ষের আইনি প্রক্রিয়া থেকে।
+
+
+=======================================================================
+
+Creative Commons তার Public License-এর পক্ষ নয়। তবে, Creative Commons তার Public License-এর অধীনে প্রকাশিত উপাদানে প্রয়োগ করতে পারে এবং সেই ক্ষেত্রে "Licensor" হিসেবে বিবেচিত হবে। Creative Commons Public License-এর পাঠ্য CC0 Public Domain Dedication-এর অধীনে জনসাধারণের জন্য উৎসর্গ করা হয়েছে। Creative Commons-এর নীতিমালায় প্রকাশিত (creativecommons.org/policies) সীমিত উদ্দেশ্য ছাড়া Creative Commons Public License-এর অধীনে উপাদান শেয়ার করা বা অন্যথায় অনুমোদিত, Creative Commons "Creative Commons" বা তার অন্য কোনো ট্রেডমার্ক বা লোগো ব্যবহার করার অনুমতি দেয় না যদি না পূর্বে লিখিত সম্মতি প্রদান করা হয়, যার মধ্যে অন্তর্ভুক্ত, কিন্তু সীমাবদ্ধ নয়, তার Public License-এর কোনো অননুমোদিত পরিবর্তন বা Licensed Material ব্যবহারের বিষয়ে কোনো ব্যবস্থা, বোঝাপড়া, বা চুক্তি। স্পষ্টতার জন্য, এই অনুচ্ছেদ Public License-এর অংশ নয়।
+
+Creative Commons-এ যোগাযোগ করা যেতে পারে creativecommons.org-এ।
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।
\ No newline at end of file
diff --git a/translations/bn/sketchnotes/README.md b/translations/bn/sketchnotes/README.md
new file mode 100644
index 000000000..65249857c
--- /dev/null
+++ b/translations/bn/sketchnotes/README.md
@@ -0,0 +1,21 @@
+
+সমস্ত পাঠক্রমের স্কেচনোটগুলি এখান থেকে ডাউনলোড করা যেতে পারে।
+
+🖨 উচ্চ রেজোলিউশনে প্রিন্ট করার জন্য, TIFF সংস্করণগুলি [এই রিপোতে](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff) উপলব্ধ।
+
+🎨 তৈরি করেছেন: [টোমোমি ইমুরা](https://github.com/girliemac) (টুইটার: [@girlie_mac](https://twitter.com/girlie_mac))
+
+[](https://creativecommons.org/licenses/by-sa/4.0/)
+
+---
+
+**অস্বীকৃতি**:
+এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়ী থাকব না।
\ No newline at end of file
diff --git a/translations/br/1-Introduction/1-intro-to-ML/README.md b/translations/br/1-Introduction/1-intro-to-ML/README.md
new file mode 100644
index 000000000..393f1019c
--- /dev/null
+++ b/translations/br/1-Introduction/1-intro-to-ML/README.md
@@ -0,0 +1,159 @@
+
+# Introdução ao aprendizado de máquina
+
+## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/1/)
+
+---
+
+[](https://youtu.be/6mSx_KJxcHI "ML para iniciantes - Introdução ao Aprendizado de Máquina para Iniciantes")
+
+> 🎥 Clique na imagem acima para assistir a um vídeo curto sobre esta lição.
+
+Bem-vindo a este curso sobre aprendizado de máquina clássico para iniciantes! Seja você completamente novo neste tópico ou um praticante experiente de ML buscando revisar alguma área, estamos felizes em tê-lo conosco! Queremos criar um ponto de partida amigável para seus estudos de ML e ficaremos felizes em avaliar, responder e incorporar seu [feedback](https://github.com/microsoft/ML-For-Beginners/discussions).
+
+[](https://youtu.be/h0e2HAPTGF4 "Introdução ao ML")
+
+> 🎥 Clique na imagem acima para assistir a um vídeo: John Guttag do MIT apresenta o aprendizado de máquina.
+
+---
+## Começando com aprendizado de máquina
+
+Antes de começar com este currículo, você precisa configurar seu computador e estar pronto para executar notebooks localmente.
+
+- **Configure sua máquina com estes vídeos**. Use os links a seguir para aprender [como instalar Python](https://youtu.be/CXZYvNRIAKM) no seu sistema e [configurar um editor de texto](https://youtu.be/EU8eayHWoZg) para desenvolvimento.
+- **Aprenda Python**. Também é recomendado ter um entendimento básico de [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), uma linguagem de programação útil para cientistas de dados que utilizamos neste curso.
+- **Aprenda Node.js e JavaScript**. Também utilizamos JavaScript algumas vezes neste curso ao construir aplicativos web, então você precisará ter [node](https://nodejs.org) e [npm](https://www.npmjs.com/) instalados, além de [Visual Studio Code](https://code.visualstudio.com/) disponível para desenvolvimento em Python e JavaScript.
+- **Crie uma conta no GitHub**. Já que você nos encontrou aqui no [GitHub](https://github.com), talvez já tenha uma conta, mas se não tiver, crie uma e depois faça um fork deste currículo para usar por conta própria. (Sinta-se à vontade para nos dar uma estrela também 😊)
+- **Explore o Scikit-learn**. Familiarize-se com [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), um conjunto de bibliotecas de ML que referenciamos nestas lições.
+
+---
+## O que é aprendizado de máquina?
+
+O termo 'aprendizado de máquina' é um dos mais populares e frequentemente usados atualmente. Existe uma grande possibilidade de que você já tenha ouvido este termo pelo menos uma vez, caso tenha algum tipo de familiaridade com tecnologia, independentemente da área em que trabalha. No entanto, a mecânica do aprendizado de máquina é um mistério para a maioria das pessoas. Para um iniciante em aprendizado de máquina, o assunto pode parecer às vezes intimidante. Portanto, é importante entender o que realmente é aprendizado de máquina e aprender sobre ele passo a passo, por meio de exemplos práticos.
+
+---
+## A curva de hype
+
+
+
+> O Google Trends mostra a recente 'curva de hype' do termo 'aprendizado de máquina'.
+
+---
+## Um universo misterioso
+
+Vivemos em um universo cheio de mistérios fascinantes. Grandes cientistas como Stephen Hawking, Albert Einstein e muitos outros dedicaram suas vidas à busca de informações significativas que desvendassem os mistérios do mundo ao nosso redor. Esta é a condição humana de aprender: uma criança humana aprende coisas novas e descobre a estrutura de seu mundo ano após ano enquanto cresce até a idade adulta.
+
+---
+## O cérebro da criança
+
+O cérebro e os sentidos de uma criança percebem os fatos ao seu redor e gradualmente aprendem os padrões ocultos da vida, o que ajuda a criança a criar regras lógicas para identificar padrões aprendidos. O processo de aprendizado do cérebro humano torna os humanos a criatura viva mais sofisticada deste mundo. Aprender continuamente ao descobrir padrões ocultos e depois inovar com base nesses padrões nos permite melhorar cada vez mais ao longo de nossas vidas. Essa capacidade de aprendizado e evolução está relacionada a um conceito chamado [plasticidade cerebral](https://www.simplypsychology.org/brain-plasticity.html). Superficialmente, podemos traçar algumas semelhanças motivacionais entre o processo de aprendizado do cérebro humano e os conceitos de aprendizado de máquina.
+
+---
+## O cérebro humano
+
+O [cérebro humano](https://www.livescience.com/29365-human-brain.html) percebe coisas do mundo real, processa as informações percebidas, toma decisões racionais e realiza certas ações com base nas circunstâncias. Isso é o que chamamos de comportamento inteligente. Quando programamos uma réplica do processo de comportamento inteligente em uma máquina, isso é chamado de inteligência artificial (IA).
+
+---
+## Alguns termos
+
+Embora os termos possam ser confundidos, aprendizado de máquina (ML) é um subconjunto importante da inteligência artificial. **ML está relacionado ao uso de algoritmos especializados para descobrir informações significativas e encontrar padrões ocultos a partir de dados percebidos, corroborando o processo de tomada de decisão racional**.
+
+---
+## IA, ML, Aprendizado Profundo
+
+
+
+> Um diagrama mostrando as relações entre IA, ML, aprendizado profundo e ciência de dados. Infográfico por [Jen Looper](https://twitter.com/jenlooper) inspirado por [este gráfico](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining).
+
+---
+## Conceitos abordados
+
+Neste currículo, vamos abordar apenas os conceitos principais de aprendizado de máquina que um iniciante deve conhecer. Abordamos o que chamamos de 'aprendizado de máquina clássico', principalmente usando Scikit-learn, uma excelente biblioteca que muitos estudantes utilizam para aprender o básico. Para entender conceitos mais amplos de inteligência artificial ou aprendizado profundo, um conhecimento fundamental sólido de aprendizado de máquina é indispensável, e é isso que queremos oferecer aqui.
+
+---
+## Neste curso você aprenderá:
+
+- conceitos principais de aprendizado de máquina
+- a história do ML
+- ML e justiça
+- técnicas de regressão em ML
+- técnicas de classificação em ML
+- técnicas de agrupamento em ML
+- técnicas de processamento de linguagem natural em ML
+- técnicas de previsão de séries temporais em ML
+- aprendizado por reforço
+- aplicações reais de ML
+
+---
+## O que não abordaremos
+
+- aprendizado profundo
+- redes neurais
+- IA
+
+Para proporcionar uma melhor experiência de aprendizado, evitaremos as complexidades de redes neurais, 'aprendizado profundo' - construção de modelos com muitas camadas usando redes neurais - e IA, que discutiremos em um currículo diferente. Também ofereceremos um currículo futuro de ciência de dados para focar nesse aspecto deste campo mais amplo.
+
+---
+## Por que estudar aprendizado de máquina?
+
+Aprendizado de máquina, do ponto de vista de sistemas, é definido como a criação de sistemas automatizados que podem aprender padrões ocultos a partir de dados para ajudar na tomada de decisões inteligentes.
+
+Essa motivação é vagamente inspirada por como o cérebro humano aprende certas coisas com base nos dados que percebe do mundo exterior.
+
+✅ Pense por um minuto por que uma empresa gostaria de usar estratégias de aprendizado de máquina em vez de criar um mecanismo baseado em regras codificadas.
+
+---
+## Aplicações do aprendizado de máquina
+
+As aplicações do aprendizado de máquina estão agora em quase todos os lugares e são tão onipresentes quanto os dados que circulam em nossas sociedades, gerados por nossos smartphones, dispositivos conectados e outros sistemas. Considerando o imenso potencial dos algoritmos de aprendizado de máquina de última geração, pesquisadores têm explorado sua capacidade de resolver problemas reais multidimensionais e multidisciplinares com ótimos resultados positivos.
+
+---
+## Exemplos de ML aplicado
+
+**Você pode usar aprendizado de máquina de várias maneiras**:
+
+- Para prever a probabilidade de uma doença com base no histórico médico ou relatórios de um paciente.
+- Para usar dados meteorológicos e prever eventos climáticos.
+- Para entender o sentimento de um texto.
+- Para detectar notícias falsas e impedir a propagação de propaganda.
+
+Finanças, economia, ciência da terra, exploração espacial, engenharia biomédica, ciência cognitiva e até mesmo áreas das ciências humanas têm adaptado o aprendizado de máquina para resolver os problemas árduos e pesados em processamento de dados de seus domínios.
+
+---
+## Conclusão
+
+O aprendizado de máquina automatiza o processo de descoberta de padrões ao encontrar insights significativos a partir de dados reais ou gerados. Ele tem se mostrado altamente valioso em aplicações de negócios, saúde e finanças, entre outras.
+
+No futuro próximo, entender os fundamentos do aprendizado de máquina será essencial para pessoas de qualquer área devido à sua ampla adoção.
+
+---
+# 🚀 Desafio
+
+Desenhe, no papel ou usando um aplicativo online como [Excalidraw](https://excalidraw.com/), sua compreensão das diferenças entre IA, ML, aprendizado profundo e ciência de dados. Adicione algumas ideias de problemas que cada uma dessas técnicas é boa em resolver.
+
+# [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/2/)
+
+---
+# Revisão e Autoestudo
+
+Para aprender mais sobre como trabalhar com algoritmos de ML na nuvem, siga este [Caminho de Aprendizado](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott).
+
+Faça um [Caminho de Aprendizado](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) sobre os fundamentos de ML.
+
+---
+# Tarefa
+
+[Prepare-se e comece](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/1-Introduction/1-intro-to-ML/assignment.md b/translations/br/1-Introduction/1-intro-to-ML/assignment.md
new file mode 100644
index 000000000..e307be1b7
--- /dev/null
+++ b/translations/br/1-Introduction/1-intro-to-ML/assignment.md
@@ -0,0 +1,23 @@
+
+# Comece a Trabalhar
+
+## Instruções
+
+Nesta atividade não avaliada, você deve revisar seus conhecimentos em Python e configurar seu ambiente para executar notebooks.
+
+Siga este [Caminho de Aprendizado em Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott) e, em seguida, configure seus sistemas assistindo a estes vídeos introdutórios:
+
+https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/1-Introduction/2-history-of-ML/README.md b/translations/br/1-Introduction/2-history-of-ML/README.md
new file mode 100644
index 000000000..702384798
--- /dev/null
+++ b/translations/br/1-Introduction/2-history-of-ML/README.md
@@ -0,0 +1,164 @@
+
+# História do aprendizado de máquina
+
+
+> Sketchnote por [Tomomi Imura](https://www.twitter.com/girlie_mac)
+
+## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/3/)
+
+---
+
+[](https://youtu.be/N6wxM4wZ7V0 "ML para iniciantes - História do aprendizado de máquina")
+
+> 🎥 Clique na imagem acima para assistir a um vídeo curto sobre esta lição.
+
+Nesta lição, vamos explorar os principais marcos na história do aprendizado de máquina e da inteligência artificial.
+
+A história da inteligência artificial (IA) como campo está entrelaçada com a história do aprendizado de máquina, já que os algoritmos e avanços computacionais que sustentam o aprendizado de máquina contribuíram para o desenvolvimento da IA. É útil lembrar que, embora esses campos como áreas distintas de estudo tenham começado a se cristalizar na década de 1950, importantes [descobertas algorítmicas, estatísticas, matemáticas, computacionais e técnicas](https://wikipedia.org/wiki/Timeline_of_machine_learning) precederam e se sobrepuseram a essa era. Na verdade, as pessoas têm pensado sobre essas questões por [centenas de anos](https://wikipedia.org/wiki/History_of_artificial_intelligence): este artigo discute os fundamentos intelectuais históricos da ideia de uma 'máquina pensante'.
+
+---
+## Descobertas notáveis
+
+- 1763, 1812 [Teorema de Bayes](https://wikipedia.org/wiki/Bayes%27_theorem) e seus predecessores. Este teorema e suas aplicações fundamentam a inferência, descrevendo a probabilidade de um evento ocorrer com base em conhecimento prévio.
+- 1805 [Teoria dos Mínimos Quadrados](https://wikipedia.org/wiki/Least_squares) pelo matemático francês Adrien-Marie Legendre. Esta teoria, que você aprenderá em nossa unidade de regressão, ajuda no ajuste de dados.
+- 1913 [Cadeias de Markov](https://wikipedia.org/wiki/Markov_chain), nomeadas em homenagem ao matemático russo Andrey Markov, são usadas para descrever uma sequência de eventos possíveis com base em um estado anterior.
+- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron) é um tipo de classificador linear inventado pelo psicólogo americano Frank Rosenblatt que fundamenta avanços em aprendizado profundo.
+
+---
+
+- 1967 [Vizinho Mais Próximo](https://wikipedia.org/wiki/Nearest_neighbor) é um algoritmo originalmente projetado para mapear rotas. No contexto de aprendizado de máquina, é usado para detectar padrões.
+- 1970 [Retropropagação](https://wikipedia.org/wiki/Backpropagation) é usada para treinar [redes neurais feedforward](https://wikipedia.org/wiki/Feedforward_neural_network).
+- 1982 [Redes Neurais Recorrentes](https://wikipedia.org/wiki/Recurrent_neural_network) são redes neurais artificiais derivadas de redes neurais feedforward que criam gráficos temporais.
+
+✅ Faça uma pequena pesquisa. Quais outras datas se destacam como marcos na história do aprendizado de máquina e da IA?
+
+---
+## 1950: Máquinas que pensam
+
+Alan Turing, uma pessoa verdadeiramente notável que foi eleito [pelo público em 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) como o maior cientista do século 20, é creditado por ajudar a estabelecer a base para o conceito de uma 'máquina que pode pensar'. Ele enfrentou críticos e sua própria necessidade de evidências empíricas desse conceito, em parte criando o [Teste de Turing](https://www.bbc.com/news/technology-18475646), que você explorará em nossas lições de PLN.
+
+---
+## 1956: Projeto de Pesquisa de Verão em Dartmouth
+
+"O Projeto de Pesquisa de Verão em Dartmouth sobre inteligência artificial foi um evento seminal para a inteligência artificial como campo", e foi aqui que o termo 'inteligência artificial' foi cunhado ([fonte](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)).
+
+> Todo aspecto de aprendizado ou qualquer outra característica da inteligência pode, em princípio, ser descrito tão precisamente que uma máquina pode ser feita para simulá-lo.
+
+---
+
+O pesquisador principal, professor de matemática John McCarthy, esperava "prosseguir com base na conjectura de que todo aspecto de aprendizado ou qualquer outra característica da inteligência pode, em princípio, ser descrito tão precisamente que uma máquina pode ser feita para simulá-lo." Os participantes incluíram outro luminar no campo, Marvin Minsky.
+
+O workshop é creditado por ter iniciado e incentivado várias discussões, incluindo "a ascensão de métodos simbólicos, sistemas focados em domínios limitados (primeiros sistemas especialistas) e sistemas dedutivos versus sistemas indutivos." ([fonte](https://wikipedia.org/wiki/Dartmouth_workshop)).
+
+---
+## 1956 - 1974: "Os anos dourados"
+
+Dos anos 1950 até meados dos anos 70, o otimismo era alto na esperança de que a IA pudesse resolver muitos problemas. Em 1967, Marvin Minsky afirmou confiantemente que "Dentro de uma geração ... o problema de criar 'inteligência artificial' será substancialmente resolvido." (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall)
+
+A pesquisa em processamento de linguagem natural floresceu, a busca foi refinada e tornou-se mais poderosa, e o conceito de 'micro-mundos' foi criado, onde tarefas simples eram realizadas usando instruções em linguagem comum.
+
+---
+
+A pesquisa foi bem financiada por agências governamentais, avanços foram feitos em computação e algoritmos, e protótipos de máquinas inteligentes foram construídos. Algumas dessas máquinas incluem:
+
+* [Shakey, o robô](https://wikipedia.org/wiki/Shakey_the_robot), que podia se mover e decidir como realizar tarefas 'inteligentemente'.
+
+ 
+ > Shakey em 1972
+
+---
+
+* Eliza, um dos primeiros 'chatterbots', podia conversar com pessoas e agir como um 'terapeuta' primitivo. Você aprenderá mais sobre Eliza nas lições de PLN.
+
+ 
+ > Uma versão de Eliza, um chatbot
+
+---
+
+* "Blocks world" foi um exemplo de micro-mundo onde blocos podiam ser empilhados e organizados, e experimentos em ensinar máquinas a tomar decisões podiam ser testados. Avanços construídos com bibliotecas como [SHRDLU](https://wikipedia.org/wiki/SHRDLU) ajudaram a impulsionar o processamento de linguagem.
+
+ [](https://www.youtube.com/watch?v=QAJz4YKUwqw "blocks world com SHRDLU")
+
+ > 🎥 Clique na imagem acima para assistir a um vídeo: Blocks world com SHRDLU
+
+---
+## 1974 - 1980: "Inverno da IA"
+
+Por volta de meados dos anos 1970, tornou-se evidente que a complexidade de criar 'máquinas inteligentes' havia sido subestimada e que sua promessa, dada a capacidade computacional disponível, havia sido exagerada. O financiamento secou e a confiança no campo diminuiu. Alguns problemas que impactaram a confiança incluíram:
+---
+- **Limitações**. A capacidade computacional era muito limitada.
+- **Explosão combinatória**. A quantidade de parâmetros necessários para treinamento cresceu exponencialmente à medida que mais era exigido dos computadores, sem uma evolução paralela da capacidade computacional.
+- **Escassez de dados**. Havia uma escassez de dados que dificultava o processo de testar, desenvolver e refinar algoritmos.
+- **Estamos fazendo as perguntas certas?**. As próprias perguntas que estavam sendo feitas começaram a ser questionadas. Pesquisadores começaram a enfrentar críticas sobre suas abordagens:
+ - Testes de Turing foram questionados por meio, entre outras ideias, da 'teoria da sala chinesa', que postulava que, "programar um computador digital pode fazer parecer que ele entende a linguagem, mas não poderia produzir compreensão real." ([fonte](https://plato.stanford.edu/entries/chinese-room/))
+ - A ética de introduzir inteligências artificiais como o "terapeuta" ELIZA na sociedade foi desafiada.
+
+---
+
+Ao mesmo tempo, várias escolas de pensamento sobre IA começaram a se formar. Uma dicotomia foi estabelecida entre práticas de ["IA bagunçada" vs. "IA organizada"](https://wikipedia.org/wiki/Neats_and_scruffies). Laboratórios _bagunçados_ ajustavam programas por horas até obterem os resultados desejados. Laboratórios _organizados_ "focavam em lógica e resolução formal de problemas". ELIZA e SHRDLU eram sistemas _bagunçados_ bem conhecidos. Nos anos 1980, à medida que surgiu a demanda por sistemas de aprendizado de máquina reproduzíveis, a abordagem _organizada_ gradualmente tomou a dianteira, pois seus resultados são mais explicáveis.
+
+---
+## Sistemas especialistas nos anos 1980
+
+À medida que o campo crescia, seus benefícios para os negócios tornaram-se mais claros, e nos anos 1980 também ocorreu a proliferação de 'sistemas especialistas'. "Sistemas especialistas estavam entre as primeiras formas verdadeiramente bem-sucedidas de software de inteligência artificial (IA)." ([fonte](https://wikipedia.org/wiki/Expert_system)).
+
+Este tipo de sistema é, na verdade, _híbrido_, consistindo parcialmente de um motor de regras que define requisitos de negócios e um motor de inferência que utiliza o sistema de regras para deduzir novos fatos.
+
+Esta era também viu uma atenção crescente às redes neurais.
+
+---
+## 1987 - 1993: "Resfriamento da IA"
+
+A proliferação de hardware especializado para sistemas especialistas teve o efeito infeliz de se tornar muito especializado. O surgimento dos computadores pessoais também competiu com esses sistemas grandes, especializados e centralizados. A democratização da computação havia começado, e isso eventualmente abriu caminho para a explosão moderna de big data.
+
+---
+## 1993 - 2011
+
+Este período viu uma nova era para o aprendizado de máquina e a IA resolverem alguns dos problemas causados anteriormente pela falta de dados e capacidade computacional. A quantidade de dados começou a aumentar rapidamente e se tornar mais amplamente disponível, para o bem e para o mal, especialmente com o advento do smartphone por volta de 2007. A capacidade computacional expandiu-se exponencialmente, e os algoritmos evoluíram junto. O campo começou a ganhar maturidade à medida que os dias livres do passado começaram a se cristalizar em uma verdadeira disciplina.
+
+---
+## Hoje
+
+Hoje, o aprendizado de máquina e a IA tocam quase todas as partes de nossas vidas. Esta era exige uma compreensão cuidadosa dos riscos e dos potenciais efeitos desses algoritmos na vida humana. Como Brad Smith, da Microsoft, afirmou: "A tecnologia da informação levanta questões que vão ao cerne das proteções fundamentais dos direitos humanos, como privacidade e liberdade de expressão. Essas questões aumentam a responsabilidade das empresas de tecnologia que criam esses produtos. Em nossa visão, elas também exigem uma regulamentação governamental cuidadosa e o desenvolvimento de normas sobre usos aceitáveis" ([fonte](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)).
+
+---
+
+Ainda não se sabe o que o futuro reserva, mas é importante entender esses sistemas computacionais e o software e os algoritmos que eles executam. Esperamos que este currículo ajude você a obter uma melhor compreensão para que possa decidir por si mesmo.
+
+[](https://www.youtube.com/watch?v=mTtDfKgLm54 "A história do aprendizado profundo")
+> 🎥 Clique na imagem acima para assistir a um vídeo: Yann LeCun discute a história do aprendizado profundo nesta palestra
+
+---
+## 🚀Desafio
+
+Aprofunde-se em um desses momentos históricos e aprenda mais sobre as pessoas por trás deles. Há personagens fascinantes, e nenhuma descoberta científica foi criada em um vácuo cultural. O que você descobre?
+
+## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/4/)
+
+---
+## Revisão e Autoestudo
+
+Aqui estão itens para assistir e ouvir:
+
+[Este podcast onde Amy Boyd discute a evolução da IA](http://runasradio.com/Shows/Show/739)
+
+[](https://www.youtube.com/watch?v=EJt3_bFYKss "A história da IA por Amy Boyd")
+
+---
+
+## Tarefa
+
+[Criar uma linha do tempo](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/1-Introduction/2-history-of-ML/assignment.md b/translations/br/1-Introduction/2-history-of-ML/assignment.md
new file mode 100644
index 000000000..ed2985e93
--- /dev/null
+++ b/translations/br/1-Introduction/2-history-of-ML/assignment.md
@@ -0,0 +1,25 @@
+
+# Criar uma linha do tempo
+
+## Instruções
+
+Usando [este repositório](https://github.com/Digital-Humanities-Toolkit/timeline-builder), crie uma linha do tempo sobre algum aspecto da história dos algoritmos, matemática, estatística, IA ou ML, ou uma combinação desses temas. Você pode focar em uma pessoa, uma ideia ou um longo período de pensamento. Certifique-se de adicionar elementos multimídia.
+
+## Rubrica
+
+| Critérios | Exemplares | Adequado | Precisa de Melhorias |
+| --------- | -------------------------------------------------- | --------------------------------------- | ---------------------------------------------------------------- |
+| | Uma linha do tempo implantada é apresentada como uma página do GitHub | O código está incompleto e não foi implantado | A linha do tempo está incompleta, não bem pesquisada e não foi implantada |
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/1-Introduction/3-fairness/README.md b/translations/br/1-Introduction/3-fairness/README.md
new file mode 100644
index 000000000..652f676f2
--- /dev/null
+++ b/translations/br/1-Introduction/3-fairness/README.md
@@ -0,0 +1,170 @@
+
+# Construindo soluções de Machine Learning com IA responsável
+
+
+> Sketchnote por [Tomomi Imura](https://www.twitter.com/girlie_mac)
+
+## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/5/)
+
+## Introdução
+
+Neste currículo, você começará a descobrir como o aprendizado de máquina pode impactar e já está impactando nossas vidas cotidianas. Mesmo agora, sistemas e modelos estão envolvidos em tarefas de tomada de decisão diária, como diagnósticos de saúde, aprovações de empréstimos ou detecção de fraudes. Por isso, é importante que esses modelos funcionem bem para fornecer resultados confiáveis. Assim como qualquer aplicação de software, sistemas de IA podem falhar em atender às expectativas ou ter resultados indesejáveis. É por isso que é essencial entender e explicar o comportamento de um modelo de IA.
+
+Imagine o que pode acontecer quando os dados que você usa para construir esses modelos carecem de certos grupos demográficos, como raça, gênero, visão política, religião, ou representam esses grupos de forma desproporcional. E se a saída do modelo for interpretada de forma a favorecer algum grupo demográfico? Qual é a consequência para a aplicação? Além disso, o que acontece quando o modelo tem um resultado adverso e prejudica pessoas? Quem é responsável pelo comportamento dos sistemas de IA? Estas são algumas das questões que exploraremos neste currículo.
+
+Nesta lição, você irá:
+
+- Aumentar sua conscientização sobre a importância da equidade no aprendizado de máquina e os danos relacionados à falta de equidade.
+- Familiarizar-se com a prática de explorar outliers e cenários incomuns para garantir confiabilidade e segurança.
+- Compreender a necessidade de capacitar todos ao projetar sistemas inclusivos.
+- Explorar como é vital proteger a privacidade e a segurança dos dados e das pessoas.
+- Ver a importância de ter uma abordagem transparente para explicar o comportamento dos modelos de IA.
+- Ter em mente como a responsabilidade é essencial para construir confiança em sistemas de IA.
+
+## Pré-requisito
+
+Como pré-requisito, faça o "Caminho de Aprendizado sobre Princípios de IA Responsável" e assista ao vídeo abaixo sobre o tema:
+
+Saiba mais sobre IA Responsável seguindo este [Caminho de Aprendizado](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
+
+[](https://youtu.be/dnC8-uUZXSc "Abordagem da Microsoft para IA Responsável")
+
+> 🎥 Clique na imagem acima para assistir ao vídeo: Abordagem da Microsoft para IA Responsável
+
+## Equidade
+
+Sistemas de IA devem tratar todos de forma justa e evitar afetar grupos semelhantes de pessoas de maneiras diferentes. Por exemplo, quando sistemas de IA fornecem orientações sobre tratamento médico, solicitações de empréstimos ou emprego, eles devem fazer as mesmas recomendações para todos com sintomas, circunstâncias financeiras ou qualificações profissionais semelhantes. Cada um de nós, como humanos, carrega preconceitos herdados que afetam nossas decisões e ações. Esses preconceitos podem ser evidentes nos dados que usamos para treinar sistemas de IA. Tal manipulação pode, às vezes, acontecer de forma não intencional. Muitas vezes, é difícil saber conscientemente quando você está introduzindo preconceito nos dados.
+
+**“Injustiça”** abrange impactos negativos, ou “danos”, para um grupo de pessoas, como aqueles definidos em termos de raça, gênero, idade ou status de deficiência. Os principais danos relacionados à equidade podem ser classificados como:
+
+- **Alocação**, se um gênero ou etnia, por exemplo, for favorecido em detrimento de outro.
+- **Qualidade do serviço**. Se você treinar os dados para um cenário específico, mas a realidade for muito mais complexa, isso leva a um serviço de desempenho ruim. Por exemplo, um dispensador de sabão que não consegue detectar pessoas com pele escura. [Referência](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
+- **Denigração**. Criticar ou rotular algo ou alguém de forma injusta. Por exemplo, uma tecnologia de rotulagem de imagens que infamemente rotulou imagens de pessoas de pele escura como gorilas.
+- **Super ou sub-representação**. A ideia é que um determinado grupo não seja visto em uma certa profissão, e qualquer serviço ou função que continue promovendo isso está contribuindo para o dano.
+- **Estereotipagem**. Associar um grupo específico a atributos pré-atribuídos. Por exemplo, um sistema de tradução de idiomas entre inglês e turco pode ter imprecisões devido a palavras com associações estereotipadas de gênero.
+
+
+> tradução para turco
+
+
+> tradução de volta para inglês
+
+Ao projetar e testar sistemas de IA, precisamos garantir que a IA seja justa e não programada para tomar decisões tendenciosas ou discriminatórias, que também são proibidas para seres humanos. Garantir equidade em IA e aprendizado de máquina continua sendo um desafio sociotécnico complexo.
+
+### Confiabilidade e segurança
+
+Para construir confiança, sistemas de IA precisam ser confiáveis, seguros e consistentes em condições normais e inesperadas. É importante saber como os sistemas de IA se comportarão em uma variedade de situações, especialmente quando são outliers. Ao construir soluções de IA, é necessário um foco substancial em como lidar com uma ampla variedade de circunstâncias que as soluções de IA encontrariam. Por exemplo, um carro autônomo precisa priorizar a segurança das pessoas. Como resultado, a IA que alimenta o carro precisa considerar todos os cenários possíveis que o carro poderia encontrar, como noite, tempestades, nevascas, crianças correndo pela rua, animais de estimação, construções na estrada, etc. Quão bem um sistema de IA pode lidar com uma ampla gama de condições de forma confiável e segura reflete o nível de antecipação que o cientista de dados ou desenvolvedor de IA considerou durante o design ou teste do sistema.
+
+> [🎥 Clique aqui para um vídeo: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
+
+### Inclusividade
+
+Sistemas de IA devem ser projetados para engajar e capacitar todos. Ao projetar e implementar sistemas de IA, cientistas de dados e desenvolvedores de IA identificam e abordam barreiras potenciais no sistema que poderiam excluir pessoas de forma não intencional. Por exemplo, há 1 bilhão de pessoas com deficiência ao redor do mundo. Com o avanço da IA, elas podem acessar uma ampla gama de informações e oportunidades mais facilmente em suas vidas diárias. Ao abordar as barreiras, cria-se oportunidades para inovar e desenvolver produtos de IA com melhores experiências que beneficiem a todos.
+
+> [🎥 Clique aqui para um vídeo: inclusividade em IA](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
+
+### Segurança e privacidade
+
+Sistemas de IA devem ser seguros e respeitar a privacidade das pessoas. As pessoas têm menos confiança em sistemas que colocam sua privacidade, informações ou vidas em risco. Ao treinar modelos de aprendizado de máquina, dependemos de dados para produzir os melhores resultados. Ao fazer isso, a origem dos dados e sua integridade devem ser consideradas. Por exemplo, os dados foram enviados por usuários ou estão disponíveis publicamente? Em seguida, ao trabalhar com os dados, é crucial desenvolver sistemas de IA que possam proteger informações confidenciais e resistir a ataques. À medida que a IA se torna mais prevalente, proteger a privacidade e garantir a segurança de informações pessoais e empresariais importantes está se tornando mais crítico e complexo. Questões de privacidade e segurança de dados exigem atenção especial para IA porque o acesso aos dados é essencial para que os sistemas de IA façam previsões e decisões precisas e informadas sobre as pessoas.
+
+> [🎥 Clique aqui para um vídeo: segurança em IA](https://www.microsoft.com/videoplayer/embed/RE4voJF)
+
+- Como indústria, fizemos avanços significativos em privacidade e segurança, impulsionados significativamente por regulamentações como o GDPR (Regulamento Geral de Proteção de Dados).
+- No entanto, com sistemas de IA, devemos reconhecer a tensão entre a necessidade de mais dados pessoais para tornar os sistemas mais personalizados e eficazes – e a privacidade.
+- Assim como com o nascimento de computadores conectados à internet, também estamos vendo um grande aumento no número de problemas de segurança relacionados à IA.
+- Ao mesmo tempo, vimos a IA sendo usada para melhorar a segurança. Por exemplo, a maioria dos scanners antivírus modernos é impulsionada por heurísticas de IA hoje.
+- Precisamos garantir que nossos processos de Ciência de Dados se harmonizem com as práticas mais recentes de privacidade e segurança.
+
+### Transparência
+
+Sistemas de IA devem ser compreensíveis. Uma parte crucial da transparência é explicar o comportamento dos sistemas de IA e seus componentes. Melhorar a compreensão dos sistemas de IA exige que as partes interessadas compreendam como e por que eles funcionam, para que possam identificar possíveis problemas de desempenho, preocupações de segurança e privacidade, preconceitos, práticas excludentes ou resultados não intencionais. Também acreditamos que aqueles que usam sistemas de IA devem ser honestos e transparentes sobre quando, por que e como escolhem implantá-los, bem como as limitações dos sistemas que utilizam. Por exemplo, se um banco usa um sistema de IA para apoiar suas decisões de concessão de crédito ao consumidor, é importante examinar os resultados e entender quais dados influenciam as recomendações do sistema. Os governos estão começando a regulamentar a IA em diversos setores, então cientistas de dados e organizações devem explicar se um sistema de IA atende aos requisitos regulatórios, especialmente quando há um resultado indesejável.
+
+> [🎥 Clique aqui para um vídeo: transparência em IA](https://www.microsoft.com/videoplayer/embed/RE4voJF)
+
+- Como os sistemas de IA são tão complexos, é difícil entender como eles funcionam e interpretar os resultados.
+- Essa falta de compreensão afeta a forma como esses sistemas são gerenciados, operacionalizados e documentados.
+- Essa falta de compreensão, mais importante, afeta as decisões tomadas com base nos resultados que esses sistemas produzem.
+
+### Responsabilidade
+
+As pessoas que projetam e implantam sistemas de IA devem ser responsáveis pelo funcionamento de seus sistemas. A necessidade de responsabilidade é particularmente crucial com tecnologias sensíveis, como reconhecimento facial. Recentemente, houve uma demanda crescente por tecnologia de reconhecimento facial, especialmente de organizações de aplicação da lei que veem o potencial da tecnologia em usos como encontrar crianças desaparecidas. No entanto, essas tecnologias poderiam ser usadas por um governo para colocar em risco as liberdades fundamentais de seus cidadãos, por exemplo, permitindo a vigilância contínua de indivíduos específicos. Portanto, cientistas de dados e organizações precisam ser responsáveis pelo impacto de seus sistemas de IA sobre indivíduos ou a sociedade.
+
+[](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Abordagem da Microsoft para IA Responsável")
+
+> 🎥 Clique na imagem acima para assistir ao vídeo: Alertas sobre Vigilância em Massa por Reconhecimento Facial
+
+Em última análise, uma das maiores questões para nossa geração, como a primeira geração que está trazendo IA para a sociedade, é como garantir que os computadores permaneçam responsáveis perante as pessoas e como garantir que as pessoas que projetam computadores permaneçam responsáveis perante todos os outros.
+
+## Avaliação de impacto
+
+Antes de treinar um modelo de aprendizado de máquina, é importante realizar uma avaliação de impacto para entender o propósito do sistema de IA; qual é o uso pretendido; onde será implantado; e quem interagirá com o sistema. Isso é útil para os revisores ou testadores que avaliam o sistema saberem quais fatores considerar ao identificar riscos potenciais e consequências esperadas.
+
+As seguintes áreas são focos ao realizar uma avaliação de impacto:
+
+* **Impacto adverso sobre indivíduos**. Estar ciente de quaisquer restrições ou requisitos, uso não suportado ou quaisquer limitações conhecidas que prejudiquem o desempenho do sistema é vital para garantir que o sistema não seja usado de forma que possa causar danos aos indivíduos.
+* **Requisitos de dados**. Compreender como e onde o sistema usará dados permite que os revisores explorem quaisquer requisitos de dados que você precisaria considerar (por exemplo, regulamentações de dados como GDPR ou HIPAA). Além disso, examine se a origem ou quantidade de dados é substancial para o treinamento.
+* **Resumo do impacto**. Reúna uma lista de possíveis danos que poderiam surgir do uso do sistema. Ao longo do ciclo de vida do aprendizado de máquina, revise se os problemas identificados foram mitigados ou abordados.
+* **Metas aplicáveis** para cada um dos seis princípios fundamentais. Avalie se as metas de cada princípio foram atendidas e se há lacunas.
+
+## Depuração com IA responsável
+
+Semelhante à depuração de uma aplicação de software, depurar um sistema de IA é um processo necessário para identificar e resolver problemas no sistema. Há muitos fatores que podem afetar um modelo que não está funcionando como esperado ou de forma responsável. A maioria das métricas tradicionais de desempenho de modelos são agregados quantitativos do desempenho de um modelo, que não são suficientes para analisar como um modelo viola os princípios de IA responsável. Além disso, um modelo de aprendizado de máquina é uma caixa preta que dificulta entender o que impulsiona seu resultado ou fornecer explicações quando ele comete um erro. Mais adiante neste curso, aprenderemos como usar o painel de IA Responsável para ajudar a depurar sistemas de IA. O painel fornece uma ferramenta holística para cientistas de dados e desenvolvedores de IA realizarem:
+
+* **Análise de erros**. Para identificar a distribuição de erros do modelo que pode afetar a equidade ou confiabilidade do sistema.
+* **Visão geral do modelo**. Para descobrir onde há disparidades no desempenho do modelo entre diferentes grupos de dados.
+* **Análise de dados**. Para entender a distribuição dos dados e identificar qualquer potencial preconceito nos dados que poderia levar a problemas de equidade, inclusão e confiabilidade.
+* **Interpretabilidade do modelo**. Para entender o que afeta ou influencia as previsões do modelo. Isso ajuda a explicar o comportamento do modelo, o que é importante para transparência e responsabilidade.
+
+## 🚀 Desafio
+
+Para evitar que danos sejam introduzidos desde o início, devemos:
+
+- ter diversidade de origens e perspectivas entre as pessoas que trabalham nos sistemas
+- investir em conjuntos de dados que reflitam a diversidade de nossa sociedade
+- desenvolver melhores métodos ao longo do ciclo de vida do aprendizado de máquina para detectar e corrigir problemas de IA responsável quando eles ocorrerem
+
+Pense em cenários da vida real onde a falta de confiabilidade de um modelo é evidente na construção e uso do modelo. O que mais devemos considerar?
+
+## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/6/)
+## Revisão e Autoestudo
+Nesta lição, você aprendeu alguns conceitos básicos sobre justiça e injustiça em aprendizado de máquina.
+
+Assista a este workshop para se aprofundar nos tópicos:
+
+- Em busca de IA responsável: Colocando princípios em prática por Besmira Nushi, Mehrnoosh Sameki e Amit Sharma
+
+[](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Um framework de código aberto para construir IA responsável")
+
+
+> 🎥 Clique na imagem acima para assistir ao vídeo: RAI Toolbox: Um framework de código aberto para construir IA responsável por Besmira Nushi, Mehrnoosh Sameki e Amit Sharma
+
+Além disso, leia:
+
+- Centro de recursos de IA responsável da Microsoft: [Recursos de IA Responsável – Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
+
+- Grupo de pesquisa FATE da Microsoft: [FATE: Justiça, Responsabilidade, Transparência e Ética em IA - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
+
+RAI Toolbox:
+
+- [Repositório GitHub do Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox)
+
+Leia sobre as ferramentas do Azure Machine Learning para garantir justiça:
+
+- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
+
+## Tarefa
+
+[Explore o RAI Toolbox](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/1-Introduction/3-fairness/assignment.md b/translations/br/1-Introduction/3-fairness/assignment.md
new file mode 100644
index 000000000..43d4e6089
--- /dev/null
+++ b/translations/br/1-Introduction/3-fairness/assignment.md
@@ -0,0 +1,25 @@
+
+# Explore o Toolbox de IA Responsável
+
+## Instruções
+
+Nesta lição, você aprendeu sobre o Toolbox de IA Responsável, um "projeto de código aberto e orientado pela comunidade para ajudar cientistas de dados a analisar e melhorar sistemas de IA." Para esta tarefa, explore um dos [notebooks](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) do Toolbox de IA Responsável e relate suas descobertas em um artigo ou apresentação.
+
+## Rubrica
+
+| Critérios | Exemplar | Adequado | Necessita Melhorias |
+| --------- | -------- | -------- | ------------------- |
+| | Um artigo ou apresentação em PowerPoint é apresentado discutindo os sistemas do Fairlearn, o notebook que foi executado e as conclusões obtidas a partir da execução | Um artigo é apresentado sem conclusões | Nenhum artigo é apresentado |
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/1-Introduction/4-techniques-of-ML/README.md b/translations/br/1-Introduction/4-techniques-of-ML/README.md
new file mode 100644
index 000000000..7383d9bb7
--- /dev/null
+++ b/translations/br/1-Introduction/4-techniques-of-ML/README.md
@@ -0,0 +1,132 @@
+
+# Técnicas de Aprendizado de Máquina
+
+O processo de construir, usar e manter modelos de aprendizado de máquina e os dados que eles utilizam é muito diferente de muitos outros fluxos de trabalho de desenvolvimento. Nesta lição, vamos desmistificar o processo e delinear as principais técnicas que você precisa conhecer. Você irá:
+
+- Compreender os processos que sustentam o aprendizado de máquina em um nível geral.
+- Explorar conceitos básicos como 'modelos', 'previsões' e 'dados de treinamento'.
+
+## [Questionário pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/7/)
+
+[](https://youtu.be/4NGM0U2ZSHU "ML para iniciantes - Técnicas de Aprendizado de Máquina")
+
+> 🎥 Clique na imagem acima para assistir a um vídeo curto sobre esta lição.
+
+## Introdução
+
+Em um nível geral, a prática de criar processos de aprendizado de máquina (ML) é composta por várias etapas:
+
+1. **Definir a pergunta**. A maioria dos processos de ML começa com uma pergunta que não pode ser respondida por um programa condicional simples ou um mecanismo baseado em regras. Essas perguntas geralmente giram em torno de previsões baseadas em um conjunto de dados.
+2. **Coletar e preparar os dados**. Para responder à sua pergunta, você precisa de dados. A qualidade e, às vezes, a quantidade dos seus dados determinarão o quão bem você pode responder à pergunta inicial. Visualizar os dados é um aspecto importante desta fase. Esta etapa também inclui dividir os dados em grupos de treinamento e teste para construir um modelo.
+3. **Escolher um método de treinamento**. Dependendo da sua pergunta e da natureza dos seus dados, você precisa escolher como deseja treinar um modelo para refletir melhor seus dados e fazer previsões precisas. Esta é a parte do processo de ML que exige expertise específica e, muitas vezes, uma quantidade considerável de experimentação.
+4. **Treinar o modelo**. Usando seus dados de treinamento, você utilizará vários algoritmos para treinar um modelo a reconhecer padrões nos dados. O modelo pode usar pesos internos que podem ser ajustados para privilegiar certas partes dos dados em detrimento de outras, a fim de construir um modelo melhor.
+5. **Avaliar o modelo**. Você usa dados nunca antes vistos (seus dados de teste) do conjunto coletado para verificar o desempenho do modelo.
+6. **Ajustar parâmetros**. Com base no desempenho do modelo, você pode refazer o processo usando diferentes parâmetros ou variáveis que controlam o comportamento dos algoritmos usados para treinar o modelo.
+7. **Prever**. Use novas entradas para testar a precisão do modelo.
+
+## Qual pergunta fazer
+
+Os computadores são particularmente habilidosos em descobrir padrões ocultos nos dados. Essa habilidade é muito útil para pesquisadores que têm perguntas sobre um determinado domínio que não podem ser facilmente respondidas criando um mecanismo baseado em regras condicionais. Dado um trabalho atuarial, por exemplo, um cientista de dados pode ser capaz de construir regras manuais sobre a mortalidade de fumantes versus não fumantes.
+
+Quando muitas outras variáveis são introduzidas na equação, no entanto, um modelo de ML pode se mostrar mais eficiente para prever taxas de mortalidade futuras com base no histórico de saúde passado. Um exemplo mais animador pode ser fazer previsões meteorológicas para o mês de abril em um determinado local com base em dados que incluem latitude, longitude, mudanças climáticas, proximidade do oceano, padrões da corrente de jato e mais.
+
+✅ Este [slide deck](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) sobre modelos meteorológicos oferece uma perspectiva histórica sobre o uso de ML na análise do clima.
+
+## Tarefas pré-construção
+
+Antes de começar a construir seu modelo, há várias tarefas que você precisa completar. Para testar sua pergunta e formar uma hipótese com base nas previsões de um modelo, você precisa identificar e configurar vários elementos.
+
+### Dados
+
+Para responder à sua pergunta com algum grau de certeza, você precisa de uma boa quantidade de dados do tipo certo. Há duas coisas que você precisa fazer neste momento:
+
+- **Coletar dados**. Lembrando da lição anterior sobre justiça na análise de dados, colete seus dados com cuidado. Esteja ciente das fontes desses dados, de quaisquer vieses inerentes que possam ter e documente sua origem.
+- **Preparar os dados**. Há várias etapas no processo de preparação de dados. Você pode precisar reunir dados e normalizá-los se vierem de fontes diversas. É possível melhorar a qualidade e a quantidade dos dados por meio de vários métodos, como converter strings em números (como fazemos em [Clustering](../../5-Clustering/1-Visualize/README.md)). Você também pode gerar novos dados com base nos originais (como fazemos em [Classificação](../../4-Classification/1-Introduction/README.md)). Pode ser necessário limpar e editar os dados (como faremos antes da lição de [Aplicativo Web](../../3-Web-App/README.md)). Por fim, talvez seja necessário randomizá-los e embaralhá-los, dependendo das técnicas de treinamento.
+
+✅ Após coletar e processar seus dados, reserve um momento para verificar se sua estrutura permitirá abordar a pergunta pretendida. Pode ser que os dados não funcionem bem na sua tarefa, como descobrimos em nossas lições de [Clustering](../../5-Clustering/1-Visualize/README.md)!
+
+### Features e Target
+
+Uma [feature](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) é uma propriedade mensurável dos seus dados. Em muitos conjuntos de dados, ela é expressa como um cabeçalho de coluna, como 'data', 'tamanho' ou 'cor'. Sua variável de feature, geralmente representada como `X` no código, representa a variável de entrada que será usada para treinar o modelo.
+
+O target é o que você está tentando prever. O target, geralmente representado como `y` no código, representa a resposta à pergunta que você está tentando fazer com seus dados: em dezembro, qual **cor** de abóboras será mais barata? Em São Francisco, quais bairros terão o melhor **preço** de imóveis? Às vezes, o target também é chamado de atributo de rótulo.
+
+### Selecionando sua variável de feature
+
+🎓 **Seleção de Features e Extração de Features** Como saber qual variável escolher ao construir um modelo? Provavelmente, você passará por um processo de seleção de features ou extração de features para escolher as variáveis certas para o modelo mais eficiente. No entanto, elas não são a mesma coisa: "A extração de features cria novas features a partir de funções das features originais, enquanto a seleção de features retorna um subconjunto das features." ([fonte](https://wikipedia.org/wiki/Feature_selection))
+
+### Visualizar seus dados
+
+Um aspecto importante do kit de ferramentas do cientista de dados é o poder de visualizar dados usando várias bibliotecas excelentes, como Seaborn ou MatPlotLib. Representar seus dados visualmente pode permitir que você descubra correlações ocultas que pode aproveitar. Suas visualizações também podem ajudá-lo a identificar vieses ou dados desbalanceados (como descobrimos em [Classificação](../../4-Classification/2-Classifiers-1/README.md)).
+
+### Dividir seu conjunto de dados
+
+Antes de treinar, você precisa dividir seu conjunto de dados em duas ou mais partes de tamanhos desiguais que ainda representem bem os dados.
+
+- **Treinamento**. Esta parte do conjunto de dados é ajustada ao seu modelo para treiná-lo. Este conjunto constitui a maior parte do conjunto de dados original.
+- **Teste**. Um conjunto de teste é um grupo independente de dados, frequentemente extraído dos dados originais, que você usa para confirmar o desempenho do modelo construído.
+- **Validação**. Um conjunto de validação é um grupo menor e independente de exemplos que você usa para ajustar os hiperparâmetros ou a arquitetura do modelo, a fim de melhorá-lo. Dependendo do tamanho dos seus dados e da pergunta que você está fazendo, pode não ser necessário construir este terceiro conjunto (como observamos em [Previsão de Séries Temporais](../../7-TimeSeries/1-Introduction/README.md)).
+
+## Construindo um modelo
+
+Usando seus dados de treinamento, seu objetivo é construir um modelo, ou uma representação estatística dos seus dados, utilizando vários algoritmos para **treiná-lo**. Treinar um modelo o expõe aos dados e permite que ele faça suposições sobre padrões percebidos que descobre, valida e aceita ou rejeita.
+
+### Decidir sobre um método de treinamento
+
+Dependendo da sua pergunta e da natureza dos seus dados, você escolherá um método para treiná-lo. Explorando a [documentação do Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - que usamos neste curso - você pode explorar várias maneiras de treinar um modelo. Dependendo da sua experiência, pode ser necessário tentar vários métodos diferentes para construir o melhor modelo. É provável que você passe por um processo em que cientistas de dados avaliam o desempenho de um modelo alimentando-o com dados não vistos, verificando sua precisão, vieses e outros problemas que degradam a qualidade, e selecionando o método de treinamento mais apropriado para a tarefa em questão.
+
+### Treinar um modelo
+
+Com seus dados de treinamento em mãos, você está pronto para 'ajustá-los' para criar um modelo. Você notará que em muitas bibliotecas de ML encontrará o código 'model.fit' - é neste momento que você envia sua variável de feature como um array de valores (geralmente 'X') e uma variável de target (geralmente 'y').
+
+### Avaliar o modelo
+
+Uma vez concluído o processo de treinamento (pode levar muitas iterações, ou 'épocas', para treinar um modelo grande), você poderá avaliar a qualidade do modelo usando dados de teste para medir seu desempenho. Esses dados são um subconjunto dos dados originais que o modelo ainda não analisou. Você pode imprimir uma tabela de métricas sobre a qualidade do modelo.
+
+🎓 **Ajuste do modelo**
+
+No contexto do aprendizado de máquina, o ajuste do modelo refere-se à precisão da função subjacente do modelo ao tentar analisar dados com os quais não está familiarizado.
+
+🎓 **Subajuste** e **superajuste** são problemas comuns que degradam a qualidade do modelo, pois o modelo se ajusta de forma insuficiente ou excessiva. Isso faz com que o modelo faça previsões muito alinhadas ou pouco alinhadas com seus dados de treinamento. Um modelo superajustado prevê os dados de treinamento muito bem porque aprendeu os detalhes e o ruído dos dados de forma excessiva. Um modelo subajustado não é preciso, pois não consegue analisar com precisão nem seus dados de treinamento nem os dados que ainda não viu.
+
+
+> Infográfico por [Jen Looper](https://twitter.com/jenlooper)
+
+## Ajuste de parâmetros
+
+Depois de concluir o treinamento inicial, observe a qualidade do modelo e considere melhorá-lo ajustando seus 'hiperparâmetros'. Leia mais sobre o processo [na documentação](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott).
+
+## Previsão
+
+Este é o momento em que você pode usar dados completamente novos para testar a precisão do modelo. Em um cenário de ML 'aplicado', onde você está construindo ativos web para usar o modelo em produção, esse processo pode envolver a coleta de entrada do usuário (um clique de botão, por exemplo) para definir uma variável e enviá-la ao modelo para inferência ou avaliação.
+
+Nestas lições, você descobrirá como usar essas etapas para preparar, construir, testar, avaliar e prever - todos os gestos de um cientista de dados e mais, à medida que avança em sua jornada para se tornar um engenheiro de ML 'full stack'.
+
+---
+
+## 🚀Desafio
+
+Desenhe um fluxograma refletindo as etapas de um praticante de ML. Onde você se vê agora no processo? Onde você prevê que encontrará dificuldades? O que parece fácil para você?
+
+## [Questionário pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/8/)
+
+## Revisão e Autoestudo
+
+Pesquise online entrevistas com cientistas de dados que discutem seu trabalho diário. Aqui está [uma](https://www.youtube.com/watch?v=Z3IjgbbCEfs).
+
+## Tarefa
+
+[Entrevistar um cientista de dados](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/1-Introduction/4-techniques-of-ML/assignment.md b/translations/br/1-Introduction/4-techniques-of-ML/assignment.md
new file mode 100644
index 000000000..633edf524
--- /dev/null
+++ b/translations/br/1-Introduction/4-techniques-of-ML/assignment.md
@@ -0,0 +1,25 @@
+
+# Entrevista com um cientista de dados
+
+## Instruções
+
+Na sua empresa, em um grupo de usuários, ou entre seus amigos ou colegas de estudo, converse com alguém que trabalha profissionalmente como cientista de dados. Escreva um pequeno artigo (500 palavras) sobre as ocupações diárias dessa pessoa. Eles são especialistas ou trabalham de forma 'full stack'?
+
+## Rubrica
+
+| Critérios | Exemplar | Adequado | Precisa Melhorar |
+| --------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------ | --------------------- |
+| | Um artigo com o comprimento correto, com fontes atribuídas, apresentado como um arquivo .doc | O artigo tem atribuições inadequadas ou é mais curto que o comprimento exigido | Nenhum artigo é apresentado |
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/1-Introduction/README.md b/translations/br/1-Introduction/README.md
new file mode 100644
index 000000000..e7625b589
--- /dev/null
+++ b/translations/br/1-Introduction/README.md
@@ -0,0 +1,37 @@
+
+# Introdução ao aprendizado de máquina
+
+Nesta seção do currículo, você será apresentado aos conceitos básicos que fundamentam o campo do aprendizado de máquina, o que ele é, e aprenderá sobre sua história e as técnicas que os pesquisadores utilizam para trabalhar com ele. Vamos explorar juntos este novo mundo do aprendizado de máquina!
+
+
+> Foto por Bill Oxford no Unsplash
+
+### Aulas
+
+1. [Introdução ao aprendizado de máquina](1-intro-to-ML/README.md)
+1. [A história do aprendizado de máquina e da IA](2-history-of-ML/README.md)
+1. [Equidade e aprendizado de máquina](3-fairness/README.md)
+1. [Técnicas de aprendizado de máquina](4-techniques-of-ML/README.md)
+
+### Créditos
+
+"Introdução ao Aprendizado de Máquina" foi escrito com ♥️ por uma equipe de pessoas incluindo [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) e [Jen Looper](https://twitter.com/jenlooper)
+
+"A História do Aprendizado de Máquina" foi escrito com ♥️ por [Jen Looper](https://twitter.com/jenlooper) e [Amy Boyd](https://twitter.com/AmyKateNicho)
+
+"Equidade e Aprendizado de Máquina" foi escrito com ♥️ por [Tomomi Imura](https://twitter.com/girliemac)
+
+"Técnicas de Aprendizado de Máquina" foi escrito com ♥️ por [Jen Looper](https://twitter.com/jenlooper) e [Chris Noring](https://twitter.com/softchris)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/1-Tools/README.md b/translations/br/2-Regression/1-Tools/README.md
new file mode 100644
index 000000000..09ef30313
--- /dev/null
+++ b/translations/br/2-Regression/1-Tools/README.md
@@ -0,0 +1,239 @@
+
+# Introdução ao Python e Scikit-learn para modelos de regressão
+
+
+
+> Sketchnote por [Tomomi Imura](https://www.twitter.com/girlie_mac)
+
+## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/9/)
+
+> ### [Esta lição está disponível em R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
+
+## Introdução
+
+Nestas quatro lições, você descobrirá como construir modelos de regressão. Vamos discutir para que eles servem em breve. Mas antes de começar, certifique-se de ter as ferramentas certas para iniciar o processo!
+
+Nesta lição, você aprenderá a:
+
+- Configurar seu computador para tarefas locais de aprendizado de máquina.
+- Trabalhar com notebooks Jupyter.
+- Usar Scikit-learn, incluindo instalação.
+- Explorar regressão linear com um exercício prático.
+
+## Instalações e configurações
+
+[](https://youtu.be/-DfeD2k2Kj0 "ML para iniciantes - Configure suas ferramentas para criar modelos de aprendizado de máquina")
+
+> 🎥 Clique na imagem acima para um vídeo curto sobre como configurar seu computador para ML.
+
+1. **Instale o Python**. Certifique-se de que o [Python](https://www.python.org/downloads/) está instalado em seu computador. Você usará Python para muitas tarefas de ciência de dados e aprendizado de máquina. A maioria dos sistemas de computador já inclui uma instalação do Python. Também existem [Pacotes de Codificação Python](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) úteis disponíveis para facilitar a configuração para alguns usuários.
+
+ Algumas utilizações do Python, no entanto, exigem uma versão específica do software, enquanto outras exigem uma versão diferente. Por isso, é útil trabalhar dentro de um [ambiente virtual](https://docs.python.org/3/library/venv.html).
+
+2. **Instale o Visual Studio Code**. Certifique-se de que o Visual Studio Code está instalado em seu computador. Siga estas instruções para [instalar o Visual Studio Code](https://code.visualstudio.com/) para a instalação básica. Você usará Python no Visual Studio Code neste curso, então pode ser útil revisar como [configurar o Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) para desenvolvimento em Python.
+
+ > Familiarize-se com Python trabalhando nesta coleção de [módulos de aprendizado](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott)
+ >
+ > [](https://youtu.be/yyQM70vi7V8 "Configurar Python com Visual Studio Code")
+ >
+ > 🎥 Clique na imagem acima para um vídeo: usando Python no VS Code.
+
+3. **Instale o Scikit-learn**, seguindo [estas instruções](https://scikit-learn.org/stable/install.html). Como você precisa garantir que está usando Python 3, é recomendado que use um ambiente virtual. Observe que, se estiver instalando esta biblioteca em um Mac M1, há instruções especiais na página vinculada acima.
+
+4. **Instale o Jupyter Notebook**. Você precisará [instalar o pacote Jupyter](https://pypi.org/project/jupyter/).
+
+## Seu ambiente de autoria de ML
+
+Você usará **notebooks** para desenvolver seu código Python e criar modelos de aprendizado de máquina. Este tipo de arquivo é uma ferramenta comum para cientistas de dados e pode ser identificado por seu sufixo ou extensão `.ipynb`.
+
+Notebooks são um ambiente interativo que permite ao desenvolvedor tanto codificar quanto adicionar notas e escrever documentação em torno do código, o que é bastante útil para projetos experimentais ou orientados à pesquisa.
+
+[](https://youtu.be/7E-jC8FLA2E "ML para iniciantes - Configure Jupyter Notebooks para começar a construir modelos de regressão")
+
+> 🎥 Clique na imagem acima para um vídeo curto sobre este exercício.
+
+### Exercício - trabalhar com um notebook
+
+Nesta pasta, você encontrará o arquivo _notebook.ipynb_.
+
+1. Abra _notebook.ipynb_ no Visual Studio Code.
+
+ Um servidor Jupyter será iniciado com Python 3+. Você encontrará áreas do notebook que podem ser `executadas`, pedaços de código. Você pode executar um bloco de código selecionando o ícone que parece um botão de play.
+
+2. Selecione o ícone `md` e adicione um pouco de markdown, e o seguinte texto **# Bem-vindo ao seu notebook**.
+
+ Em seguida, adicione algum código Python.
+
+3. Digite **print('hello notebook')** no bloco de código.
+4. Selecione a seta para executar o código.
+
+ Você deve ver a declaração impressa:
+
+ ```output
+ hello notebook
+ ```
+
+
+
+Você pode intercalar seu código com comentários para auto-documentar o notebook.
+
+✅ Pense por um momento como o ambiente de trabalho de um desenvolvedor web é diferente do de um cientista de dados.
+
+## Começando com Scikit-learn
+
+Agora que o Python está configurado em seu ambiente local e você está confortável com notebooks Jupyter, vamos nos familiarizar igualmente com o Scikit-learn (pronuncia-se `sci` como em `science`). O Scikit-learn fornece uma [API extensa](https://scikit-learn.org/stable/modules/classes.html#api-ref) para ajudá-lo a realizar tarefas de ML.
+
+De acordo com seu [site](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn é uma biblioteca de aprendizado de máquina de código aberto que suporta aprendizado supervisionado e não supervisionado. Também fornece várias ferramentas para ajuste de modelos, pré-processamento de dados, seleção e avaliação de modelos, e muitas outras utilidades."
+
+Neste curso, você usará Scikit-learn e outras ferramentas para construir modelos de aprendizado de máquina para realizar o que chamamos de tarefas de 'aprendizado de máquina tradicional'. Evitamos deliberadamente redes neurais e aprendizado profundo, pois eles são melhor abordados em nosso próximo currículo 'IA para Iniciantes'.
+
+O Scikit-learn torna simples construir modelos e avaliá-los para uso. Ele é focado principalmente em usar dados numéricos e contém vários conjuntos de dados prontos para uso como ferramentas de aprendizado. Também inclui modelos pré-construídos para os alunos experimentarem. Vamos explorar o processo de carregar dados pré-empacotados e usar um estimador para criar o primeiro modelo de ML com Scikit-learn usando alguns dados básicos.
+
+## Exercício - seu primeiro notebook com Scikit-learn
+
+> Este tutorial foi inspirado pelo [exemplo de regressão linear](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) no site do Scikit-learn.
+
+[](https://youtu.be/2xkXL5EUpS0 "ML para iniciantes - Seu Primeiro Projeto de Regressão Linear em Python")
+
+> 🎥 Clique na imagem acima para um vídeo curto sobre este exercício.
+
+No arquivo _notebook.ipynb_ associado a esta lição, limpe todas as células pressionando o ícone de 'lixeira'.
+
+Nesta seção, você trabalhará com um pequeno conjunto de dados sobre diabetes que está embutido no Scikit-learn para fins de aprendizado. Imagine que você queria testar um tratamento para pacientes diabéticos. Modelos de aprendizado de máquina podem ajudá-lo a determinar quais pacientes responderiam melhor ao tratamento, com base em combinações de variáveis. Mesmo um modelo de regressão muito básico, quando visualizado, pode mostrar informações sobre variáveis que ajudariam a organizar seus ensaios clínicos teóricos.
+
+✅ Existem muitos tipos de métodos de regressão, e qual você escolhe depende da resposta que está procurando. Se você quiser prever a altura provável de uma pessoa de uma determinada idade, usaria regressão linear, pois está buscando um **valor numérico**. Se estiver interessado em descobrir se um tipo de culinária deve ser considerado vegano ou não, estará buscando uma **atribuição de categoria**, então usaria regressão logística. Você aprenderá mais sobre regressão logística mais tarde. Pense um pouco sobre algumas perguntas que você pode fazer aos dados e qual desses métodos seria mais apropriado.
+
+Vamos começar esta tarefa.
+
+### Importar bibliotecas
+
+Para esta tarefa, importaremos algumas bibliotecas:
+
+- **matplotlib**. É uma ferramenta útil para [criação de gráficos](https://matplotlib.org/) e a usaremos para criar um gráfico de linha.
+- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) é uma biblioteca útil para lidar com dados numéricos em Python.
+- **sklearn**. Esta é a biblioteca [Scikit-learn](https://scikit-learn.org/stable/user_guide.html).
+
+Importe algumas bibliotecas para ajudar em suas tarefas.
+
+1. Adicione as importações digitando o seguinte código:
+
+ ```python
+ import matplotlib.pyplot as plt
+ import numpy as np
+ from sklearn import datasets, linear_model, model_selection
+ ```
+
+ Acima, você está importando `matplotlib`, `numpy` e está importando `datasets`, `linear_model` e `model_selection` de `sklearn`. `model_selection` é usado para dividir dados em conjuntos de treinamento e teste.
+
+### O conjunto de dados de diabetes
+
+O [conjunto de dados de diabetes](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) embutido inclui 442 amostras de dados sobre diabetes, com 10 variáveis de características, algumas das quais incluem:
+
+- age: idade em anos
+- bmi: índice de massa corporal
+- bp: pressão arterial média
+- s1 tc: células T (um tipo de glóbulo branco)
+
+✅ Este conjunto de dados inclui o conceito de 'sexo' como uma variável de característica importante para pesquisas sobre diabetes. Muitos conjuntos de dados médicos incluem este tipo de classificação binária. Pense um pouco sobre como categorizações como esta podem excluir certas partes da população de tratamentos.
+
+Agora, carregue os dados X e y.
+
+> 🎓 Lembre-se, este é aprendizado supervisionado, e precisamos de um alvo 'y' nomeado.
+
+Em uma nova célula de código, carregue o conjunto de dados de diabetes chamando `load_diabetes()`. O parâmetro `return_X_y=True` indica que `X` será uma matriz de dados e `y` será o alvo da regressão.
+
+1. Adicione alguns comandos de impressão para mostrar a forma da matriz de dados e seu primeiro elemento:
+
+ ```python
+ X, y = datasets.load_diabetes(return_X_y=True)
+ print(X.shape)
+ print(X[0])
+ ```
+
+ O que você está recebendo como resposta é uma tupla. O que você está fazendo é atribuir os dois primeiros valores da tupla a `X` e `y`, respectivamente. Saiba mais [sobre tuplas](https://wikipedia.org/wiki/Tuple).
+
+ Você pode ver que esses dados têm 442 itens organizados em arrays de 10 elementos:
+
+ ```text
+ (442, 10)
+ [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
+ -0.04340085 -0.00259226 0.01990842 -0.01764613]
+ ```
+
+ ✅ Pense um pouco sobre a relação entre os dados e o alvo da regressão. A regressão linear prevê relações entre a característica X e a variável alvo y. Você consegue encontrar o [alvo](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) para o conjunto de dados de diabetes na documentação? O que este conjunto de dados está demonstrando, dado o alvo?
+
+2. Em seguida, selecione uma parte deste conjunto de dados para plotar, escolhendo a 3ª coluna do conjunto de dados. Você pode fazer isso usando o operador `:` para selecionar todas as linhas e, em seguida, selecionar a 3ª coluna usando o índice (2). Você também pode remodelar os dados para serem uma matriz 2D - conforme necessário para plotagem - usando `reshape(n_rows, n_columns)`. Se um dos parâmetros for -1, a dimensão correspondente será calculada automaticamente.
+
+ ```python
+ X = X[:, 2]
+ X = X.reshape((-1,1))
+ ```
+
+ ✅ A qualquer momento, imprima os dados para verificar sua forma.
+
+3. Agora que você tem os dados prontos para serem plotados, pode ver se uma máquina pode ajudar a determinar uma divisão lógica entre os números neste conjunto de dados. Para fazer isso, você precisa dividir tanto os dados (X) quanto o alvo (y) em conjuntos de teste e treinamento. O Scikit-learn tem uma maneira simples de fazer isso; você pode dividir seus dados de teste em um ponto específico.
+
+ ```python
+ X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
+ ```
+
+4. Agora você está pronto para treinar seu modelo! Carregue o modelo de regressão linear e treine-o com seus conjuntos de treinamento X e y usando `model.fit()`:
+
+ ```python
+ model = linear_model.LinearRegression()
+ model.fit(X_train, y_train)
+ ```
+
+ ✅ `model.fit()` é uma função que você verá em muitas bibliotecas de ML, como TensorFlow.
+
+5. Em seguida, crie uma previsão usando os dados de teste, utilizando a função `predict()`. Isso será usado para desenhar a linha entre os grupos de dados.
+
+ ```python
+ y_pred = model.predict(X_test)
+ ```
+
+6. Agora é hora de mostrar os dados em um gráfico. O Matplotlib é uma ferramenta muito útil para esta tarefa. Crie um gráfico de dispersão de todos os dados de teste X e y e use a previsão para desenhar uma linha no lugar mais apropriado, entre os agrupamentos de dados do modelo.
+
+ ```python
+ plt.scatter(X_test, y_test, color='black')
+ plt.plot(X_test, y_pred, color='blue', linewidth=3)
+ plt.xlabel('Scaled BMIs')
+ plt.ylabel('Disease Progression')
+ plt.title('A Graph Plot Showing Diabetes Progression Against BMI')
+ plt.show()
+ ```
+
+ 
+✅ Pense um pouco sobre o que está acontecendo aqui. Uma linha reta está passando por muitos pequenos pontos de dados, mas o que exatamente ela está fazendo? Você consegue perceber como deveria ser possível usar essa linha para prever onde um novo ponto de dados, ainda não visto, deveria se encaixar em relação ao eixo y do gráfico? Tente colocar em palavras o uso prático desse modelo.
+
+Parabéns, você construiu seu primeiro modelo de regressão linear, fez uma previsão com ele e a exibiu em um gráfico!
+
+---
+## 🚀Desafio
+
+Faça o gráfico de uma variável diferente deste conjunto de dados. Dica: edite esta linha: `X = X[:,2]`. Dado o alvo deste conjunto de dados, o que você consegue descobrir sobre a progressão do diabetes como uma doença?
+
+## [Questionário pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/10/)
+
+## Revisão e Autoestudo
+
+Neste tutorial, você trabalhou com regressão linear simples, em vez de regressão univariada ou múltipla. Leia um pouco sobre as diferenças entre esses métodos ou dê uma olhada [neste vídeo](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef).
+
+Leia mais sobre o conceito de regressão e pense em que tipos de perguntas podem ser respondidas por essa técnica. Faça este [tutorial](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) para aprofundar seu entendimento.
+
+## Tarefa
+
+[Um conjunto de dados diferente](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/1-Tools/assignment.md b/translations/br/2-Regression/1-Tools/assignment.md
new file mode 100644
index 000000000..d1451d1eb
--- /dev/null
+++ b/translations/br/2-Regression/1-Tools/assignment.md
@@ -0,0 +1,27 @@
+
+# Regressão com Scikit-learn
+
+## Instruções
+
+Dê uma olhada no [conjunto de dados Linnerud](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) no Scikit-learn. Este conjunto de dados possui múltiplos [alvos](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): 'Ele consiste em três variáveis de exercício (dados) e três variáveis fisiológicas (alvo) coletadas de vinte homens de meia-idade em um clube de fitness'.
+
+Com suas próprias palavras, descreva como criar um modelo de Regressão que plote a relação entre a circunferência da cintura e a quantidade de abdominais realizados. Faça o mesmo para os outros pontos de dados deste conjunto de dados.
+
+## Rubrica
+
+| Critério | Exemplary | Adequado | Precisa de Melhorias |
+| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- |
+| Enviar um parágrafo descritivo | Um parágrafo bem escrito é enviado | Algumas frases são enviadas | Nenhuma descrição é fornecida |
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/1-Tools/notebook.ipynb b/translations/br/2-Regression/1-Tools/notebook.ipynb
new file mode 100644
index 000000000..e69de29bb
diff --git a/translations/br/2-Regression/1-Tools/solution/Julia/README.md b/translations/br/2-Regression/1-Tools/solution/Julia/README.md
new file mode 100644
index 000000000..f3ab05bf8
--- /dev/null
+++ b/translations/br/2-Regression/1-Tools/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb b/translations/br/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb
new file mode 100644
index 000000000..f8dff255c
--- /dev/null
+++ b/translations/br/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb
@@ -0,0 +1,447 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "metadata": {
+ "colab": {
+ "name": "lesson_1-R.ipynb",
+ "provenance": [],
+ "collapsed_sections": [],
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "name": "ir",
+ "display_name": "R"
+ },
+ "language_info": {
+ "name": "R"
+ },
+ "coopTranslator": {
+ "original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
+ "translation_date": "2025-08-29T23:09:43+00:00",
+ "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
+ "language_code": "br"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "YJUHCXqK57yz"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## Introdução à Regressão - Aula 1\n",
+ "\n",
+ "#### Colocando em perspectiva\n",
+ "\n",
+ "✅ Existem muitos tipos de métodos de regressão, e qual você escolhe depende da resposta que está buscando. Se você quiser prever a altura provável de uma pessoa com uma determinada idade, usaria `regressão linear`, pois está procurando um **valor numérico**. Se estiver interessado em descobrir se um tipo de culinária deve ser considerado vegano ou não, estará buscando uma **atribuição de categoria**, então usaria `regressão logística`. Você aprenderá mais sobre regressão logística mais adiante. Pense um pouco sobre algumas perguntas que você pode fazer aos dados e quais desses métodos seriam mais apropriados.\n",
+ "\n",
+ "Nesta seção, você trabalhará com um [pequeno conjunto de dados sobre diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Imagine que você queira testar um tratamento para pacientes diabéticos. Modelos de aprendizado de máquina podem ajudar a determinar quais pacientes responderiam melhor ao tratamento, com base em combinações de variáveis. Mesmo um modelo de regressão muito básico, quando visualizado, pode mostrar informações sobre variáveis que ajudariam você a organizar seus ensaios clínicos teóricos.\n",
+ "\n",
+ "Dito isso, vamos começar esta tarefa!\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Arte por @allison_horst\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "LWNNzfqd6feZ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 1. Carregando nosso conjunto de ferramentas\n",
+ "\n",
+ "Para esta tarefa, vamos precisar dos seguintes pacotes:\n",
+ "\n",
+ "- `tidyverse`: O [tidyverse](https://www.tidyverse.org/) é uma [coleção de pacotes R](https://www.tidyverse.org/packages) projetada para tornar a ciência de dados mais rápida, fácil e divertida!\n",
+ "\n",
+ "- `tidymodels`: O [tidymodels](https://www.tidymodels.org/) é uma [coleção de pacotes](https://www.tidymodels.org/packages/) para modelagem e aprendizado de máquina.\n",
+ "\n",
+ "Você pode instalá-los com o seguinte comando:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
+ "\n",
+ "O script abaixo verifica se você possui os pacotes necessários para completar este módulo e os instala para você caso algum esteja faltando.\n"
+ ],
+ "metadata": {
+ "id": "FIo2YhO26wI9"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "source": [
+ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
+ "pacman::p_load(tidyverse, tidymodels)"
+ ],
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "Loading required package: pacman\n",
+ "\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "id": "cIA9fz9v7Dss",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Agora, vamos carregar esses pacotes incríveis e torná-los disponíveis na nossa sessão atual do R. (Isso é apenas para ilustração, `pacman::p_load()` já fez isso por você)\n"
+ ],
+ "metadata": {
+ "id": "gpO_P_6f9WUG"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# load the core Tidyverse packages\r\n",
+ "library(tidyverse)\r\n",
+ "\r\n",
+ "# load the core Tidymodels packages\r\n",
+ "library(tidymodels)\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "NLMycgG-9ezO"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 2. O conjunto de dados de diabetes\n",
+ "\n",
+ "Neste exercício, vamos demonstrar nossas habilidades de regressão fazendo previsões em um conjunto de dados de diabetes. O [conjunto de dados de diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) inclui `442 amostras` de dados relacionados ao diabetes, com 10 variáveis preditoras, `idade`, `sexo`, `índice de massa corporal`, `pressão arterial média` e `seis medições de soro sanguíneo`, além de uma variável de resultado `y`: uma medida quantitativa da progressão da doença um ano após a linha de base.\n",
+ "\n",
+ "|Número de observações|442|\n",
+ "|----------------------|:---|\n",
+ "|Número de preditores|As primeiras 10 colunas são preditivas numéricas|\n",
+ "|Resultado/Alvo|A coluna 11 é uma medida quantitativa da progressão da doença um ano após a linha de base|\n",
+ "|Informações dos preditores|- idade em anos\n",
+ "||- sexo\n",
+ "||- bmi índice de massa corporal\n",
+ "||- bp pressão arterial média\n",
+ "||- s1 tc, colesterol total no soro\n",
+ "||- s2 ldl, lipoproteínas de baixa densidade\n",
+ "||- s3 hdl, lipoproteínas de alta densidade\n",
+ "||- s4 tch, colesterol total / HDL\n",
+ "||- s5 ltg, possivelmente logaritmo do nível de triglicerídeos no soro\n",
+ "||- s6 glu, nível de açúcar no sangue|\n",
+ "\n",
+ "> 🎓 Lembre-se, isso é aprendizado supervisionado, e precisamos de um alvo chamado 'y'.\n",
+ "\n",
+ "Antes de manipular os dados com R, você precisa importar os dados para a memória do R ou estabelecer uma conexão com os dados que o R possa usar para acessá-los remotamente.\n",
+ "\n",
+ "> O pacote [readr](https://readr.tidyverse.org/), que faz parte do Tidyverse, oferece uma maneira rápida e amigável de ler dados retangulares no R.\n",
+ "\n",
+ "Agora, vamos carregar o conjunto de dados de diabetes fornecido neste URL de origem: \n",
+ "\n",
+ "Além disso, faremos uma verificação básica nos dados usando `glimpse()` e exibiremos as primeiras 5 linhas usando `slice()`.\n",
+ "\n",
+ "Antes de prosseguir, vamos também introduzir algo que você encontrará frequentemente no código R 🥁🥁: o operador pipe `%>%`\n",
+ "\n",
+ "O operador pipe (`%>%`) realiza operações em sequência lógica, passando um objeto para frente em uma função ou expressão de chamada. Você pode pensar no operador pipe como dizendo \"e então\" no seu código.\n"
+ ],
+ "metadata": {
+ "id": "KM6iXLH996Cl"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Import the data set\r\n",
+ "diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Get a glimpse and dimensions of the data\r\n",
+ "glimpse(diabetes)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Select the first 5 rows of the data\r\n",
+ "diabetes %>% \r\n",
+ " slice(1:5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "Z1geAMhM-bSP"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "`glimpse()` nos mostra que esses dados possuem 442 linhas e 11 colunas, com todas as colunas sendo do tipo de dado `double`.\n",
+ "\n",
+ " \n",
+ "\n",
+ "> glimpse() e slice() são funções do [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, parte do Tidyverse, é uma gramática de manipulação de dados que fornece um conjunto consistente de verbos para ajudar a resolver os desafios mais comuns de manipulação de dados.\n",
+ "\n",
+ " \n",
+ "\n",
+ "Agora que temos os dados, vamos focar em uma única característica (`bmi`) como alvo para este exercício. Isso exigirá que selecionemos as colunas desejadas. Então, como fazemos isso?\n",
+ "\n",
+ "[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) nos permite *selecionar* (e opcionalmente renomear) colunas em um data frame.\n"
+ ],
+ "metadata": {
+ "id": "UwjVT1Hz-c3Z"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Select predictor feature `bmi` and outcome `y`\r\n",
+ "diabetes_select <- diabetes %>% \r\n",
+ " select(c(bmi, y))\r\n",
+ "\r\n",
+ "# Print the first 5 rows\r\n",
+ "diabetes_select %>% \r\n",
+ " slice(1:10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "RDY1oAKI-m80"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 3. Dados de Treinamento e Teste\n",
+ "\n",
+ "É uma prática comum em aprendizado supervisionado *dividir* os dados em dois subconjuntos: um conjunto (geralmente maior) para treinar o modelo e um conjunto menor \"reservado\" para verificar como o modelo se saiu.\n",
+ "\n",
+ "Agora que temos os dados prontos, podemos verificar se uma máquina pode ajudar a determinar uma divisão lógica entre os números neste conjunto de dados. Podemos usar o pacote [rsample](https://tidymodels.github.io/rsample/), que faz parte do framework Tidymodels, para criar um objeto que contém as informações sobre *como* dividir os dados, e então usar mais duas funções do rsample para extrair os conjuntos de treinamento e teste criados:\n"
+ ],
+ "metadata": {
+ "id": "SDk668xK-tc3"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "set.seed(2056)\r\n",
+ "# Split 67% of the data for training and the rest for tesing\r\n",
+ "diabetes_split <- diabetes_select %>% \r\n",
+ " initial_split(prop = 0.67)\r\n",
+ "\r\n",
+ "# Extract the resulting train and test sets\r\n",
+ "diabetes_train <- training(diabetes_split)\r\n",
+ "diabetes_test <- testing(diabetes_split)\r\n",
+ "\r\n",
+ "# Print the first 3 rows of the training set\r\n",
+ "diabetes_train %>% \r\n",
+ " slice(1:10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "EqtHx129-1h-"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 4. Treinar um modelo de regressão linear com Tidymodels\n",
+ "\n",
+ "Agora estamos prontos para treinar nosso modelo!\n",
+ "\n",
+ "No Tidymodels, você especifica modelos usando `parsnip()` ao definir três conceitos:\n",
+ "\n",
+ "- O **tipo** do modelo diferencia modelos como regressão linear, regressão logística, modelos de árvore de decisão, entre outros.\n",
+ "\n",
+ "- O **modo** do modelo inclui opções comuns como regressão e classificação; alguns tipos de modelo suportam ambos, enquanto outros possuem apenas um modo.\n",
+ "\n",
+ "- O **motor** do modelo é a ferramenta computacional que será usada para ajustar o modelo. Frequentemente, são pacotes do R, como **`\"lm\"`** ou **`\"ranger\"`**.\n",
+ "\n",
+ "Essas informações de modelagem são capturadas em uma especificação de modelo, então vamos criar uma!\n"
+ ],
+ "metadata": {
+ "id": "sBOS-XhB-6v7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Build a linear model specification\r\n",
+ "lm_spec <- \r\n",
+ " # Type\r\n",
+ " linear_reg() %>% \r\n",
+ " # Engine\r\n",
+ " set_engine(\"lm\") %>% \r\n",
+ " # Mode\r\n",
+ " set_mode(\"regression\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Print the model specification\r\n",
+ "lm_spec"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "20OwEw20--t3"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Depois que um modelo foi *especificado*, ele pode ser `estimado` ou `treinado` usando a função [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), geralmente utilizando uma fórmula e alguns dados.\n",
+ "\n",
+ "`y ~ .` significa que ajustaremos `y` como a quantidade/objetivo previsto, explicado por todos os preditores/características, ou seja, `.` (neste caso, temos apenas um preditor: `bmi`).\n"
+ ],
+ "metadata": {
+ "id": "_oDHs89k_CJj"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Build a linear model specification\r\n",
+ "lm_spec <- linear_reg() %>% \r\n",
+ " set_engine(\"lm\") %>%\r\n",
+ " set_mode(\"regression\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Train a linear regression model\r\n",
+ "lm_mod <- lm_spec %>% \r\n",
+ " fit(y ~ ., data = diabetes_train)\r\n",
+ "\r\n",
+ "# Print the model\r\n",
+ "lm_mod"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "YlsHqd-q_GJQ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "A partir do resultado do modelo, podemos observar os coeficientes aprendidos durante o treinamento. Eles representam os coeficientes da linha de melhor ajuste que nos dá o menor erro geral entre a variável real e a prevista. \n",
+ " \n",
+ "\n",
+ "## 5. Fazer previsões no conjunto de teste\n",
+ "\n",
+ "Agora que treinamos um modelo, podemos usá-lo para prever a progressão da doença y para o conjunto de dados de teste usando [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Isso será usado para traçar a linha entre os grupos de dados.\n"
+ ],
+ "metadata": {
+ "id": "kGZ22RQj_Olu"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make predictions for the test set\r\n",
+ "predictions <- lm_mod %>% \r\n",
+ " predict(new_data = diabetes_test)\r\n",
+ "\r\n",
+ "# Print out some of the predictions\r\n",
+ "predictions %>% \r\n",
+ " slice(1:5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "nXHbY7M2_aao"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Uhuu! 💃🕺 Acabamos de treinar um modelo e usá-lo para fazer previsões!\n",
+ "\n",
+ "Ao fazer previsões, a convenção do tidymodels é sempre produzir um tibble/data frame de resultados com nomes de colunas padronizados. Isso facilita a combinação dos dados originais com as previsões em um formato utilizável para operações subsequentes, como criação de gráficos.\n",
+ "\n",
+ "`dplyr::bind_cols()` une de forma eficiente várias data frames por coluna.\n"
+ ],
+ "metadata": {
+ "id": "R_JstwUY_bIs"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Combine the predictions and the original test set\r\n",
+ "results <- diabetes_test %>% \r\n",
+ " bind_cols(predictions)\r\n",
+ "\r\n",
+ "\r\n",
+ "results %>% \r\n",
+ " slice(1:5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "RybsMJR7_iI8"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 6. Plotar resultados do modelo\n",
+ "\n",
+ "Agora é hora de visualizar isso 📈. Vamos criar um gráfico de dispersão com todos os valores de `y` e `bmi` do conjunto de teste e, em seguida, usar as previsões para desenhar uma linha no lugar mais apropriado, entre os agrupamentos de dados do modelo.\n",
+ "\n",
+ "O R possui vários sistemas para criar gráficos, mas o `ggplot2` é um dos mais elegantes e versáteis. Ele permite que você componha gráficos **combinando componentes independentes**.\n"
+ ],
+ "metadata": {
+ "id": "XJbYbMZW_n_s"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Set a theme for the plot\r\n",
+ "theme_set(theme_light())\r\n",
+ "# Create a scatter plot\r\n",
+ "results %>% \r\n",
+ " ggplot(aes(x = bmi)) +\r\n",
+ " # Add a scatter plot\r\n",
+ " geom_point(aes(y = y), size = 1.6) +\r\n",
+ " # Add a line plot\r\n",
+ " geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "R9tYp3VW_sTn"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "✅ Pense um pouco sobre o que está acontecendo aqui. Uma linha reta está passando por vários pequenos pontos de dados, mas o que exatamente ela está fazendo? Você consegue perceber como deveria ser possível usar essa linha para prever onde um novo ponto de dados, ainda não visto, deveria se encaixar em relação ao eixo y do gráfico? Tente colocar em palavras o uso prático desse modelo.\n",
+ "\n",
+ "Parabéns, você construiu seu primeiro modelo de regressão linear, fez uma previsão com ele e a exibiu em um gráfico!\n"
+ ],
+ "metadata": {
+ "id": "zrPtHIxx_tNI"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/1-Tools/solution/notebook.ipynb b/translations/br/2-Regression/1-Tools/solution/notebook.ipynb
new file mode 100644
index 000000000..8753e05b0
--- /dev/null
+++ b/translations/br/2-Regression/1-Tools/solution/notebook.ipynb
@@ -0,0 +1,675 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Importar bibliotecas necessárias\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from sklearn import datasets, linear_model, model_selection\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Carregue o conjunto de dados de diabetes, dividido em dados `X` e características `y`\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(442, 10)\n",
+ "[ 0.03807591 0.05068012 0.06169621 0.02187239 -0.0442235 -0.03482076\n",
+ " -0.04340085 -0.00259226 0.01990749 -0.01764613]\n"
+ ]
+ }
+ ],
+ "source": [
+ "X, y = datasets.load_diabetes(return_X_y=True)\n",
+ "print(X.shape)\n",
+ "print(X[0])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Selecione apenas uma funcionalidade para focar neste exercício\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(442,)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Selecting the 3rd feature\n",
+ "X = X[:, 2]\n",
+ "print(X.shape)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(442, 1)\n",
+ "[[ 0.06169621]\n",
+ " [-0.05147406]\n",
+ " [ 0.04445121]\n",
+ " [-0.01159501]\n",
+ " [-0.03638469]\n",
+ " [-0.04069594]\n",
+ " [-0.04716281]\n",
+ " [-0.00189471]\n",
+ " [ 0.06169621]\n",
+ " [ 0.03906215]\n",
+ " [-0.08380842]\n",
+ " [ 0.01750591]\n",
+ " [-0.02884001]\n",
+ " [-0.00189471]\n",
+ " [-0.02560657]\n",
+ " [-0.01806189]\n",
+ " [ 0.04229559]\n",
+ " [ 0.01211685]\n",
+ " [-0.0105172 ]\n",
+ " [-0.01806189]\n",
+ " [-0.05686312]\n",
+ " [-0.02237314]\n",
+ " [-0.00405033]\n",
+ " [ 0.06061839]\n",
+ " [ 0.03582872]\n",
+ " [-0.01267283]\n",
+ " [-0.07734155]\n",
+ " [ 0.05954058]\n",
+ " [-0.02129532]\n",
+ " [-0.00620595]\n",
+ " [ 0.04445121]\n",
+ " [-0.06548562]\n",
+ " [ 0.12528712]\n",
+ " [-0.05039625]\n",
+ " [-0.06332999]\n",
+ " [-0.03099563]\n",
+ " [ 0.02289497]\n",
+ " [ 0.01103904]\n",
+ " [ 0.07139652]\n",
+ " [ 0.01427248]\n",
+ " [-0.00836158]\n",
+ " [-0.06764124]\n",
+ " [-0.0105172 ]\n",
+ " [-0.02345095]\n",
+ " [ 0.06816308]\n",
+ " [-0.03530688]\n",
+ " [-0.01159501]\n",
+ " [-0.0730303 ]\n",
+ " [-0.04177375]\n",
+ " [ 0.01427248]\n",
+ " [-0.00728377]\n",
+ " [ 0.0164281 ]\n",
+ " [-0.00943939]\n",
+ " [-0.01590626]\n",
+ " [ 0.0250506 ]\n",
+ " [-0.04931844]\n",
+ " [ 0.04121778]\n",
+ " [-0.06332999]\n",
+ " [-0.06440781]\n",
+ " [-0.02560657]\n",
+ " [-0.00405033]\n",
+ " [ 0.00457217]\n",
+ " [-0.00728377]\n",
+ " [-0.0374625 ]\n",
+ " [-0.02560657]\n",
+ " [-0.02452876]\n",
+ " [-0.01806189]\n",
+ " [-0.01482845]\n",
+ " [-0.02991782]\n",
+ " [-0.046085 ]\n",
+ " [-0.06979687]\n",
+ " [ 0.03367309]\n",
+ " [-0.00405033]\n",
+ " [-0.02021751]\n",
+ " [ 0.00241654]\n",
+ " [-0.03099563]\n",
+ " [ 0.02828403]\n",
+ " [-0.03638469]\n",
+ " [-0.05794093]\n",
+ " [-0.0374625 ]\n",
+ " [ 0.01211685]\n",
+ " [-0.02237314]\n",
+ " [-0.03530688]\n",
+ " [ 0.00996123]\n",
+ " [-0.03961813]\n",
+ " [ 0.07139652]\n",
+ " [-0.07518593]\n",
+ " [-0.00620595]\n",
+ " [-0.04069594]\n",
+ " [-0.04824063]\n",
+ " [-0.02560657]\n",
+ " [ 0.0519959 ]\n",
+ " [ 0.00457217]\n",
+ " [-0.06440781]\n",
+ " [-0.01698407]\n",
+ " [-0.05794093]\n",
+ " [ 0.00996123]\n",
+ " [ 0.08864151]\n",
+ " [-0.00512814]\n",
+ " [-0.06440781]\n",
+ " [ 0.01750591]\n",
+ " [-0.04500719]\n",
+ " [ 0.02828403]\n",
+ " [ 0.04121778]\n",
+ " [ 0.06492964]\n",
+ " [-0.03207344]\n",
+ " [-0.07626374]\n",
+ " [ 0.04984027]\n",
+ " [ 0.04552903]\n",
+ " [-0.00943939]\n",
+ " [-0.03207344]\n",
+ " [ 0.00457217]\n",
+ " [ 0.02073935]\n",
+ " [ 0.01427248]\n",
+ " [ 0.11019775]\n",
+ " [ 0.00133873]\n",
+ " [ 0.05846277]\n",
+ " [-0.02129532]\n",
+ " [-0.0105172 ]\n",
+ " [-0.04716281]\n",
+ " [ 0.00457217]\n",
+ " [ 0.01750591]\n",
+ " [ 0.08109682]\n",
+ " [ 0.0347509 ]\n",
+ " [ 0.02397278]\n",
+ " [-0.00836158]\n",
+ " [-0.06117437]\n",
+ " [-0.00189471]\n",
+ " [-0.06225218]\n",
+ " [ 0.0164281 ]\n",
+ " [ 0.09618619]\n",
+ " [-0.06979687]\n",
+ " [-0.02129532]\n",
+ " [-0.05362969]\n",
+ " [ 0.0433734 ]\n",
+ " [ 0.05630715]\n",
+ " [-0.0816528 ]\n",
+ " [ 0.04984027]\n",
+ " [ 0.11127556]\n",
+ " [ 0.06169621]\n",
+ " [ 0.01427248]\n",
+ " [ 0.04768465]\n",
+ " [ 0.01211685]\n",
+ " [ 0.00564998]\n",
+ " [ 0.04660684]\n",
+ " [ 0.12852056]\n",
+ " [ 0.05954058]\n",
+ " [ 0.09295276]\n",
+ " [ 0.01535029]\n",
+ " [-0.00512814]\n",
+ " [ 0.0703187 ]\n",
+ " [-0.00405033]\n",
+ " [-0.00081689]\n",
+ " [-0.04392938]\n",
+ " [ 0.02073935]\n",
+ " [ 0.06061839]\n",
+ " [-0.0105172 ]\n",
+ " [-0.03315126]\n",
+ " [-0.06548562]\n",
+ " [ 0.0433734 ]\n",
+ " [-0.06225218]\n",
+ " [ 0.06385183]\n",
+ " [ 0.03043966]\n",
+ " [ 0.07247433]\n",
+ " [-0.0191397 ]\n",
+ " [-0.06656343]\n",
+ " [-0.06009656]\n",
+ " [ 0.06924089]\n",
+ " [ 0.05954058]\n",
+ " [-0.02668438]\n",
+ " [-0.02021751]\n",
+ " [-0.046085 ]\n",
+ " [ 0.07139652]\n",
+ " [-0.07949718]\n",
+ " [ 0.00996123]\n",
+ " [-0.03854032]\n",
+ " [ 0.01966154]\n",
+ " [ 0.02720622]\n",
+ " [-0.00836158]\n",
+ " [-0.01590626]\n",
+ " [ 0.00457217]\n",
+ " [-0.04285156]\n",
+ " [ 0.00564998]\n",
+ " [-0.03530688]\n",
+ " [ 0.02397278]\n",
+ " [-0.01806189]\n",
+ " [ 0.04229559]\n",
+ " [-0.0547075 ]\n",
+ " [-0.00297252]\n",
+ " [-0.06656343]\n",
+ " [-0.01267283]\n",
+ " [-0.04177375]\n",
+ " [-0.03099563]\n",
+ " [-0.00512814]\n",
+ " [-0.05901875]\n",
+ " [ 0.0250506 ]\n",
+ " [-0.046085 ]\n",
+ " [ 0.00349435]\n",
+ " [ 0.05415152]\n",
+ " [-0.04500719]\n",
+ " [-0.05794093]\n",
+ " [-0.05578531]\n",
+ " [ 0.00133873]\n",
+ " [ 0.03043966]\n",
+ " [ 0.00672779]\n",
+ " [ 0.04660684]\n",
+ " [ 0.02612841]\n",
+ " [ 0.04552903]\n",
+ " [ 0.04013997]\n",
+ " [-0.01806189]\n",
+ " [ 0.01427248]\n",
+ " [ 0.03690653]\n",
+ " [ 0.00349435]\n",
+ " [-0.07087468]\n",
+ " [-0.03315126]\n",
+ " [ 0.09403057]\n",
+ " [ 0.03582872]\n",
+ " [ 0.03151747]\n",
+ " [-0.06548562]\n",
+ " [-0.04177375]\n",
+ " [-0.03961813]\n",
+ " [-0.03854032]\n",
+ " [-0.02560657]\n",
+ " [-0.02345095]\n",
+ " [-0.06656343]\n",
+ " [ 0.03259528]\n",
+ " [-0.046085 ]\n",
+ " [-0.02991782]\n",
+ " [-0.01267283]\n",
+ " [-0.01590626]\n",
+ " [ 0.07139652]\n",
+ " [-0.03099563]\n",
+ " [ 0.00026092]\n",
+ " [ 0.03690653]\n",
+ " [ 0.03906215]\n",
+ " [-0.01482845]\n",
+ " [ 0.00672779]\n",
+ " [-0.06871905]\n",
+ " [-0.00943939]\n",
+ " [ 0.01966154]\n",
+ " [ 0.07462995]\n",
+ " [-0.00836158]\n",
+ " [-0.02345095]\n",
+ " [-0.046085 ]\n",
+ " [ 0.05415152]\n",
+ " [-0.03530688]\n",
+ " [-0.03207344]\n",
+ " [-0.0816528 ]\n",
+ " [ 0.04768465]\n",
+ " [ 0.06061839]\n",
+ " [ 0.05630715]\n",
+ " [ 0.09834182]\n",
+ " [ 0.05954058]\n",
+ " [ 0.03367309]\n",
+ " [ 0.05630715]\n",
+ " [-0.06548562]\n",
+ " [ 0.16085492]\n",
+ " [-0.05578531]\n",
+ " [-0.02452876]\n",
+ " [-0.03638469]\n",
+ " [-0.00836158]\n",
+ " [-0.04177375]\n",
+ " [ 0.12744274]\n",
+ " [-0.07734155]\n",
+ " [ 0.02828403]\n",
+ " [-0.02560657]\n",
+ " [-0.06225218]\n",
+ " [-0.00081689]\n",
+ " [ 0.08864151]\n",
+ " [-0.03207344]\n",
+ " [ 0.03043966]\n",
+ " [ 0.00888341]\n",
+ " [ 0.00672779]\n",
+ " [-0.02021751]\n",
+ " [-0.02452876]\n",
+ " [-0.01159501]\n",
+ " [ 0.02612841]\n",
+ " [-0.05901875]\n",
+ " [-0.03638469]\n",
+ " [-0.02452876]\n",
+ " [ 0.01858372]\n",
+ " [-0.0902753 ]\n",
+ " [-0.00512814]\n",
+ " [-0.05255187]\n",
+ " [-0.02237314]\n",
+ " [-0.02021751]\n",
+ " [-0.0547075 ]\n",
+ " [-0.00620595]\n",
+ " [-0.01698407]\n",
+ " [ 0.05522933]\n",
+ " [ 0.07678558]\n",
+ " [ 0.01858372]\n",
+ " [-0.02237314]\n",
+ " [ 0.09295276]\n",
+ " [-0.03099563]\n",
+ " [ 0.03906215]\n",
+ " [-0.06117437]\n",
+ " [-0.00836158]\n",
+ " [-0.0374625 ]\n",
+ " [-0.01375064]\n",
+ " [ 0.07355214]\n",
+ " [-0.02452876]\n",
+ " [ 0.03367309]\n",
+ " [ 0.0347509 ]\n",
+ " [-0.03854032]\n",
+ " [-0.03961813]\n",
+ " [-0.00189471]\n",
+ " [-0.03099563]\n",
+ " [-0.046085 ]\n",
+ " [ 0.00133873]\n",
+ " [ 0.06492964]\n",
+ " [ 0.04013997]\n",
+ " [-0.02345095]\n",
+ " [ 0.05307371]\n",
+ " [ 0.04013997]\n",
+ " [-0.02021751]\n",
+ " [ 0.01427248]\n",
+ " [-0.03422907]\n",
+ " [ 0.00672779]\n",
+ " [ 0.00457217]\n",
+ " [ 0.03043966]\n",
+ " [ 0.0519959 ]\n",
+ " [ 0.06169621]\n",
+ " [-0.00728377]\n",
+ " [ 0.00564998]\n",
+ " [ 0.05415152]\n",
+ " [-0.00836158]\n",
+ " [ 0.114509 ]\n",
+ " [ 0.06708527]\n",
+ " [-0.05578531]\n",
+ " [ 0.03043966]\n",
+ " [-0.02560657]\n",
+ " [ 0.10480869]\n",
+ " [-0.00620595]\n",
+ " [-0.04716281]\n",
+ " [-0.04824063]\n",
+ " [ 0.08540807]\n",
+ " [-0.01267283]\n",
+ " [-0.03315126]\n",
+ " [-0.00728377]\n",
+ " [-0.01375064]\n",
+ " [ 0.05954058]\n",
+ " [ 0.02181716]\n",
+ " [ 0.01858372]\n",
+ " [-0.01159501]\n",
+ " [-0.00297252]\n",
+ " [ 0.01750591]\n",
+ " [-0.02991782]\n",
+ " [-0.02021751]\n",
+ " [-0.05794093]\n",
+ " [ 0.06061839]\n",
+ " [-0.04069594]\n",
+ " [-0.07195249]\n",
+ " [-0.05578531]\n",
+ " [ 0.04552903]\n",
+ " [-0.00943939]\n",
+ " [-0.03315126]\n",
+ " [ 0.04984027]\n",
+ " [-0.08488624]\n",
+ " [ 0.00564998]\n",
+ " [ 0.02073935]\n",
+ " [-0.00728377]\n",
+ " [ 0.10480869]\n",
+ " [-0.02452876]\n",
+ " [-0.00620595]\n",
+ " [-0.03854032]\n",
+ " [ 0.13714305]\n",
+ " [ 0.17055523]\n",
+ " [ 0.00241654]\n",
+ " [ 0.03798434]\n",
+ " [-0.05794093]\n",
+ " [-0.00943939]\n",
+ " [-0.02345095]\n",
+ " [-0.0105172 ]\n",
+ " [-0.03422907]\n",
+ " [-0.00297252]\n",
+ " [ 0.06816308]\n",
+ " [ 0.00996123]\n",
+ " [ 0.00241654]\n",
+ " [-0.03854032]\n",
+ " [ 0.02612841]\n",
+ " [-0.08919748]\n",
+ " [ 0.06061839]\n",
+ " [-0.02884001]\n",
+ " [-0.02991782]\n",
+ " [-0.0191397 ]\n",
+ " [-0.04069594]\n",
+ " [ 0.01535029]\n",
+ " [-0.02452876]\n",
+ " [ 0.00133873]\n",
+ " [ 0.06924089]\n",
+ " [-0.06979687]\n",
+ " [-0.02991782]\n",
+ " [-0.046085 ]\n",
+ " [ 0.01858372]\n",
+ " [ 0.00133873]\n",
+ " [-0.03099563]\n",
+ " [-0.00405033]\n",
+ " [ 0.01535029]\n",
+ " [ 0.02289497]\n",
+ " [ 0.04552903]\n",
+ " [-0.04500719]\n",
+ " [-0.03315126]\n",
+ " [ 0.097264 ]\n",
+ " [ 0.05415152]\n",
+ " [ 0.12313149]\n",
+ " [-0.08057499]\n",
+ " [ 0.09295276]\n",
+ " [-0.05039625]\n",
+ " [-0.01159501]\n",
+ " [-0.0277622 ]\n",
+ " [ 0.05846277]\n",
+ " [ 0.08540807]\n",
+ " [-0.00081689]\n",
+ " [ 0.00672779]\n",
+ " [ 0.00888341]\n",
+ " [ 0.08001901]\n",
+ " [ 0.07139652]\n",
+ " [-0.02452876]\n",
+ " [-0.0547075 ]\n",
+ " [-0.03638469]\n",
+ " [ 0.0164281 ]\n",
+ " [ 0.07786339]\n",
+ " [-0.03961813]\n",
+ " [ 0.01103904]\n",
+ " [-0.04069594]\n",
+ " [-0.03422907]\n",
+ " [ 0.00564998]\n",
+ " [ 0.08864151]\n",
+ " [-0.03315126]\n",
+ " [-0.05686312]\n",
+ " [-0.03099563]\n",
+ " [ 0.05522933]\n",
+ " [-0.06009656]\n",
+ " [ 0.00133873]\n",
+ " [-0.02345095]\n",
+ " [-0.07410811]\n",
+ " [ 0.01966154]\n",
+ " [-0.01590626]\n",
+ " [-0.01590626]\n",
+ " [ 0.03906215]\n",
+ " [-0.0730303 ]]\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Reshaping to get a 2D array\n",
+ "X = X.reshape(-1, 1)\n",
+ "print(X.shape)\n",
+ "print(X)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Divida os dados de treinamento e teste tanto para `X` quanto para `y`\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Selecione o modelo e ajuste-o com os dados de treinamento\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.scatter(X_test, y_test, color='black')\n",
+ "plt.plot(X_test, y_pred, color='blue', linewidth=3)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.1"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "16ff1a974f6e4348e869e4a7d366b86a",
+ "translation_date": "2025-08-29T23:06:23+00:00",
+ "source_file": "2-Regression/1-Tools/solution/notebook.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/2-Data/README.md b/translations/br/2-Regression/2-Data/README.md
new file mode 100644
index 000000000..ff421ac43
--- /dev/null
+++ b/translations/br/2-Regression/2-Data/README.md
@@ -0,0 +1,226 @@
+
+# Construir um modelo de regressão usando Scikit-learn: preparar e visualizar dados
+
+
+
+Infográfico por [Dasani Madipalli](https://twitter.com/dasani_decoded)
+
+## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/11/)
+
+> ### [Esta lição está disponível em R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
+
+## Introdução
+
+Agora que você já configurou as ferramentas necessárias para começar a construir modelos de aprendizado de máquina com Scikit-learn, está pronto para começar a fazer perguntas sobre seus dados. Ao trabalhar com dados e aplicar soluções de aprendizado de máquina, é muito importante saber como fazer a pergunta certa para desbloquear adequadamente o potencial do seu conjunto de dados.
+
+Nesta lição, você aprenderá:
+
+- Como preparar seus dados para a construção de modelos.
+- Como usar o Matplotlib para visualização de dados.
+
+## Fazendo a pergunta certa sobre seus dados
+
+A pergunta que você precisa responder determinará o tipo de algoritmos de aprendizado de máquina que você usará. E a qualidade da resposta que você obtém dependerá muito da natureza dos seus dados.
+
+Dê uma olhada nos [dados](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) fornecidos para esta lição. Você pode abrir este arquivo .csv no VS Code. Uma rápida olhada mostra imediatamente que há lacunas e uma mistura de dados numéricos e de texto. Há também uma coluna estranha chamada 'Package', onde os dados são uma mistura de 'sacks', 'bins' e outros valores. Os dados, na verdade, estão um pouco bagunçados.
+
+[](https://youtu.be/5qGjczWTrDQ "ML para iniciantes - Como analisar e limpar um conjunto de dados")
+
+> 🎥 Clique na imagem acima para assistir a um vídeo curto sobre como preparar os dados para esta lição.
+
+De fato, não é muito comum receber um conjunto de dados completamente pronto para criar um modelo de aprendizado de máquina imediatamente. Nesta lição, você aprenderá como preparar um conjunto de dados bruto usando bibliotecas padrão do Python. Você também aprenderá várias técnicas para visualizar os dados.
+
+## Estudo de caso: 'o mercado de abóboras'
+
+Nesta pasta, você encontrará um arquivo .csv na pasta raiz `data` chamado [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), que inclui 1757 linhas de dados sobre o mercado de abóboras, organizados por cidade. Estes são dados brutos extraídos dos [Relatórios Padrão de Mercados de Culturas Especiais](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distribuídos pelo Departamento de Agricultura dos Estados Unidos.
+
+### Preparando os dados
+
+Esses dados estão em domínio público. Eles podem ser baixados em vários arquivos separados, por cidade, no site do USDA. Para evitar muitos arquivos separados, concatenamos todos os dados das cidades em uma única planilha, ou seja, já _preparamos_ um pouco os dados. Agora, vamos dar uma olhada mais de perto nos dados.
+
+### Os dados das abóboras - primeiras conclusões
+
+O que você percebe sobre esses dados? Você já viu que há uma mistura de textos, números, lacunas e valores estranhos que precisam ser interpretados.
+
+Que pergunta você pode fazer sobre esses dados, usando uma técnica de Regressão? Que tal "Prever o preço de uma abóbora à venda em um determinado mês"? Olhando novamente para os dados, há algumas mudanças que você precisa fazer para criar a estrutura de dados necessária para essa tarefa.
+
+## Exercício - analisar os dados das abóboras
+
+Vamos usar o [Pandas](https://pandas.pydata.org/), (o nome significa `Python Data Analysis`) uma ferramenta muito útil para manipular dados, para analisar e preparar esses dados de abóboras.
+
+### Primeiro, verifique se há datas ausentes
+
+Primeiro, você precisará tomar medidas para verificar se há datas ausentes:
+
+1. Converta as datas para o formato de mês (essas são datas dos EUA, então o formato é `MM/DD/YYYY`).
+2. Extraia o mês para uma nova coluna.
+
+Abra o arquivo _notebook.ipynb_ no Visual Studio Code e importe a planilha para um novo dataframe do Pandas.
+
+1. Use a função `head()` para visualizar as primeiras cinco linhas.
+
+ ```python
+ import pandas as pd
+ pumpkins = pd.read_csv('../data/US-pumpkins.csv')
+ pumpkins.head()
+ ```
+
+ ✅ Que função você usaria para visualizar as últimas cinco linhas?
+
+1. Verifique se há dados ausentes no dataframe atual:
+
+ ```python
+ pumpkins.isnull().sum()
+ ```
+
+ Há dados ausentes, mas talvez isso não importe para a tarefa em questão.
+
+1. Para tornar seu dataframe mais fácil de trabalhar, selecione apenas as colunas necessárias, usando a função `loc`, que extrai do dataframe original um grupo de linhas (passado como primeiro parâmetro) e colunas (passado como segundo parâmetro). A expressão `:` no caso abaixo significa "todas as linhas".
+
+ ```python
+ columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
+ pumpkins = pumpkins.loc[:, columns_to_select]
+ ```
+
+### Segundo, determine o preço médio da abóbora
+
+Pense em como determinar o preço médio de uma abóbora em um determinado mês. Quais colunas você escolheria para essa tarefa? Dica: você precisará de 3 colunas.
+
+Solução: calcule a média das colunas `Low Price` e `High Price` para preencher a nova coluna Price, e converta a coluna Date para mostrar apenas o mês. Felizmente, de acordo com a verificação acima, não há dados ausentes para datas ou preços.
+
+1. Para calcular a média, adicione o seguinte código:
+
+ ```python
+ price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
+
+ month = pd.DatetimeIndex(pumpkins['Date']).month
+
+ ```
+
+ ✅ Sinta-se à vontade para imprimir quaisquer dados que desejar verificar usando `print(month)`.
+
+2. Agora, copie seus dados convertidos para um novo dataframe do Pandas:
+
+ ```python
+ new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
+ ```
+
+ Imprimir seu dataframe mostrará um conjunto de dados limpo e organizado no qual você pode construir seu novo modelo de regressão.
+
+### Mas espere! Há algo estranho aqui
+
+Se você olhar para a coluna `Package`, verá que as abóboras são vendidas em muitas configurações diferentes. Algumas são vendidas em medidas de '1 1/9 bushel', outras em '1/2 bushel', algumas por unidade, algumas por peso, e outras em grandes caixas de larguras variadas.
+
+> Parece que é muito difícil pesar abóboras de forma consistente
+
+Analisando os dados originais, é interessante notar que qualquer coisa com `Unit of Sale` igual a 'EACH' ou 'PER BIN' também tem o tipo `Package` por polegada, por bin ou 'each'. Parece que é muito difícil pesar abóboras de forma consistente, então vamos filtrá-las selecionando apenas as abóboras com a string 'bushel' na coluna `Package`.
+
+1. Adicione um filtro no topo do arquivo, logo após a importação inicial do .csv:
+
+ ```python
+ pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
+ ```
+
+ Se você imprimir os dados agora, verá que está obtendo apenas as cerca de 415 linhas de dados contendo abóboras por bushel.
+
+### Mas espere! Há mais uma coisa a fazer
+
+Você percebeu que a quantidade de bushel varia por linha? Você precisa normalizar os preços para mostrar o preço por bushel, então faça alguns cálculos para padronizá-lo.
+
+1. Adicione estas linhas após o bloco que cria o dataframe new_pumpkins:
+
+ ```python
+ new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
+
+ new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
+ ```
+
+✅ De acordo com [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), o peso de um bushel depende do tipo de produto, pois é uma medida de volume. "Um bushel de tomates, por exemplo, deve pesar 56 libras... Folhas e verduras ocupam mais espaço com menos peso, então um bushel de espinafre pesa apenas 20 libras." É tudo bem complicado! Vamos evitar fazer uma conversão de bushel para libra e, em vez disso, precificar por bushel. Todo esse estudo sobre bushels de abóboras, no entanto, mostra como é muito importante entender a natureza dos seus dados!
+
+Agora, você pode analisar os preços por unidade com base na medida de bushel. Se você imprimir os dados mais uma vez, verá como eles estão padronizados.
+
+✅ Você percebeu que as abóboras vendidas por meio bushel são muito caras? Consegue descobrir por quê? Dica: abóboras pequenas são muito mais caras do que as grandes, provavelmente porque há muito mais delas por bushel, dado o espaço não utilizado ocupado por uma grande abóbora oca para torta.
+
+## Estratégias de visualização
+
+Parte do papel do cientista de dados é demonstrar a qualidade e a natureza dos dados com os quais está trabalhando. Para isso, eles frequentemente criam visualizações interessantes, como gráficos de dispersão, gráficos de barras e outros, mostrando diferentes aspectos dos dados. Dessa forma, eles conseguem mostrar visualmente relações e lacunas que, de outra forma, seriam difíceis de identificar.
+
+[](https://youtu.be/SbUkxH6IJo0 "ML para iniciantes - Como visualizar dados com Matplotlib")
+
+> 🎥 Clique na imagem acima para assistir a um vídeo curto sobre como visualizar os dados para esta lição.
+
+As visualizações também podem ajudar a determinar a técnica de aprendizado de máquina mais apropriada para os dados. Um gráfico de dispersão que parece seguir uma linha, por exemplo, indica que os dados são um bom candidato para um exercício de regressão linear.
+
+Uma biblioteca de visualização de dados que funciona bem em notebooks Jupyter é o [Matplotlib](https://matplotlib.org/) (que você também viu na lição anterior).
+
+> Obtenha mais experiência com visualização de dados nestes [tutoriais](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
+
+## Exercício - experimente o Matplotlib
+
+Tente criar alguns gráficos básicos para exibir o novo dataframe que você acabou de criar. O que um gráfico de linha básico mostraria?
+
+1. Importe o Matplotlib no topo do arquivo, logo após a importação do Pandas:
+
+ ```python
+ import matplotlib.pyplot as plt
+ ```
+
+1. Execute novamente todo o notebook para atualizar.
+1. No final do notebook, adicione uma célula para plotar os dados como um gráfico de dispersão:
+
+ ```python
+ price = new_pumpkins.Price
+ month = new_pumpkins.Month
+ plt.scatter(price, month)
+ plt.show()
+ ```
+
+ 
+
+ Este é um gráfico útil? Algo nele te surpreende?
+
+ Não é particularmente útil, pois tudo o que faz é exibir seus dados como uma dispersão de pontos em um determinado mês.
+
+### Torne-o útil
+
+Para que os gráficos exibam dados úteis, geralmente é necessário agrupar os dados de alguma forma. Vamos tentar criar um gráfico onde o eixo y mostre os meses e os dados demonstrem a distribuição.
+
+1. Adicione uma célula para criar um gráfico de barras agrupado:
+
+ ```python
+ new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
+ plt.ylabel("Pumpkin Price")
+ ```
+
+ 
+
+ Este é um gráfico de dados mais útil! Parece indicar que o preço mais alto das abóboras ocorre em setembro e outubro. Isso corresponde à sua expectativa? Por quê?
+
+---
+
+## 🚀Desafio
+
+Explore os diferentes tipos de visualização que o Matplotlib oferece. Quais tipos são mais apropriados para problemas de regressão?
+
+## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/12/)
+
+## Revisão e Autoestudo
+
+Dê uma olhada nas várias maneiras de visualizar dados. Faça uma lista das diferentes bibliotecas disponíveis e anote quais são melhores para determinados tipos de tarefas, por exemplo, visualizações 2D vs. 3D. O que você descobre?
+
+## Tarefa
+
+[Explorando visualizações](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/2-Data/assignment.md b/translations/br/2-Regression/2-Data/assignment.md
new file mode 100644
index 000000000..7f45f5496
--- /dev/null
+++ b/translations/br/2-Regression/2-Data/assignment.md
@@ -0,0 +1,23 @@
+
+# Explorando Visualizações
+
+Existem várias bibliotecas disponíveis para visualização de dados. Crie algumas visualizações usando os dados de Pumpkin nesta lição com matplotlib e seaborn em um notebook de exemplo. Quais bibliotecas são mais fáceis de usar?
+
+## Rubrica
+
+| Critério | Exemplary | Adequado | Precisa de Melhorias |
+| -------- | --------- | -------- | -------------------- |
+| | Um notebook é enviado com duas explorações/visualizações | Um notebook é enviado com uma exploração/visualização | Um notebook não é enviado |
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/2-Data/notebook.ipynb b/translations/br/2-Regression/2-Data/notebook.ipynb
new file mode 100644
index 000000000..de04b8988
--- /dev/null
+++ b/translations/br/2-Regression/2-Data/notebook.ipynb
@@ -0,0 +1,46 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.3-final"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python3",
+ "display_name": "Python 3",
+ "language": "python"
+ },
+ "coopTranslator": {
+ "original_hash": "1b2ab303ac6c604a34c6ca7a49077fc7",
+ "translation_date": "2025-08-29T23:10:40+00:00",
+ "source_file": "2-Regression/2-Data/notebook.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/2-Data/solution/Julia/README.md b/translations/br/2-Regression/2-Data/solution/Julia/README.md
new file mode 100644
index 000000000..f57a43f69
--- /dev/null
+++ b/translations/br/2-Regression/2-Data/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/2-Data/solution/R/lesson_2-R.ipynb b/translations/br/2-Regression/2-Data/solution/R/lesson_2-R.ipynb
new file mode 100644
index 000000000..b77281da9
--- /dev/null
+++ b/translations/br/2-Regression/2-Data/solution/R/lesson_2-R.ipynb
@@ -0,0 +1,668 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "metadata": {
+ "colab": {
+ "name": "lesson_2-R.ipynb",
+ "provenance": [],
+ "collapsed_sections": [],
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "name": "ir",
+ "display_name": "R"
+ },
+ "language_info": {
+ "name": "R"
+ },
+ "coopTranslator": {
+ "original_hash": "f3c335f9940cfd76528b3ef918b9b342",
+ "translation_date": "2025-08-29T23:16:14+00:00",
+ "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb",
+ "language_code": "br"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Construir um modelo de regressão: preparar e visualizar dados\n",
+ "\n",
+ "## **Regressão Linear para Abóboras - Aula 2**\n",
+ "#### Introdução\n",
+ "\n",
+ "Agora que você já está equipado com as ferramentas necessárias para começar a construir modelos de aprendizado de máquina com Tidymodels e o Tidyverse, está pronto para começar a fazer perguntas sobre seus dados. Ao trabalhar com dados e aplicar soluções de aprendizado de máquina, é muito importante entender como formular a pergunta certa para desbloquear adequadamente o potencial do seu conjunto de dados.\n",
+ "\n",
+ "Nesta aula, você aprenderá:\n",
+ "\n",
+ "- Como preparar seus dados para a construção de modelos.\n",
+ "\n",
+ "- Como usar `ggplot2` para visualização de dados.\n",
+ "\n",
+ "A pergunta que você precisa responder determinará o tipo de algoritmos de aprendizado de máquina que você utilizará. E a qualidade da resposta que você obtiver dependerá fortemente da natureza dos seus dados.\n",
+ "\n",
+ "Vamos ver isso na prática por meio de um exercício.\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Arte por @allison_horst\n"
+ ],
+ "metadata": {
+ "id": "Pg5aexcOPqAZ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 1. Importando dados de abóboras e invocando o Tidyverse\n",
+ "\n",
+ "Vamos precisar dos seguintes pacotes para explorar e manipular esta lição:\n",
+ "\n",
+ "- `tidyverse`: O [tidyverse](https://www.tidyverse.org/) é uma [coleção de pacotes R](https://www.tidyverse.org/packages) projetada para tornar a ciência de dados mais rápida, fácil e divertida!\n",
+ "\n",
+ "Você pode instalá-los assim:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\"))`\n",
+ "\n",
+ "O script abaixo verifica se você possui os pacotes necessários para completar este módulo e os instala para você caso algum esteja faltando.\n"
+ ],
+ "metadata": {
+ "id": "dc5WhyVdXAjR"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
+ "pacman::p_load(tidyverse)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "GqPYUZgfXOBt"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Agora, vamos iniciar alguns pacotes e carregar os [dados](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) fornecidos para esta lição!\n"
+ ],
+ "metadata": {
+ "id": "kvjDTPDSXRr2"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load the core Tidyverse packages\n",
+ "library(tidyverse)\n",
+ "\n",
+ "# Import the pumpkins data\n",
+ "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
+ "\n",
+ "\n",
+ "# Get a glimpse and dimensions of the data\n",
+ "glimpse(pumpkins)\n",
+ "\n",
+ "\n",
+ "# Print the first 50 rows of the data set\n",
+ "pumpkins %>% \n",
+ " slice_head(n =50)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "VMri-t2zXqgD"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Um rápido `glimpse()` mostra imediatamente que há valores em branco e uma mistura de strings (`chr`) e dados numéricos (`dbl`). A coluna `Date` está no formato de texto e há também uma coluna estranha chamada `Package`, onde os dados são uma mistura de `sacks`, `bins` e outros valores. Na verdade, os dados estão um pouco bagunçados 😤.\n",
+ "\n",
+ "De fato, não é muito comum receber um conjunto de dados completamente pronto para ser usado na criação de um modelo de ML diretamente. Mas não se preocupe, nesta lição, você aprenderá como preparar um conjunto de dados bruto usando bibliotecas padrão do R 🧑🔧. Você também aprenderá várias técnicas para visualizar os dados. 📈📊\n",
+ " \n",
+ "\n",
+ "> Um lembrete: O operador pipe (`%>%`) realiza operações em sequência lógica, passando um objeto adiante para uma função ou expressão. Você pode pensar no operador pipe como se estivesse dizendo \"e então\" no seu código.\n"
+ ],
+ "metadata": {
+ "id": "REWcIv9yX29v"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 2. Verificar dados ausentes\n",
+ "\n",
+ "Um dos problemas mais comuns que os cientistas de dados precisam lidar é com dados incompletos ou ausentes. O R representa valores ausentes ou desconhecidos com um valor especial chamado sentinela: `NA` (Not Available).\n",
+ "\n",
+ "Então, como saberíamos que o data frame contém valores ausentes? \n",
+ " \n",
+ "- Uma maneira direta seria usar a função base do R `anyNA`, que retorna os objetos lógicos `TRUE` ou `FALSE`.\n"
+ ],
+ "metadata": {
+ "id": "Zxfb3AM5YbUe"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "pumpkins %>% \n",
+ " anyNA()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "G--DQutAYltj"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Ótimo, parece que há alguns dados faltando! Esse é um bom ponto de partida.\n",
+ "\n",
+ "- Outra maneira seria usar a função `is.na()`, que indica quais elementos individuais da coluna estão ausentes com um valor lógico `TRUE`.\n"
+ ],
+ "metadata": {
+ "id": "mU-7-SB6YokF"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "pumpkins %>% \n",
+ " is.na() %>% \n",
+ " head(n = 7)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "W-DxDOR4YxSW"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Certo, trabalho concluído, mas com um dataframe tão grande como este, seria ineficiente e praticamente impossível revisar todas as linhas e colunas individualmente😴.\n",
+ "\n",
+ "- Uma maneira mais intuitiva seria calcular a soma dos valores ausentes para cada coluna:\n"
+ ],
+ "metadata": {
+ "id": "xUWxipKYY0o7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "pumpkins %>% \n",
+ " is.na() %>% \n",
+ " colSums()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "ZRBWV6P9ZArL"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Muito melhor! Há dados faltando, mas talvez isso não importe para a tarefa em questão. Vamos ver o que uma análise mais aprofundada revela.\n",
+ "\n",
+ "> Junto com os incríveis conjuntos de pacotes e funções, o R possui uma documentação muito boa. Por exemplo, use `help(colSums)` ou `?colSums` para saber mais sobre a função.\n"
+ ],
+ "metadata": {
+ "id": "9gv-crB6ZD1Y"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 3. Dplyr: Uma Gramática para Manipulação de Dados\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Arte por @allison_horst\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "o4jLY5-VZO2C"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "[`dplyr`](https://dplyr.tidyverse.org/), um pacote do Tidyverse, é uma gramática de manipulação de dados que oferece um conjunto consistente de verbos para ajudar a resolver os desafios mais comuns de manipulação de dados. Nesta seção, vamos explorar alguns dos verbos do dplyr! \n",
+ " \n"
+ ],
+ "metadata": {
+ "id": "i5o33MQBZWWw"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### dplyr::select()\n",
+ "\n",
+ "`select()` é uma função do pacote `dplyr` que ajuda você a escolher colunas para manter ou excluir.\n",
+ "\n",
+ "Para tornar seu data frame mais fácil de trabalhar, remova várias de suas colunas usando `select()`, mantendo apenas as colunas que você precisa.\n",
+ "\n",
+ "Por exemplo, neste exercício, nossa análise envolverá as colunas `Package`, `Low Price`, `High Price` e `Date`. Vamos selecionar essas colunas.\n"
+ ],
+ "metadata": {
+ "id": "x3VGMAGBZiUr"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Select desired columns\n",
+ "pumpkins <- pumpkins %>% \n",
+ " select(Package, `Low Price`, `High Price`, Date)\n",
+ "\n",
+ "\n",
+ "# Print data set\n",
+ "pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "F_FgxQnVZnM0"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### dplyr::mutate()\n",
+ "\n",
+ "`mutate()` é uma função do pacote `dplyr` que ajuda a criar ou modificar colunas, mantendo as colunas existentes.\n",
+ "\n",
+ "A estrutura geral do `mutate` é:\n",
+ "\n",
+ "`data %>% mutate(nome_da_nova_coluna = o_que_ela_contem)`\n",
+ "\n",
+ "Vamos experimentar o `mutate` usando a coluna `Date` e realizando as seguintes operações:\n",
+ "\n",
+ "1. Converter as datas (atualmente do tipo caractere) para um formato de mês (essas são datas no formato dos EUA, ou seja, `MM/DD/YYYY`).\n",
+ "\n",
+ "2. Extrair o mês das datas para uma nova coluna.\n",
+ "\n",
+ "No R, o pacote [lubridate](https://lubridate.tidyverse.org/) facilita o trabalho com dados de data e hora. Então, vamos usar `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` e ver como alcançar os objetivos acima. Podemos descartar a coluna `Date`, já que não precisaremos mais dela nas operações subsequentes.\n"
+ ],
+ "metadata": {
+ "id": "2KKo0Ed9Z1VB"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load lubridate\n",
+ "library(lubridate)\n",
+ "\n",
+ "pumpkins <- pumpkins %>% \n",
+ " # Convert the Date column to a date object\n",
+ " mutate(Date = mdy(Date)) %>% \n",
+ " # Extract month from Date\n",
+ " mutate(Month = month(Date)) %>% \n",
+ " # Drop Date column\n",
+ " select(-Date)\n",
+ "\n",
+ "# View the first few rows\n",
+ "pumpkins %>% \n",
+ " slice_head(n = 7)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "5joszIVSZ6xe"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Uhuu! 🤩\n",
+ "\n",
+ "Agora, vamos criar uma nova coluna chamada `Price`, que representa o preço médio de uma abóbora. Para isso, vamos calcular a média das colunas `Low Price` e `High Price` para preencher a nova coluna Price. \n",
+ " \n"
+ ],
+ "metadata": {
+ "id": "nIgLjNMCZ-6Y"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Create a new column Price\n",
+ "pumpkins <- pumpkins %>% \n",
+ " mutate(Price = (`Low Price` + `High Price`)/2)\n",
+ "\n",
+ "# View the first few rows of the data\n",
+ "pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "Zo0BsqqtaJw2"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Yeees!💪\n",
+ "\n",
+ "\"Mas espere!\", você dirá depois de dar uma olhada rápida no conjunto de dados com `View(pumpkins)`, \"Tem algo estranho aqui!\"🤔\n",
+ "\n",
+ "Se você observar a coluna `Package`, verá que as abóboras são vendidas em várias configurações diferentes. Algumas são vendidas em medidas de `1 1/9 bushel`, outras em medidas de `1/2 bushel`, algumas por abóbora, outras por libra, e algumas em grandes caixas com larguras variadas.\n",
+ "\n",
+ "Vamos verificar isso:\n"
+ ],
+ "metadata": {
+ "id": "p77WZr-9aQAR"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Verify the distinct observations in Package column\n",
+ "pumpkins %>% \n",
+ " distinct(Package)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "XISGfh0IaUy6"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Incrível!👏\n",
+ "\n",
+ "Parece que abóboras são muito difíceis de pesar de forma consistente, então vamos filtrá-las selecionando apenas as abóboras que contêm a string *bushel* na coluna `Package` e colocar isso em um novo data frame `new_pumpkins`.\n"
+ ],
+ "metadata": {
+ "id": "7sMjiVujaZxY"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### dplyr::filter() e stringr::str_detect()\n",
+ "\n",
+ "[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): cria um subconjunto dos dados contendo apenas as **linhas** que atendem às suas condições, neste caso, abóboras com a string *bushel* na coluna `Package`.\n",
+ "\n",
+ "[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): detecta a presença ou ausência de um padrão em uma string.\n",
+ "\n",
+ "O pacote [`stringr`](https://github.com/tidyverse/stringr) fornece funções simples para operações comuns com strings.\n"
+ ],
+ "metadata": {
+ "id": "L8Qfcs92ageF"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Retain only pumpkins with \"bushel\"\n",
+ "new_pumpkins <- pumpkins %>% \n",
+ " filter(str_detect(Package, \"bushel\"))\n",
+ "\n",
+ "# Get the dimensions of the new data\n",
+ "dim(new_pumpkins)\n",
+ "\n",
+ "# View a few rows of the new data\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "hy_SGYREampd"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Você pode ver que reduzimos para cerca de 415 linhas de dados contendo abóboras por alqueire. 🤩\n"
+ ],
+ "metadata": {
+ "id": "VrDwF031avlR"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### dplyr::case_when()\n",
+ "\n",
+ "**Mas espere! Ainda há mais uma coisa a fazer**\n",
+ "\n",
+ "Você percebeu que a quantidade de alqueires varia por linha? É necessário normalizar os preços para que sejam exibidos por alqueire, e não por 1 1/9 ou 1/2 alqueire. Hora de fazer alguns cálculos para padronizar isso.\n",
+ "\n",
+ "Usaremos a função [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) para *modificar* a coluna Price dependendo de algumas condições. `case_when` permite que você vetorize múltiplas declarações `if_else()`.\n"
+ ],
+ "metadata": {
+ "id": "mLpw2jH4a0tx"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Convert the price if the Package contains fractional bushel values\n",
+ "new_pumpkins <- new_pumpkins %>% \n",
+ " mutate(Price = case_when(\n",
+ " str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
+ " str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
+ " TRUE ~ Price))\n",
+ "\n",
+ "# View the first few rows of the data\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 30)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "P68kLVQmbM6I"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Agora, podemos analisar o preço por unidade com base na medida de alqueire. Todo esse estudo sobre alqueires de abóboras, no entanto, mostra como é `importante` `entender a natureza dos seus dados`!\n",
+ "\n",
+ "> ✅ De acordo com [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), o peso de um alqueire depende do tipo de produto, já que é uma medida de volume. \"Um alqueire de tomates, por exemplo, deve pesar 56 libras... Folhas e verduras ocupam mais espaço com menos peso, então um alqueire de espinafre pesa apenas 20 libras.\" É tudo bem complicado! Vamos evitar fazer uma conversão de alqueire para libra e, em vez disso, precificar pelo alqueire. Todo esse estudo sobre alqueires de abóboras, no entanto, mostra como é muito importante entender a natureza dos seus dados!\n",
+ ">\n",
+ "> ✅ Você percebeu que as abóboras vendidas por meio alqueire são muito caras? Consegue descobrir o motivo? Dica: abóboras pequenas são muito mais caras do que as grandes, provavelmente porque há muito mais delas por alqueire, considerando o espaço não utilizado ocupado por uma grande abóbora oca de torta.\n"
+ ],
+ "metadata": {
+ "id": "pS2GNPagbSdb"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Agora, por pura diversão 💁♀️, vamos também mover a coluna Mês para a primeira posição, ou seja, `antes` da coluna `Pacote`.\n",
+ "\n",
+ "`dplyr::relocate()` é usado para alterar as posições das colunas.\n"
+ ],
+ "metadata": {
+ "id": "qql1SowfbdnP"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Create a new data frame new_pumpkins\n",
+ "new_pumpkins <- new_pumpkins %>% \n",
+ " relocate(Month, .before = Package)\n",
+ "\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 7)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "JJ1x6kw8bixF"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Bom trabalho!👌 Agora você tem um conjunto de dados limpo e organizado para construir seu novo modelo de regressão! \n",
+ " \n"
+ ],
+ "metadata": {
+ "id": "y8TJ0Za_bn5Y"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 4. Visualização de dados com ggplot2\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Infográfico por Dasani Madipalli\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "Existe um *sábio* ditado que diz o seguinte:\n",
+ "\n",
+ "> \"O gráfico simples trouxe mais informações à mente do analista de dados do que qualquer outro dispositivo.\" --- John Tukey\n",
+ "\n",
+ "Parte do papel do cientista de dados é demonstrar a qualidade e a natureza dos dados com os quais está trabalhando. Para isso, eles frequentemente criam visualizações interessantes, como gráficos, diagramas e tabelas, mostrando diferentes aspectos dos dados. Dessa forma, eles conseguem mostrar visualmente relações e lacunas que, de outra maneira, seriam difíceis de identificar.\n",
+ "\n",
+ "As visualizações também podem ajudar a determinar a técnica de aprendizado de máquina mais apropriada para os dados. Um gráfico de dispersão que parece seguir uma linha, por exemplo, indica que os dados são bons candidatos para um exercício de regressão linear.\n",
+ "\n",
+ "O R oferece vários sistemas para criar gráficos, mas [`ggplot2`](https://ggplot2.tidyverse.org/index.html) é um dos mais elegantes e versáteis. O `ggplot2` permite compor gráficos **combinando componentes independentes**.\n",
+ "\n",
+ "Vamos começar com um gráfico de dispersão simples para as colunas Price e Month.\n",
+ "\n",
+ "Neste caso, começaremos com [`ggplot()`](https://ggplot2.tidyverse.org/reference/ggplot.html), fornecendo um conjunto de dados e um mapeamento estético (com [`aes()`](https://ggplot2.tidyverse.org/reference/aes.html)) e, em seguida, adicionaremos camadas (como [`geom_point()`](https://ggplot2.tidyverse.org/reference/geom_point.html)) para gráficos de dispersão.\n"
+ ],
+ "metadata": {
+ "id": "mYSH6-EtbvNa"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Set a theme for the plots\n",
+ "theme_set(theme_light())\n",
+ "\n",
+ "# Create a scatter plot\n",
+ "p <- ggplot(data = new_pumpkins, aes(x = Price, y = Month))\n",
+ "p + geom_point()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "g2YjnGeOcLo4"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Este é um gráfico útil 🤷? Algo nele te surpreende?\n",
+ "\n",
+ "Não é particularmente útil, já que tudo o que ele faz é mostrar seus dados como uma distribuição de pontos em um determinado mês.\n",
+ " \n"
+ ],
+ "metadata": {
+ "id": "Ml7SDCLQcPvE"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### **Como tornamos isso útil?**\n",
+ "\n",
+ "Para exibir dados úteis em gráficos, geralmente é necessário agrupar os dados de alguma forma. Por exemplo, no nosso caso, calcular o preço médio das abóboras para cada mês forneceria mais insights sobre os padrões subjacentes em nossos dados. Isso nos leva a mais uma abordagem do **dplyr**:\n",
+ "\n",
+ "#### `dplyr::group_by() %>% summarize()`\n",
+ "\n",
+ "A agregação agrupada no R pode ser facilmente realizada usando\n",
+ "\n",
+ "`dplyr::group_by() %>% summarize()`\n",
+ "\n",
+ "- `dplyr::group_by()` altera a unidade de análise do conjunto de dados completo para grupos individuais, como por mês.\n",
+ "\n",
+ "- `dplyr::summarize()` cria um novo data frame com uma coluna para cada variável de agrupamento e uma coluna para cada estatística resumida que você especificou.\n",
+ "\n",
+ "Por exemplo, podemos usar `dplyr::group_by() %>% summarize()` para agrupar as abóboras com base na coluna **Month** e, em seguida, calcular o **preço médio** para cada mês.\n"
+ ],
+ "metadata": {
+ "id": "jMakvJZIcVkh"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Find the average price of pumpkins per month\r\n",
+ "new_pumpkins %>%\r\n",
+ " group_by(Month) %>% \r\n",
+ " summarise(mean_price = mean(Price))"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "6kVSUa2Bcilf"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Sucinto!✨\n",
+ "\n",
+ "Características categóricas, como meses, são melhor representadas usando um gráfico de barras 📊. As camadas responsáveis por gráficos de barras são `geom_bar()` e `geom_col()`. Consulte `?geom_bar` para saber mais.\n",
+ "\n",
+ "Vamos criar um agora!\n"
+ ],
+ "metadata": {
+ "id": "Kds48GUBcj3W"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Find the average price of pumpkins per month then plot a bar chart\r\n",
+ "new_pumpkins %>%\r\n",
+ " group_by(Month) %>% \r\n",
+ " summarise(mean_price = mean(Price)) %>% \r\n",
+ " ggplot(aes(x = Month, y = mean_price)) +\r\n",
+ " geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
+ " ylab(\"Pumpkin Price\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "VNbU1S3BcrxO"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "🤩🤩 Esta é uma visualização de dados mais útil! Parece indicar que o preço mais alto para abóboras ocorre em setembro e outubro. Isso atende às suas expectativas? Por que sim ou por que não?\n",
+ "\n",
+ "Parabéns por concluir a segunda lição 👏! Você preparou seus dados para a construção do modelo e, em seguida, descobriu mais insights usando visualizações!\n"
+ ],
+ "metadata": {
+ "id": "zDm0VOzzcuzR"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/2-Data/solution/notebook.ipynb b/translations/br/2-Regression/2-Data/solution/notebook.ipynb
new file mode 100644
index 000000000..cadd6f6b8
--- /dev/null
+++ b/translations/br/2-Regression/2-Data/solution/notebook.ipynb
@@ -0,0 +1,437 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Type
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Sub Variety
\n",
+ "
Grade
\n",
+ "
Date
\n",
+ "
Low Price
\n",
+ "
High Price
\n",
+ "
Mostly Low
\n",
+ "
...
\n",
+ "
Unit of Sale
\n",
+ "
Quality
\n",
+ "
Condition
\n",
+ "
Appearance
\n",
+ "
Storage
\n",
+ "
Crop
\n",
+ "
Repack
\n",
+ "
Trans Mode
\n",
+ "
Unnamed: 24
\n",
+ "
Unnamed: 25
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
70
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
71
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
72
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
10/1/16
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
18.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
73
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
10/1/16
\n",
+ "
17.0
\n",
+ "
17.0
\n",
+ "
17.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
74
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
1 1/9 bushel cartons
\n",
+ "
PIE TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
10/8/16
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
15.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Type Package Variety Sub Variety Grade \\\n",
+ "70 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "71 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "72 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "73 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "74 BALTIMORE NaN 1 1/9 bushel cartons PIE TYPE NaN NaN \n",
+ "\n",
+ " Date Low Price High Price Mostly Low ... Unit of Sale Quality \\\n",
+ "70 9/24/16 15.0 15.0 15.0 ... NaN NaN \n",
+ "71 9/24/16 18.0 18.0 18.0 ... NaN NaN \n",
+ "72 10/1/16 18.0 18.0 18.0 ... NaN NaN \n",
+ "73 10/1/16 17.0 17.0 17.0 ... NaN NaN \n",
+ "74 10/8/16 15.0 15.0 15.0 ... NaN NaN \n",
+ "\n",
+ " Condition Appearance Storage Crop Repack Trans Mode Unnamed: 24 \\\n",
+ "70 NaN NaN NaN NaN N NaN NaN \n",
+ "71 NaN NaN NaN NaN N NaN NaN \n",
+ "72 NaN NaN NaN NaN N NaN NaN \n",
+ "73 NaN NaN NaN NaN N NaN NaN \n",
+ "74 NaN NaN NaN NaN N NaN NaN \n",
+ "\n",
+ " Unnamed: 25 \n",
+ "70 NaN \n",
+ "71 NaN \n",
+ "72 NaN \n",
+ "73 NaN \n",
+ "74 NaN \n",
+ "\n",
+ "[5 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n",
+ "\n",
+ "pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
+ "\n",
+ "pumpkins.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "City Name 0\n",
+ "Type 406\n",
+ "Package 0\n",
+ "Variety 0\n",
+ "Sub Variety 167\n",
+ "Grade 415\n",
+ "Date 0\n",
+ "Low Price 0\n",
+ "High Price 0\n",
+ "Mostly Low 24\n",
+ "Mostly High 24\n",
+ "Origin 0\n",
+ "Origin District 396\n",
+ "Item Size 114\n",
+ "Color 145\n",
+ "Environment 415\n",
+ "Unit of Sale 404\n",
+ "Quality 415\n",
+ "Condition 415\n",
+ "Appearance 415\n",
+ "Storage 415\n",
+ "Crop 415\n",
+ "Repack 0\n",
+ "Trans Mode 415\n",
+ "Unnamed: 24 415\n",
+ "Unnamed: 25 391\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pumpkins.isnull().sum()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Month Package Low Price High Price Price\n",
+ "70 9 1 1/9 bushel cartons 15.00 15.0 13.50\n",
+ "71 9 1 1/9 bushel cartons 18.00 18.0 16.20\n",
+ "72 10 1 1/9 bushel cartons 18.00 18.0 16.20\n",
+ "73 10 1 1/9 bushel cartons 17.00 17.0 15.30\n",
+ "74 10 1 1/9 bushel cartons 15.00 15.0 13.50\n",
+ "... ... ... ... ... ...\n",
+ "1738 9 1/2 bushel cartons 15.00 15.0 30.00\n",
+ "1739 9 1/2 bushel cartons 13.75 15.0 28.75\n",
+ "1740 9 1/2 bushel cartons 10.75 15.0 25.75\n",
+ "1741 9 1/2 bushel cartons 12.00 12.0 24.00\n",
+ "1742 9 1/2 bushel cartons 12.00 12.0 24.00\n",
+ "\n",
+ "[415 rows x 5 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "\n",
+ "# A set of new columns for a new dataframe. Filter out nonmatching columns\n",
+ "columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']\n",
+ "pumpkins = pumpkins.loc[:, columns_to_select]\n",
+ "\n",
+ "# Get an average between low and high price for the base pumpkin price\n",
+ "price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2\n",
+ "\n",
+ "# Convert the date to its month only\n",
+ "month = pd.DatetimeIndex(pumpkins['Date']).month\n",
+ "\n",
+ "# Create a new dataframe with this basic data\n",
+ "new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})\n",
+ "\n",
+ "# Convert the price if the Package contains fractional bushel values\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)\n",
+ "\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)\n",
+ "\n",
+ "print(new_pumpkins)\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "\n",
+ "new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')\n",
+ "plt.ylabel(\"Pumpkin Price\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
+ },
+ "kernelspec": {
+ "display_name": "Python 3.7.0 64-bit ('3.7')",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.1"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "95726f0b8283628d5356a4f8eb8b4b76",
+ "translation_date": "2025-08-29T23:11:00+00:00",
+ "source_file": "2-Regression/2-Data/solution/notebook.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/3-Linear/README.md b/translations/br/2-Regression/3-Linear/README.md
new file mode 100644
index 000000000..f7446ff4a
--- /dev/null
+++ b/translations/br/2-Regression/3-Linear/README.md
@@ -0,0 +1,380 @@
+
+# Construir um modelo de regressão usando Scikit-learn: regressão de quatro maneiras
+
+
+> Infográfico por [Dasani Madipalli](https://twitter.com/dasani_decoded)
+## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/13/)
+
+> ### [Esta lição está disponível em R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
+### Introdução
+
+Até agora, você explorou o que é regressão com dados de exemplo coletados do conjunto de dados de preços de abóbora que usaremos ao longo desta lição. Você também os visualizou usando Matplotlib.
+
+Agora você está pronto para mergulhar mais fundo na regressão para aprendizado de máquina. Embora a visualização permita que você compreenda os dados, o verdadeiro poder do aprendizado de máquina vem do _treinamento de modelos_. Os modelos são treinados com dados históricos para capturar automaticamente as dependências dos dados e permitem prever resultados para novos dados que o modelo ainda não viu.
+
+Nesta lição, você aprenderá mais sobre dois tipos de regressão: _regressão linear básica_ e _regressão polinomial_, juntamente com algumas das matemáticas subjacentes a essas técnicas. Esses modelos nos permitirão prever os preços das abóboras dependendo de diferentes dados de entrada.
+
+[](https://youtu.be/CRxFT8oTDMg "ML para iniciantes - Entendendo a Regressão Linear")
+
+> 🎥 Clique na imagem acima para um breve vídeo sobre regressão linear.
+
+> Ao longo deste currículo, assumimos conhecimento mínimo de matemática e buscamos torná-lo acessível para estudantes de outras áreas. Fique atento a notas, 🧮 destaques, diagramas e outras ferramentas de aprendizado para ajudar na compreensão.
+
+### Pré-requisito
+
+Você já deve estar familiarizado com a estrutura dos dados de abóbora que estamos analisando. Você pode encontrá-los pré-carregados e pré-limpos no arquivo _notebook.ipynb_ desta lição. No arquivo, o preço da abóbora é exibido por alqueire em um novo data frame. Certifique-se de que pode executar esses notebooks em kernels no Visual Studio Code.
+
+### Preparação
+
+Como lembrete, você está carregando esses dados para fazer perguntas sobre eles.
+
+- Qual é o melhor momento para comprar abóboras?
+- Qual preço posso esperar por uma caixa de abóboras em miniatura?
+- Devo comprá-las em cestas de meio alqueire ou em caixas de 1 1/9 alqueire?
+Vamos continuar explorando esses dados.
+
+Na lição anterior, você criou um data frame do Pandas e o preencheu com parte do conjunto de dados original, padronizando os preços por alqueire. Ao fazer isso, no entanto, você só conseguiu reunir cerca de 400 pontos de dados e apenas para os meses de outono.
+
+Dê uma olhada nos dados que pré-carregamos no notebook que acompanha esta lição. Os dados estão pré-carregados e um gráfico de dispersão inicial é traçado para mostrar os dados por mês. Talvez possamos obter um pouco mais de detalhes sobre a natureza dos dados ao limpá-los mais.
+
+## Uma linha de regressão linear
+
+Como você aprendeu na Lição 1, o objetivo de um exercício de regressão linear é ser capaz de traçar uma linha para:
+
+- **Mostrar relações entre variáveis**. Mostrar a relação entre variáveis
+- **Fazer previsões**. Fazer previsões precisas sobre onde um novo ponto de dados cairia em relação a essa linha.
+
+É típico da **Regressão de Mínimos Quadrados** traçar esse tipo de linha. O termo 'mínimos quadrados' significa que todos os pontos de dados ao redor da linha de regressão são elevados ao quadrado e depois somados. Idealmente, essa soma final é o menor possível, porque queremos um número baixo de erros, ou `mínimos quadrados`.
+
+Fazemos isso porque queremos modelar uma linha que tenha a menor distância cumulativa de todos os nossos pontos de dados. Também elevamos os termos ao quadrado antes de somá-los, pois estamos preocupados com sua magnitude, em vez de sua direção.
+
+> **🧮 Mostre-me a matemática**
+>
+> Esta linha, chamada de _linha de melhor ajuste_, pode ser expressa por [uma equação](https://en.wikipedia.org/wiki/Simple_linear_regression):
+>
+> ```
+> Y = a + bX
+> ```
+>
+> `X` é a 'variável explicativa'. `Y` é a 'variável dependente'. A inclinação da linha é `b` e `a` é o intercepto no eixo Y, que se refere ao valor de `Y` quando `X = 0`.
+>
+>
+>
+> Primeiro, calcule a inclinação `b`. Infográfico por [Jen Looper](https://twitter.com/jenlooper)
+>
+> Em outras palavras, referindo-se à pergunta original dos dados de abóbora: "prever o preço de uma abóbora por alqueire por mês", `X` se referiria ao preço e `Y` ao mês de venda.
+>
+>
+>
+> Calcule o valor de Y. Se você está pagando cerca de $4, deve ser abril! Infográfico por [Jen Looper](https://twitter.com/jenlooper)
+>
+> A matemática que calcula a linha deve demonstrar a inclinação da linha, que também depende do intercepto, ou onde `Y` está situado quando `X = 0`.
+>
+> Você pode observar o método de cálculo desses valores no site [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Também visite [este calculador de mínimos quadrados](https://www.mathsisfun.com/data/least-squares-calculator.html) para ver como os valores dos números impactam a linha.
+
+## Correlação
+
+Outro termo importante para entender é o **Coeficiente de Correlação** entre as variáveis X e Y fornecidas. Usando um gráfico de dispersão, você pode visualizar rapidamente esse coeficiente. Um gráfico com pontos de dados espalhados em uma linha organizada tem alta correlação, mas um gráfico com pontos de dados espalhados por toda parte entre X e Y tem baixa correlação.
+
+Um bom modelo de regressão linear será aquele que tem um Coeficiente de Correlação alto (mais próximo de 1 do que de 0) usando o método de Mínimos Quadrados com uma linha de regressão.
+
+✅ Execute o notebook que acompanha esta lição e observe o gráfico de dispersão de Mês para Preço. Os dados que associam Mês ao Preço das vendas de abóbora parecem ter alta ou baixa correlação, de acordo com sua interpretação visual do gráfico de dispersão? Isso muda se você usar uma medida mais detalhada em vez de `Mês`, como *dia do ano* (ou seja, número de dias desde o início do ano)?
+
+No código abaixo, assumiremos que limpamos os dados e obtivemos um data frame chamado `new_pumpkins`, semelhante ao seguinte:
+
+ID | Mês | DiaDoAno | Variedade | Cidade | Embalagem | Preço Baixo | Preço Alto | Preço
+---|-----|----------|-----------|--------|-----------|-------------|------------|-------
+70 | 9 | 267 | TIPO TORTA | BALTIMORE | 1 1/9 caixas de alqueire | 15.0 | 15.0 | 13.636364
+71 | 9 | 267 | TIPO TORTA | BALTIMORE | 1 1/9 caixas de alqueire | 18.0 | 18.0 | 16.363636
+72 | 10 | 274 | TIPO TORTA | BALTIMORE | 1 1/9 caixas de alqueire | 18.0 | 18.0 | 16.363636
+73 | 10 | 274 | TIPO TORTA | BALTIMORE | 1 1/9 caixas de alqueire | 17.0 | 17.0 | 15.454545
+74 | 10 | 281 | TIPO TORTA | BALTIMORE | 1 1/9 caixas de alqueire | 15.0 | 15.0 | 13.636364
+
+> O código para limpar os dados está disponível em [`notebook.ipynb`](notebook.ipynb). Realizamos os mesmos passos de limpeza da lição anterior e calculamos a coluna `DiaDoAno` usando a seguinte expressão:
+
+```python
+day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
+```
+
+Agora que você entende a matemática por trás da regressão linear, vamos criar um modelo de regressão para ver se conseguimos prever qual embalagem de abóboras terá os melhores preços. Alguém comprando abóboras para um campo de abóboras de feriado pode querer essa informação para otimizar suas compras de embalagens de abóboras para o campo.
+
+## Procurando por Correlação
+
+[](https://youtu.be/uoRq-lW2eQo "ML para iniciantes - Procurando por Correlação: A Chave para Regressão Linear")
+
+> 🎥 Clique na imagem acima para um breve vídeo sobre correlação.
+
+Na lição anterior, você provavelmente viu que o preço médio para diferentes meses se parece com isto:
+
+
+
+Isso sugere que deve haver alguma correlação, e podemos tentar treinar um modelo de regressão linear para prever a relação entre `Mês` e `Preço`, ou entre `DiaDoAno` e `Preço`. Aqui está o gráfico de dispersão que mostra a última relação:
+
+
+
+Vamos ver se há correlação usando a função `corr`:
+
+```python
+print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
+print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
+```
+
+Parece que a correlação é bem pequena, -0.15 por `Mês` e -0.17 por `DiaDoAno`, mas pode haver outra relação importante. Parece que há diferentes agrupamentos de preços correspondendo a diferentes variedades de abóbora. Para confirmar essa hipótese, vamos plotar cada categoria de abóbora usando uma cor diferente. Passando um parâmetro `ax` para a função de plotagem `scatter`, podemos plotar todos os pontos no mesmo gráfico:
+
+```python
+ax=None
+colors = ['red','blue','green','yellow']
+for i,var in enumerate(new_pumpkins['Variety'].unique()):
+ df = new_pumpkins[new_pumpkins['Variety']==var]
+ ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
+```
+
+
+
+Nossa investigação sugere que a variedade tem mais efeito no preço geral do que a data de venda. Podemos ver isso com um gráfico de barras:
+
+```python
+new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
+```
+
+
+
+Vamos focar por enquanto apenas em uma variedade de abóbora, o 'tipo torta', e ver qual efeito a data tem no preço:
+
+```python
+pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
+pie_pumpkins.plot.scatter('DayOfYear','Price')
+```
+
+
+Se agora calcularmos a correlação entre `Preço` e `DiaDoAno` usando a função `corr`, obteremos algo como `-0.27` - o que significa que treinar um modelo preditivo faz sentido.
+
+> Antes de treinar um modelo de regressão linear, é importante garantir que nossos dados estejam limpos. A regressão linear não funciona bem com valores ausentes, portanto, faz sentido eliminar todas as células vazias:
+
+```python
+pie_pumpkins.dropna(inplace=True)
+pie_pumpkins.info()
+```
+
+Outra abordagem seria preencher esses valores vazios com valores médios da coluna correspondente.
+
+## Regressão Linear Simples
+
+[](https://youtu.be/e4c_UP2fSjg "ML para iniciantes - Regressão Linear e Polinomial usando Scikit-learn")
+
+> 🎥 Clique na imagem acima para um breve vídeo sobre regressão linear e polinomial.
+
+Para treinar nosso modelo de Regressão Linear, usaremos a biblioteca **Scikit-learn**.
+
+```python
+from sklearn.linear_model import LinearRegression
+from sklearn.metrics import mean_squared_error
+from sklearn.model_selection import train_test_split
+```
+
+Começamos separando os valores de entrada (features) e a saída esperada (label) em arrays numpy separados:
+
+```python
+X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
+y = pie_pumpkins['Price']
+```
+
+> Note que tivemos que realizar `reshape` nos dados de entrada para que o pacote de Regressão Linear os entendesse corretamente. A Regressão Linear espera um array 2D como entrada, onde cada linha do array corresponde a um vetor de características de entrada. No nosso caso, como temos apenas uma entrada, precisamos de um array com formato N×1, onde N é o tamanho do conjunto de dados.
+
+Depois, precisamos dividir os dados em conjuntos de treino e teste, para que possamos validar nosso modelo após o treinamento:
+
+```python
+X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
+```
+
+Finalmente, treinar o modelo de Regressão Linear real leva apenas duas linhas de código. Definimos o objeto `LinearRegression` e ajustamos aos nossos dados usando o método `fit`:
+
+```python
+lin_reg = LinearRegression()
+lin_reg.fit(X_train,y_train)
+```
+
+O objeto `LinearRegression` após o ajuste (`fit`) contém todos os coeficientes da regressão, que podem ser acessados usando a propriedade `.coef_`. No nosso caso, há apenas um coeficiente, que deve ser em torno de `-0.017`. Isso significa que os preços parecem cair um pouco com o tempo, mas não muito, cerca de 2 centavos por dia. Também podemos acessar o ponto de interseção da regressão com o eixo Y usando `lin_reg.intercept_` - será em torno de `21` no nosso caso, indicando o preço no início do ano.
+
+Para ver quão preciso nosso modelo é, podemos prever preços em um conjunto de dados de teste e, em seguida, medir quão próximas nossas previsões estão dos valores esperados. Isso pode ser feito usando a métrica de erro quadrático médio (MSE), que é a média de todas as diferenças ao quadrado entre o valor esperado e o valor previsto.
+
+```python
+pred = lin_reg.predict(X_test)
+
+mse = np.sqrt(mean_squared_error(y_test,pred))
+print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
+```
+Nosso erro parece estar em torno de 2 pontos, o que equivale a ~17%. Não é muito bom. Outro indicador da qualidade do modelo é o **coeficiente de determinação**, que pode ser obtido assim:
+
+```python
+score = lin_reg.score(X_train,y_train)
+print('Model determination: ', score)
+```
+Se o valor for 0, significa que o modelo não leva os dados de entrada em consideração e age como o *pior preditor linear*, que é simplesmente o valor médio do resultado. O valor 1 significa que podemos prever perfeitamente todos os resultados esperados. No nosso caso, o coeficiente está em torno de 0,06, o que é bastante baixo.
+
+Também podemos plotar os dados de teste junto com a linha de regressão para entender melhor como a regressão funciona no nosso caso:
+
+```python
+plt.scatter(X_test,y_test)
+plt.plot(X_test,pred)
+```
+
+
+
+## Regressão Polinomial
+
+Outro tipo de Regressão Linear é a Regressão Polinomial. Embora às vezes haja uma relação linear entre as variáveis - quanto maior o volume da abóbora, maior o preço - às vezes essas relações não podem ser representadas como um plano ou linha reta.
+
+✅ Aqui estão [alguns exemplos](https://online.stat.psu.edu/stat501/lesson/9/9.8) de dados que poderiam usar Regressão Polinomial.
+
+Observe novamente a relação entre Data e Preço. Esse gráfico de dispersão parece que deveria ser analisado necessariamente por uma linha reta? Os preços não podem flutuar? Nesse caso, você pode tentar a regressão polinomial.
+
+✅ Polinômios são expressões matemáticas que podem consistir em uma ou mais variáveis e coeficientes.
+
+A regressão polinomial cria uma linha curva para ajustar melhor os dados não lineares. No nosso caso, se incluirmos uma variável `DayOfYear` ao quadrado nos dados de entrada, devemos ser capazes de ajustar nossos dados com uma curva parabólica, que terá um mínimo em um determinado ponto do ano.
+
+O Scikit-learn inclui uma [API de pipeline](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) útil para combinar diferentes etapas de processamento de dados. Um **pipeline** é uma cadeia de **estimadores**. No nosso caso, criaremos um pipeline que primeiro adiciona recursos polinomiais ao nosso modelo e, em seguida, treina a regressão:
+
+```python
+from sklearn.preprocessing import PolynomialFeatures
+from sklearn.pipeline import make_pipeline
+
+pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
+
+pipeline.fit(X_train,y_train)
+```
+
+Usar `PolynomialFeatures(2)` significa que incluiremos todos os polinômios de segundo grau dos dados de entrada. No nosso caso, isso significará apenas `DayOfYear`2, mas, dado duas variáveis de entrada X e Y, isso adicionará X2, XY e Y2. Também podemos usar polinômios de grau mais alto, se quisermos.
+
+Os pipelines podem ser usados da mesma maneira que o objeto original `LinearRegression`, ou seja, podemos usar `fit` no pipeline e, em seguida, usar `predict` para obter os resultados da previsão. Aqui está o gráfico mostrando os dados de teste e a curva de aproximação:
+
+
+
+Usando Regressão Polinomial, podemos obter um MSE ligeiramente menor e um coeficiente de determinação maior, mas não significativamente. Precisamos levar em conta outras características!
+
+> Você pode ver que os preços mínimos das abóboras são observados em algum momento próximo ao Halloween. Como você explicaria isso?
+
+🎃 Parabéns, você acabou de criar um modelo que pode ajudar a prever o preço de abóboras para torta. Você provavelmente pode repetir o mesmo procedimento para todos os tipos de abóbora, mas isso seria tedioso. Vamos aprender agora como levar em conta a variedade de abóbora no nosso modelo!
+
+## Recursos Categóricos
+
+No mundo ideal, queremos ser capazes de prever preços para diferentes variedades de abóbora usando o mesmo modelo. No entanto, a coluna `Variety` é um pouco diferente de colunas como `Month`, porque contém valores não numéricos. Essas colunas são chamadas de **categóricas**.
+
+[](https://youtu.be/DYGliioIAE0 "ML para iniciantes - Previsões com Recursos Categóricos usando Regressão Linear")
+
+> 🎥 Clique na imagem acima para um breve vídeo sobre o uso de recursos categóricos.
+
+Aqui você pode ver como o preço médio depende da variedade:
+
+
+
+Para levar a variedade em conta, primeiro precisamos convertê-la para forma numérica, ou **codificá-la**. Existem várias maneiras de fazer isso:
+
+* A **codificação numérica simples** criará uma tabela de diferentes variedades e, em seguida, substituirá o nome da variedade por um índice nessa tabela. Essa não é a melhor ideia para regressão linear, porque a regressão linear leva o valor numérico real do índice e o adiciona ao resultado, multiplicando por algum coeficiente. No nosso caso, a relação entre o número do índice e o preço é claramente não linear, mesmo que garantamos que os índices sejam ordenados de alguma forma específica.
+* A **codificação one-hot** substituirá a coluna `Variety` por 4 colunas diferentes, uma para cada variedade. Cada coluna conterá `1` se a linha correspondente for de uma determinada variedade e `0` caso contrário. Isso significa que haverá quatro coeficientes na regressão linear, um para cada variedade de abóbora, responsável pelo "preço inicial" (ou melhor, "preço adicional") para aquela variedade específica.
+
+O código abaixo mostra como podemos codificar uma variedade usando one-hot:
+
+```python
+pd.get_dummies(new_pumpkins['Variety'])
+```
+
+ ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE
+----|-----------|-----------|--------------------------|----------
+70 | 0 | 0 | 0 | 1
+71 | 0 | 0 | 0 | 1
+... | ... | ... | ... | ...
+1738 | 0 | 1 | 0 | 0
+1739 | 0 | 1 | 0 | 0
+1740 | 0 | 1 | 0 | 0
+1741 | 0 | 1 | 0 | 0
+1742 | 0 | 1 | 0 | 0
+
+Para treinar a regressão linear usando a variedade codificada como one-hot como entrada, só precisamos inicializar os dados `X` e `y` corretamente:
+
+```python
+X = pd.get_dummies(new_pumpkins['Variety'])
+y = new_pumpkins['Price']
+```
+
+O restante do código é o mesmo que usamos acima para treinar a Regressão Linear. Se você tentar, verá que o erro médio quadrático é aproximadamente o mesmo, mas obtemos um coeficiente de determinação muito maior (~77%). Para obter previsões ainda mais precisas, podemos levar em conta mais recursos categóricos, bem como recursos numéricos, como `Month` ou `DayOfYear`. Para obter um grande array de recursos, podemos usar `join`:
+
+```python
+X = pd.get_dummies(new_pumpkins['Variety']) \
+ .join(new_pumpkins['Month']) \
+ .join(pd.get_dummies(new_pumpkins['City'])) \
+ .join(pd.get_dummies(new_pumpkins['Package']))
+y = new_pumpkins['Price']
+```
+
+Aqui também levamos em conta `City` e o tipo de `Package`, o que nos dá um MSE de 2.84 (10%) e um coeficiente de determinação de 0.94!
+
+## Juntando tudo
+
+Para criar o melhor modelo, podemos usar dados combinados (categóricos codificados como one-hot + numéricos) do exemplo acima junto com a Regressão Polinomial. Aqui está o código completo para sua conveniência:
+
+```python
+# set up training data
+X = pd.get_dummies(new_pumpkins['Variety']) \
+ .join(new_pumpkins['Month']) \
+ .join(pd.get_dummies(new_pumpkins['City'])) \
+ .join(pd.get_dummies(new_pumpkins['Package']))
+y = new_pumpkins['Price']
+
+# make train-test split
+X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
+
+# setup and train the pipeline
+pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
+pipeline.fit(X_train,y_train)
+
+# predict results for test data
+pred = pipeline.predict(X_test)
+
+# calculate MSE and determination
+mse = np.sqrt(mean_squared_error(y_test,pred))
+print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
+
+score = pipeline.score(X_train,y_train)
+print('Model determination: ', score)
+```
+
+Isso deve nos dar o melhor coeficiente de determinação de quase 97% e MSE=2.23 (~8% de erro de previsão).
+
+| Modelo | MSE | Determinação |
+|--------|-----|--------------|
+| `DayOfYear` Linear | 2.77 (17.2%) | 0.07 |
+| `DayOfYear` Polinomial | 2.73 (17.0%) | 0.08 |
+| `Variety` Linear | 5.24 (19.7%) | 0.77 |
+| Todos os recursos Linear | 2.84 (10.5%) | 0.94 |
+| Todos os recursos Polinomial | 2.23 (8.25%) | 0.97 |
+
+🏆 Muito bem! Você criou quatro modelos de Regressão em uma única lição e melhorou a qualidade do modelo para 97%. Na seção final sobre Regressão, você aprenderá sobre Regressão Logística para determinar categorias.
+
+---
+## 🚀Desafio
+
+Teste várias variáveis diferentes neste notebook para ver como a correlação corresponde à precisão do modelo.
+
+## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)
+
+## Revisão e Autoestudo
+
+Nesta lição, aprendemos sobre Regressão Linear. Existem outros tipos importantes de Regressão. Leia sobre as técnicas Stepwise, Ridge, Lasso e Elasticnet. Um bom curso para aprender mais é o [curso de Aprendizado Estatístico de Stanford](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).
+
+## Tarefa
+
+[Construa um Modelo](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/3-Linear/assignment.md b/translations/br/2-Regression/3-Linear/assignment.md
new file mode 100644
index 000000000..280ab1ad4
--- /dev/null
+++ b/translations/br/2-Regression/3-Linear/assignment.md
@@ -0,0 +1,25 @@
+
+# Criar um Modelo de Regressão
+
+## Instruções
+
+Nesta lição, você aprendeu como construir um modelo usando Regressão Linear e Polinomial. Usando esse conhecimento, encontre um conjunto de dados ou utilize um dos conjuntos integrados do Scikit-learn para criar um novo modelo. Explique em seu notebook por que escolheu a técnica utilizada e demonstre a precisão do seu modelo. Se ele não for preciso, explique o motivo.
+
+## Rubrica
+
+| Critério | Exemplary | Adequate | Needs Improvement |
+| -------- | ------------------------------------------------------------ | -------------------------- | ------------------------------- |
+| | apresenta um notebook completo com uma solução bem documentada | a solução está incompleta | a solução apresenta falhas ou bugs |
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/3-Linear/notebook.ipynb b/translations/br/2-Regression/3-Linear/notebook.ipynb
new file mode 100644
index 000000000..08c033497
--- /dev/null
+++ b/translations/br/2-Regression/3-Linear/notebook.ipynb
@@ -0,0 +1,128 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Preços de Abóboras\n",
+ "\n",
+ "Carregue as bibliotecas necessárias e o conjunto de dados. Converta os dados em um dataframe contendo um subconjunto dos dados:\n",
+ "\n",
+ "- Considere apenas abóboras com preços por alqueire\n",
+ "- Converta a data para o formato de mês\n",
+ "- Calcule o preço como a média entre os preços mais altos e mais baixos\n",
+ "- Converta o preço para refletir a precificação pela quantidade em alqueires\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from datetime import datetime\n",
+ "\n",
+ "pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
+ "\n",
+ "pumpkins.head()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
+ "\n",
+ "columns_to_select = ['Package', 'Variety', 'City Name', 'Low Price', 'High Price', 'Date']\n",
+ "pumpkins = pumpkins.loc[:, columns_to_select]\n",
+ "\n",
+ "price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2\n",
+ "\n",
+ "month = pd.DatetimeIndex(pumpkins['Date']).month\n",
+ "day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)\n",
+ "\n",
+ "new_pumpkins = pd.DataFrame(\n",
+ " {'Month': month, \n",
+ " 'DayOfYear' : day_of_year, \n",
+ " 'Variety': pumpkins['Variety'], \n",
+ " 'City': pumpkins['City Name'], \n",
+ " 'Package': pumpkins['Package'], \n",
+ " 'Low Price': pumpkins['Low Price'],\n",
+ " 'High Price': pumpkins['High Price'], \n",
+ " 'Price': price})\n",
+ "\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/1.1\n",
+ "new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price*2\n",
+ "\n",
+ "new_pumpkins.head()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Um gráfico de dispersão básico nos lembra que temos dados mensais apenas de agosto a dezembro. Provavelmente precisamos de mais dados para poder tirar conclusões de forma linear.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "plt.scatter('Month','Price',data=new_pumpkins)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n",
+ "plt.scatter('DayOfYear','Price',data=new_pumpkins)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.3-final"
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "b032d371c75279373507f003439a577e",
+ "translation_date": "2025-08-29T22:45:29+00:00",
+ "source_file": "2-Regression/3-Linear/notebook.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/3-Linear/solution/Julia/README.md b/translations/br/2-Regression/3-Linear/solution/Julia/README.md
new file mode 100644
index 000000000..b5983557a
--- /dev/null
+++ b/translations/br/2-Regression/3-Linear/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/3-Linear/solution/R/lesson_3-R.ipynb b/translations/br/2-Regression/3-Linear/solution/R/lesson_3-R.ipynb
new file mode 100644
index 000000000..0d8ee31c2
--- /dev/null
+++ b/translations/br/2-Regression/3-Linear/solution/R/lesson_3-R.ipynb
@@ -0,0 +1,1084 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "metadata": {
+ "colab": {
+ "name": "lesson_3-R.ipynb",
+ "provenance": [],
+ "collapsed_sections": [],
+ "toc_visible": true
+ },
+ "kernelspec": {
+ "name": "ir",
+ "display_name": "R"
+ },
+ "language_info": {
+ "name": "R"
+ },
+ "coopTranslator": {
+ "original_hash": "5015d65d61ba75a223bfc56c273aa174",
+ "translation_date": "2025-08-29T22:55:39+00:00",
+ "source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
+ "language_code": "br"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "EgQw8osnsUV-"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## Regressão Linear e Polinomial para Precificação de Abóboras - Aula 3\n",
+ "
\n",
+ " \n",
+ " Infográfico por Dasani Madipalli\n",
+ "\n",
+ "\n",
+ "#### Introdução\n",
+ "\n",
+ "Até agora, você explorou o que é regressão com dados de exemplo coletados do conjunto de dados de precificação de abóboras que usaremos ao longo desta aula. Você também os visualizou usando `ggplot2`. 💪\n",
+ "\n",
+ "Agora você está pronto para se aprofundar na regressão para aprendizado de máquina. Nesta aula, você aprenderá mais sobre dois tipos de regressão: *regressão linear básica* e *regressão polinomial*, junto com parte da matemática por trás dessas técnicas.\n",
+ "\n",
+ "> Ao longo deste currículo, assumimos conhecimento mínimo de matemática e buscamos torná-la acessível para estudantes de outras áreas. Fique atento a notas, 🧮 destaques, diagramas e outras ferramentas de aprendizado para ajudar na compreensão.\n",
+ "\n",
+ "#### Preparação\n",
+ "\n",
+ "Como lembrete, você está carregando esses dados para fazer perguntas sobre eles.\n",
+ "\n",
+ "- Qual é o melhor momento para comprar abóboras?\n",
+ "\n",
+ "- Qual preço posso esperar por uma caixa de abóboras em miniatura?\n",
+ "\n",
+ "- Devo comprá-las em cestas de meio alqueire ou em caixas de 1 1/9 alqueire? Vamos continuar explorando esses dados.\n",
+ "\n",
+ "Na aula anterior, você criou um `tibble` (uma reinterpretação moderna do data frame) e o preencheu com parte do conjunto de dados original, padronizando os preços por alqueire. Ao fazer isso, no entanto, você conseguiu reunir apenas cerca de 400 pontos de dados e apenas para os meses de outono. Talvez possamos obter um pouco mais de detalhes sobre a natureza dos dados ao limpá-los mais? Vamos descobrir... 🕵️♀️\n",
+ "\n",
+ "Para esta tarefa, precisaremos dos seguintes pacotes:\n",
+ "\n",
+ "- `tidyverse`: O [tidyverse](https://www.tidyverse.org/) é uma [coleção de pacotes R](https://www.tidyverse.org/packages) projetada para tornar a ciência de dados mais rápida, fácil e divertida!\n",
+ "\n",
+ "- `tidymodels`: O [tidymodels](https://www.tidymodels.org/) é uma [estrutura de pacotes](https://www.tidymodels.org/packages/) para modelagem e aprendizado de máquina.\n",
+ "\n",
+ "- `janitor`: O [pacote janitor](https://github.com/sfirke/janitor) fornece ferramentas simples para examinar e limpar dados sujos.\n",
+ "\n",
+ "- `corrplot`: O [pacote corrplot](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) oferece uma ferramenta visual exploratória para matrizes de correlação que suporta o reordenamento automático de variáveis para ajudar a detectar padrões ocultos entre elas.\n",
+ "\n",
+ "Você pode instalá-los com:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n",
+ "\n",
+ "O script abaixo verifica se você possui os pacotes necessários para completar este módulo e os instala para você caso estejam ausentes.\n"
+ ],
+ "metadata": {
+ "id": "WqQPS1OAsg3H"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "suppressWarnings(if (!require(\"pacman\")) install.packages(\"pacman\"))\n",
+ "\n",
+ "pacman::p_load(tidyverse, tidymodels, janitor, corrplot)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "tA4C2WN3skCf",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "c06cd805-5534-4edc-f72b-d0d1dab96ac0"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Vamos carregar esses pacotes incríveis e torná-los disponíveis na nossa sessão atual do R. (Isso é apenas para ilustração, `pacman::p_load()` já fez isso por você)\n",
+ "\n",
+ "## 1. Uma linha de regressão linear\n",
+ "\n",
+ "Como você aprendeu na Aula 1, o objetivo de um exercício de regressão linear é ser capaz de traçar uma *linha* *de* *melhor ajuste* para:\n",
+ "\n",
+ "- **Mostrar relações entre variáveis**. Demonstrar a relação entre as variáveis.\n",
+ "\n",
+ "- **Fazer previsões**. Fazer previsões precisas sobre onde um novo ponto de dados se encaixaria em relação a essa linha.\n",
+ "\n",
+ "Para traçar esse tipo de linha, usamos uma técnica estatística chamada **Regressão dos Mínimos Quadrados**. O termo `mínimos quadrados` significa que todos os pontos de dados ao redor da linha de regressão são elevados ao quadrado e, em seguida, somados. Idealmente, essa soma final deve ser o menor valor possível, porque queremos um número baixo de erros, ou `mínimos quadrados`. Assim, a linha de melhor ajuste é aquela que nos dá o menor valor para a soma dos erros ao quadrado - daí o nome *regressão dos mínimos quadrados*.\n",
+ "\n",
+ "Fazemos isso porque queremos modelar uma linha que tenha a menor distância acumulada de todos os nossos pontos de dados. Também elevamos os termos ao quadrado antes de somá-los, pois estamos preocupados com a magnitude, e não com a direção.\n",
+ "\n",
+ "> **🧮 Mostre-me a matemática**\n",
+ ">\n",
+ "> Essa linha, chamada de *linha de melhor ajuste*, pode ser expressa por [uma equação](https://en.wikipedia.org/wiki/Simple_linear_regression):\n",
+ ">\n",
+ "> Y = a + bX\n",
+ ">\n",
+ "> `X` é a '`variável explicativa` ou `preditor`'. `Y` é a '`variável dependente` ou `resultado`'. A inclinação da linha é `b` e `a` é o intercepto no eixo y, que se refere ao valor de `Y` quando `X = 0`.\n",
+ ">\n",
+ "\n",
+ "> \n",
+ " Infográfico por Jen Looper\n",
+ ">\n",
+ "> Primeiro, calcule a inclinação `b`.\n",
+ ">\n",
+ "> Em outras palavras, e referindo-se à pergunta original dos dados das abóboras: \"prever o preço de uma abóbora por alqueire por mês\", `X` se referiria ao preço e `Y` ao mês de venda.\n",
+ ">\n",
+ "> \n",
+ " Infográfico por Jen Looper\n",
+ "> \n",
+ "> Calcule o valor de Y. Se você está pagando cerca de \\$4, deve ser abril!\n",
+ ">\n",
+ "> A matemática que calcula a linha deve demonstrar a inclinação da linha, que também depende do intercepto, ou onde `Y` está situado quando `X = 0`.\n",
+ ">\n",
+ "> Você pode observar o método de cálculo desses valores no site [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Também visite [este calculador de mínimos quadrados](https://www.mathsisfun.com/data/least-squares-calculator.html) para ver como os valores dos números impactam a linha.\n",
+ "\n",
+ "Não é tão assustador, certo? 🤓\n",
+ "\n",
+ "#### Correlação\n",
+ "\n",
+ "Outro termo importante para entender é o **Coeficiente de Correlação** entre as variáveis X e Y fornecidas. Usando um gráfico de dispersão, você pode visualizar rapidamente esse coeficiente. Um gráfico com pontos de dados alinhados de forma ordenada tem alta correlação, mas um gráfico com pontos de dados espalhados por toda parte entre X e Y tem baixa correlação.\n",
+ "\n",
+ "Um bom modelo de regressão linear será aquele que possui um Coeficiente de Correlação alto (mais próximo de 1 do que de 0) usando o método de Regressão dos Mínimos Quadrados com uma linha de regressão.\n"
+ ],
+ "metadata": {
+ "id": "cdX5FRpvsoP5"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## **2. Uma dança com dados: criando um data frame que será usado para modelagem**\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Arte por @allison_horst\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "WdUKXk7Bs8-V"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Carregue as bibliotecas necessárias e o conjunto de dados. Converta os dados em um data frame contendo um subconjunto dos dados:\n",
+ "\n",
+ "- Considere apenas abóboras com preço por alqueire\n",
+ "\n",
+ "- Converta a data para o formato de mês\n",
+ "\n",
+ "- Calcule o preço como a média entre os preços mais altos e mais baixos\n",
+ "\n",
+ "- Converta o preço para refletir a precificação pela quantidade em alqueires\n",
+ "\n",
+ "> Cobrimos essas etapas na [lição anterior](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/2-Data/solution/lesson_2-R.ipynb).\n"
+ ],
+ "metadata": {
+ "id": "fMCtu2G2s-p8"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load the core Tidyverse packages\n",
+ "library(tidyverse)\n",
+ "library(lubridate)\n",
+ "\n",
+ "# Import the pumpkins data\n",
+ "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
+ "\n",
+ "\n",
+ "# Get a glimpse and dimensions of the data\n",
+ "glimpse(pumpkins)\n",
+ "\n",
+ "\n",
+ "# Print the first 50 rows of the data set\n",
+ "pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "ryMVZEEPtERn"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "No espírito de pura aventura, vamos explorar o [`pacote janitor`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor) que fornece funções simples para examinar e limpar dados desorganizados. Por exemplo, vamos dar uma olhada nos nomes das colunas dos nossos dados:\n"
+ ],
+ "metadata": {
+ "id": "xcNxM70EtJjb"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Return column names\n",
+ "pumpkins %>% \n",
+ " names()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "5XtpaIigtPfW"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "🤔 Podemos fazer melhor. Vamos tornar esses nomes de colunas `friendR` convertendo-os para a convenção [snake_case](https://en.wikipedia.org/wiki/Snake_case) usando `janitor::clean_names`. Para saber mais sobre essa função: `?clean_names`\n"
+ ],
+ "metadata": {
+ "id": "IbIqrMINtSHe"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Clean names to the snake_case convention\n",
+ "pumpkins <- pumpkins %>% \n",
+ " clean_names(case = \"snake\")\n",
+ "\n",
+ "# Return column names\n",
+ "pumpkins %>% \n",
+ " names()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "a2uYvclYtWvX"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Muito tidyR 🧹! Agora, uma dança com os dados usando `dplyr`, como na lição anterior! 💃\n"
+ ],
+ "metadata": {
+ "id": "HfhnuzDDtaDd"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Select desired columns\n",
+ "pumpkins <- pumpkins %>% \n",
+ " select(variety, city_name, package, low_price, high_price, date)\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Extract the month from the dates to a new column\n",
+ "pumpkins <- pumpkins %>%\n",
+ " mutate(date = mdy(date),\n",
+ " month = month(date)) %>% \n",
+ " select(-date)\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Create a new column for average Price\n",
+ "pumpkins <- pumpkins %>% \n",
+ " mutate(price = (low_price + high_price)/2)\n",
+ "\n",
+ "\n",
+ "# Retain only pumpkins with the string \"bushel\"\n",
+ "new_pumpkins <- pumpkins %>% \n",
+ " filter(str_detect(string = package, pattern = \"bushel\"))\n",
+ "\n",
+ "\n",
+ "# Normalize the pricing so that you show the pricing per bushel, not per 1 1/9 or 1/2 bushel\n",
+ "new_pumpkins <- new_pumpkins %>% \n",
+ " mutate(price = case_when(\n",
+ " str_detect(package, \"1 1/9\") ~ price/(1.1),\n",
+ " str_detect(package, \"1/2\") ~ price*2,\n",
+ " TRUE ~ price))\n",
+ "\n",
+ "# Relocate column positions\n",
+ "new_pumpkins <- new_pumpkins %>% \n",
+ " relocate(month, .before = variety)\n",
+ "\n",
+ "\n",
+ "# Display the first 5 rows\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "X0wU3gQvtd9f"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Bom trabalho!👌 Agora você tem um conjunto de dados limpo e organizado para construir seu novo modelo de regressão!\n",
+ "\n",
+ "Que tal um gráfico de dispersão?\n"
+ ],
+ "metadata": {
+ "id": "UpaIwaxqth82"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Set theme\n",
+ "theme_set(theme_light())\n",
+ "\n",
+ "# Make a scatter plot of month and price\n",
+ "new_pumpkins %>% \n",
+ " ggplot(mapping = aes(x = month, y = price)) +\n",
+ " geom_point(size = 1.6)\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "DXgU-j37tl5K"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Um gráfico de dispersão nos lembra que só temos dados mensais de agosto a dezembro. Provavelmente precisamos de mais dados para conseguir tirar conclusões de forma linear.\n",
+ "\n",
+ "Vamos dar uma olhada novamente nos nossos dados de modelagem:\n"
+ ],
+ "metadata": {
+ "id": "Ve64wVbwtobI"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Display first 5 rows\n",
+ "new_pumpkins %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "HFQX2ng1tuSJ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "E se quiséssemos prever o `price` de uma abóbora com base nas colunas `city` ou `package`, que são do tipo caractere? Ou, de forma ainda mais simples, como poderíamos encontrar a correlação (que exige que ambos os seus inputs sejam numéricos) entre, por exemplo, `package` e `price`? 🤷🤷\n",
+ "\n",
+ "Modelos de aprendizado de máquina funcionam melhor com características numéricas em vez de valores de texto, então geralmente é necessário converter características categóricas em representações numéricas.\n",
+ "\n",
+ "Isso significa que precisamos encontrar uma maneira de reformular nossos preditores para torná-los mais fáceis de usar por um modelo de forma eficaz, um processo conhecido como `feature engineering`.\n"
+ ],
+ "metadata": {
+ "id": "7hsHoxsStyjJ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 3. Pré-processamento de dados para modelagem com recipes 👩🍳👨🍳\n",
+ "\n",
+ "Atividades que reformulam os valores dos preditores para torná-los mais fáceis de serem usados de forma eficaz por um modelo são chamadas de `engenharia de atributos`.\n",
+ "\n",
+ "Modelos diferentes têm requisitos de pré-processamento diferentes. Por exemplo, mínimos quadrados requerem `codificação de variáveis categóricas`, como mês, variedade e city_name. Isso simplesmente envolve `traduzir` uma coluna com `valores categóricos` em uma ou mais `colunas numéricas` que substituem a original.\n",
+ "\n",
+ "Por exemplo, suponha que seus dados incluam a seguinte característica categórica:\n",
+ "\n",
+ "| cidade |\n",
+ "|:---------:|\n",
+ "| Denver |\n",
+ "| Nairobi |\n",
+ "| Tóquio |\n",
+ "\n",
+ "Você pode aplicar *codificação ordinal* para substituir cada categoria por um valor inteiro único, assim:\n",
+ "\n",
+ "| cidade |\n",
+ "|:------:|\n",
+ "| 0 |\n",
+ "| 1 |\n",
+ "| 2 |\n",
+ "\n",
+ "E é isso que faremos com nossos dados!\n",
+ "\n",
+ "Nesta seção, exploraremos outro pacote incrível do Tidymodels: [recipes](https://tidymodels.github.io/recipes/) - que foi projetado para ajudar você a pré-processar seus dados **antes** de treinar seu modelo. No seu núcleo, uma receita é um objeto que define quais etapas devem ser aplicadas a um conjunto de dados para prepará-lo para a modelagem.\n",
+ "\n",
+ "Agora, vamos criar uma receita que prepara nossos dados para modelagem, substituindo um número inteiro único para todas as observações nas colunas de preditores:\n"
+ ],
+ "metadata": {
+ "id": "AD5kQbcvt3Xl"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Specify a recipe\n",
+ "pumpkins_recipe <- recipe(price ~ ., data = new_pumpkins) %>% \n",
+ " step_integer(all_predictors(), zero_based = TRUE)\n",
+ "\n",
+ "\n",
+ "# Print out the recipe\n",
+ "pumpkins_recipe"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "BNaFKXfRt9TU"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Incrível! 👏 Acabamos de criar nossa primeira receita que especifica um resultado (preço) e seus respectivos preditores, e que todas as colunas de preditores devem ser codificadas em um conjunto de números inteiros 🙌! Vamos analisar isso rapidamente:\n",
+ "\n",
+ "- A chamada para `recipe()` com uma fórmula informa à receita os *papéis* das variáveis usando os dados de `new_pumpkins` como referência. Por exemplo, a coluna `price` foi atribuída ao papel de `outcome`, enquanto o restante das colunas foi atribuído ao papel de `predictor`.\n",
+ "\n",
+ "- `step_integer(all_predictors(), zero_based = TRUE)` especifica que todos os preditores devem ser convertidos em um conjunto de números inteiros, começando a numeração em 0.\n",
+ "\n",
+ "Temos certeza de que você pode estar pensando algo como: \"Isso é tão legal!! Mas e se eu precisar confirmar que as receitas estão fazendo exatamente o que eu espero? 🤔\"\n",
+ "\n",
+ "Esse é um pensamento incrível! Veja bem, uma vez que sua receita está definida, você pode estimar os parâmetros necessários para realmente pré-processar os dados e, em seguida, extrair os dados processados. Normalmente, você não precisa fazer isso ao usar Tidymodels (veremos a convenção normal em apenas um minuto-\\> `workflows`), mas pode ser útil quando você quiser fazer algum tipo de verificação para confirmar que as receitas estão funcionando como esperado.\n",
+ "\n",
+ "Para isso, você precisará de dois outros verbos: `prep()` e `bake()`, e como sempre, nossos pequenos amigos do R criados por [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) ajudam você a entender isso melhor!\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Arte por @allison_horst\n"
+ ],
+ "metadata": {
+ "id": "KEiO0v7kuC9O"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "[`prep()`](https://recipes.tidymodels.org/reference/prep.html): estima os parâmetros necessários a partir de um conjunto de treinamento que podem ser posteriormente aplicados a outros conjuntos de dados. Por exemplo, para uma determinada coluna preditora, qual observação será atribuída ao inteiro 0, 1, 2, etc.\n",
+ "\n",
+ "[`bake()`](https://recipes.tidymodels.org/reference/bake.html): utiliza uma receita preparada e aplica as operações a qualquer conjunto de dados.\n",
+ "\n",
+ "Dito isso, vamos preparar e aplicar nossas receitas para realmente confirmar que, nos bastidores, as colunas preditoras serão primeiro codificadas antes que um modelo seja ajustado.\n"
+ ],
+ "metadata": {
+ "id": "Q1xtzebuuTCP"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Prep the recipe\n",
+ "pumpkins_prep <- prep(pumpkins_recipe)\n",
+ "\n",
+ "# Bake the recipe to extract a preprocessed new_pumpkins data\n",
+ "baked_pumpkins <- bake(pumpkins_prep, new_data = NULL)\n",
+ "\n",
+ "# Print out the baked data set\n",
+ "baked_pumpkins %>% \n",
+ " slice_head(n = 10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "FGBbJbP_uUUn"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Uhuu! 🥳 Os dados processados `baked_pumpkins` têm todos os seus preditores codificados, confirmando que, de fato, as etapas de pré-processamento definidas como nossa receita funcionarão conforme o esperado. Isso pode dificultar a leitura para você, mas torna muito mais compreensível para o Tidymodels! Reserve um tempo para descobrir qual observação foi mapeada para um número inteiro correspondente.\n",
+ "\n",
+ "Também vale mencionar que `baked_pumpkins` é um data frame no qual podemos realizar cálculos.\n",
+ "\n",
+ "Por exemplo, vamos tentar encontrar uma boa correlação entre dois pontos dos seus dados para, potencialmente, construir um bom modelo preditivo. Usaremos a função `cor()` para isso. Digite `?cor()` para saber mais sobre a função.\n"
+ ],
+ "metadata": {
+ "id": "1dvP0LBUueAW"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Find the correlation between the city_name and the price\n",
+ "cor(baked_pumpkins$city_name, baked_pumpkins$price)\n",
+ "\n",
+ "# Find the correlation between the package and the price\n",
+ "cor(baked_pumpkins$package, baked_pumpkins$price)\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "3bQzXCjFuiSV"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Como se verifica, há apenas uma correlação fraca entre a Cidade e o Preço. No entanto, há uma correlação um pouco melhor entre o Pacote e seu Preço. Faz sentido, certo? Normalmente, quanto maior a caixa do produto, maior o preço.\n",
+ "\n",
+ "Já que estamos nisso, vamos também tentar visualizar uma matriz de correlação de todas as colunas usando o pacote `corrplot`.\n"
+ ],
+ "metadata": {
+ "id": "BToPWbgjuoZw"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load the corrplot package\n",
+ "library(corrplot)\n",
+ "\n",
+ "# Obtain correlation matrix\n",
+ "corr_mat <- cor(baked_pumpkins %>% \n",
+ " # Drop columns that are not really informative\n",
+ " select(-c(low_price, high_price)))\n",
+ "\n",
+ "# Make a correlation plot between the variables\n",
+ "corrplot(corr_mat, method = \"shade\", shade.col = NA, tl.col = \"black\", tl.srt = 45, addCoef.col = \"black\", cl.pos = \"n\", order = \"original\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "ZwAL3ksmutVR"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "🤩🤩 Muito melhor.\n",
+ "\n",
+ "Uma boa pergunta a se fazer agora com esses dados seria: '`Qual preço posso esperar de um determinado pacote de abóboras?`' Vamos direto ao ponto!\n",
+ "\n",
+ "> Nota: Quando você **`bake()`** a receita preparada **`pumpkins_prep`** com **`new_data = NULL`**, você extrai os dados de treinamento processados (ou seja, codificados). Se você tivesse outro conjunto de dados, por exemplo, um conjunto de teste, e quisesse ver como a receita o pré-processaria, bastaria assar **`pumpkins_prep`** com **`new_data = test_set`**\n",
+ "\n",
+ "## 4. Construir um modelo de regressão linear\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Infográfico por Dasani Madipalli\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "YqXjLuWavNxW"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Agora que criamos uma receita e confirmamos que os dados serão pré-processados adequadamente, vamos construir um modelo de regressão para responder à pergunta: `Qual preço posso esperar de um determinado pacote de abóbora?`\n",
+ "\n",
+ "#### Treinar um modelo de regressão linear usando o conjunto de treinamento\n",
+ "\n",
+ "Como você já deve ter percebido, a coluna *price* é a variável `resultado`, enquanto a coluna *package* é a variável `preditor`.\n",
+ "\n",
+ "Para isso, primeiro dividiremos os dados de forma que 80% sejam destinados ao treinamento e 20% ao conjunto de teste. Em seguida, definiremos uma receita que codificará a coluna preditora em um conjunto de números inteiros e, depois, construiremos uma especificação de modelo. Não vamos preparar e aplicar nossa receita, já que sabemos que ela pré-processará os dados conforme esperado.\n"
+ ],
+ "metadata": {
+ "id": "Pq0bSzCevW-h"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "set.seed(2056)\n",
+ "# Split the data into training and test sets\n",
+ "pumpkins_split <- new_pumpkins %>% \n",
+ " initial_split(prop = 0.8)\n",
+ "\n",
+ "\n",
+ "# Extract training and test data\n",
+ "pumpkins_train <- training(pumpkins_split)\n",
+ "pumpkins_test <- testing(pumpkins_split)\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Create a recipe for preprocessing the data\n",
+ "lm_pumpkins_recipe <- recipe(price ~ package, data = pumpkins_train) %>% \n",
+ " step_integer(all_predictors(), zero_based = TRUE)\n",
+ "\n",
+ "\n",
+ "\n",
+ "# Create a linear model specification\n",
+ "lm_spec <- linear_reg() %>% \n",
+ " set_engine(\"lm\") %>% \n",
+ " set_mode(\"regression\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "CyoEh_wuvcLv"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Bom trabalho! Agora que temos uma receita e uma especificação de modelo, precisamos encontrar uma maneira de agrupá-las em um objeto que, primeiro, faça o pré-processamento dos dados (prep+bake nos bastidores), ajuste o modelo nos dados pré-processados e também permita possíveis atividades de pós-processamento. Que tal isso para sua tranquilidade! 🤩\n",
+ "\n",
+ "No Tidymodels, esse objeto prático é chamado de [`workflow`](https://workflows.tidymodels.org/) e organiza convenientemente seus componentes de modelagem! É o que chamaríamos de *pipelines* em *Python*.\n",
+ "\n",
+ "Então, vamos agrupar tudo em um workflow! 📦\n"
+ ],
+ "metadata": {
+ "id": "G3zF_3DqviFJ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Hold modelling components in a workflow\n",
+ "lm_wf <- workflow() %>% \n",
+ " add_recipe(lm_pumpkins_recipe) %>% \n",
+ " add_model(lm_spec)\n",
+ "\n",
+ "# Print out the workflow\n",
+ "lm_wf"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "T3olroU3v-WX"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "👌 Além disso, um fluxo de trabalho pode ser ajustado/treinado de maneira muito semelhante a um modelo.\n"
+ ],
+ "metadata": {
+ "id": "zd1A5tgOwEPX"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Train the model\n",
+ "lm_wf_fit <- lm_wf %>% \n",
+ " fit(data = pumpkins_train)\n",
+ "\n",
+ "# Print the model coefficients learned \n",
+ "lm_wf_fit"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "NhJagFumwFHf"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "A partir da saída do modelo, podemos observar os coeficientes aprendidos durante o treinamento. Eles representam os coeficientes da linha de melhor ajuste que nos dá o menor erro geral entre a variável real e a prevista.\n",
+ "\n",
+ "#### Avaliar o desempenho do modelo usando o conjunto de teste\n",
+ "\n",
+ "É hora de ver como o modelo se saiu 📏! Como fazemos isso?\n",
+ "\n",
+ "Agora que treinamos o modelo, podemos usá-lo para fazer previsões para o `test_set` usando `parsnip::predict()`. Em seguida, podemos comparar essas previsões com os valores reais dos rótulos para avaliar o quão bem (ou não!) o modelo está funcionando.\n",
+ "\n",
+ "Vamos começar fazendo previsões para o conjunto de teste e, em seguida, vinculando as colunas ao conjunto de teste.\n"
+ ],
+ "metadata": {
+ "id": "_4QkGtBTwItF"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make predictions for the test set\n",
+ "predictions <- lm_wf_fit %>% \n",
+ " predict(new_data = pumpkins_test)\n",
+ "\n",
+ "\n",
+ "# Bind predictions to the test set\n",
+ "lm_results <- pumpkins_test %>% \n",
+ " select(c(package, price)) %>% \n",
+ " bind_cols(predictions)\n",
+ "\n",
+ "\n",
+ "# Print the first ten rows of the tibble\n",
+ "lm_results %>% \n",
+ " slice_head(n = 10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "UFZzTG0gwTs9"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Sim, você acabou de treinar um modelo e usá-lo para fazer previsões! 🔮 Será que ele é bom? Vamos avaliar o desempenho do modelo!\n",
+ "\n",
+ "No Tidymodels, fazemos isso usando `yardstick::metrics()`! Para regressão linear, vamos focar nas seguintes métricas:\n",
+ "\n",
+ "- `Root Mean Square Error (RMSE)`: A raiz quadrada do [MSE](https://en.wikipedia.org/wiki/Mean_squared_error). Isso resulta em uma métrica absoluta na mesma unidade do rótulo (neste caso, o preço de uma abóbora). Quanto menor o valor, melhor o modelo (de forma simplificada, representa o preço médio pelo qual as previsões estão erradas!).\n",
+ "\n",
+ "- `Coefficient of Determination (geralmente conhecido como R-quadrado ou R2)`: Uma métrica relativa em que, quanto maior o valor, melhor o ajuste do modelo. Essencialmente, essa métrica representa o quanto da variância entre os valores previstos e reais o modelo é capaz de explicar.\n"
+ ],
+ "metadata": {
+ "id": "0A5MjzM7wW9M"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Evaluate performance of linear regression\n",
+ "metrics(data = lm_results,\n",
+ " truth = price,\n",
+ " estimate = .pred)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "reJ0UIhQwcEH"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Lá se vai o desempenho do modelo. Vamos ver se conseguimos uma indicação melhor visualizando um gráfico de dispersão do pacote e do preço, e então usar as previsões feitas para sobrepor uma linha de melhor ajuste.\n",
+ "\n",
+ "Isso significa que teremos que preparar e processar o conjunto de teste para codificar a coluna de pacote e, em seguida, vinculá-la às previsões feitas pelo nosso modelo.\n"
+ ],
+ "metadata": {
+ "id": "fdgjzjkBwfWt"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Encode package column\n",
+ "package_encode <- lm_pumpkins_recipe %>% \n",
+ " prep() %>% \n",
+ " bake(new_data = pumpkins_test) %>% \n",
+ " select(package)\n",
+ "\n",
+ "\n",
+ "# Bind encoded package column to the results\n",
+ "lm_results <- lm_results %>% \n",
+ " bind_cols(package_encode %>% \n",
+ " rename(package_integer = package)) %>% \n",
+ " relocate(package_integer, .after = package)\n",
+ "\n",
+ "\n",
+ "# Print new results data frame\n",
+ "lm_results %>% \n",
+ " slice_head(n = 5)\n",
+ "\n",
+ "\n",
+ "# Make a scatter plot\n",
+ "lm_results %>% \n",
+ " ggplot(mapping = aes(x = package_integer, y = price)) +\n",
+ " geom_point(size = 1.6) +\n",
+ " # Overlay a line of best fit\n",
+ " geom_line(aes(y = .pred), color = \"orange\", size = 1.2) +\n",
+ " xlab(\"package\")\n",
+ " \n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "R0nw719lwkHE"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Ótimo! Como você pode ver, o modelo de regressão linear não generaliza muito bem a relação entre um pacote e seu preço correspondente.\n",
+ "\n",
+ "🎃 Parabéns, você acabou de criar um modelo que pode ajudar a prever o preço de algumas variedades de abóboras. Sua plantação de abóboras para o feriado ficará linda. Mas provavelmente você pode criar um modelo melhor!\n",
+ "\n",
+ "## 5. Construir um modelo de regressão polinomial\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Infográfico por Dasani Madipalli\n",
+ "\n",
+ "\n",
+ "\n"
+ ],
+ "metadata": {
+ "id": "HOCqJXLTwtWI"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Às vezes, nossos dados podem não ter uma relação linear, mas ainda assim queremos prever um resultado. A regressão polinomial pode nos ajudar a fazer previsões para relações não lineares mais complexas.\n",
+ "\n",
+ "Por exemplo, considere a relação entre o pacote e o preço no nosso conjunto de dados de abóboras. Embora às vezes haja uma relação linear entre as variáveis - quanto maior o volume da abóbora, maior o preço - em outras ocasiões essas relações não podem ser representadas como um plano ou uma linha reta.\n",
+ "\n",
+ "> ✅ Aqui estão [alguns exemplos adicionais](https://online.stat.psu.edu/stat501/lesson/9/9.8) de dados que poderiam usar regressão polinomial\n",
+ ">\n",
+ "> Dê outra olhada na relação entre Variedade e Preço no gráfico anterior. Esse gráfico de dispersão parece que necessariamente deveria ser analisado por uma linha reta? Talvez não. Nesse caso, você pode tentar a regressão polinomial.\n",
+ ">\n",
+ "> ✅ Polinômios são expressões matemáticas que podem consistir em uma ou mais variáveis e coeficientes\n",
+ "\n",
+ "#### Treine um modelo de regressão polinomial usando o conjunto de treinamento\n",
+ "\n",
+ "A regressão polinomial cria uma *linha curva* para ajustar melhor os dados não lineares.\n",
+ "\n",
+ "Vamos ver se um modelo polinomial terá um desempenho melhor ao fazer previsões. Seguiremos um procedimento um pouco semelhante ao que fizemos antes:\n",
+ "\n",
+ "- Criar uma receita que especifique os passos de pré-processamento que devem ser realizados nos nossos dados para prepará-los para modelagem, ou seja: codificar os preditores e calcular polinômios de grau *n*\n",
+ "\n",
+ "- Construir uma especificação de modelo\n",
+ "\n",
+ "- Agrupar a receita e a especificação do modelo em um fluxo de trabalho\n",
+ "\n",
+ "- Criar um modelo ajustando o fluxo de trabalho\n",
+ "\n",
+ "- Avaliar o desempenho do modelo nos dados de teste\n",
+ "\n",
+ "Vamos começar!\n"
+ ],
+ "metadata": {
+ "id": "VcEIpRV9wzYr"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Specify a recipe\r\n",
+ "poly_pumpkins_recipe <-\r\n",
+ " recipe(price ~ package, data = pumpkins_train) %>%\r\n",
+ " step_integer(all_predictors(), zero_based = TRUE) %>% \r\n",
+ " step_poly(all_predictors(), degree = 4)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Create a model specification\r\n",
+ "poly_spec <- linear_reg() %>% \r\n",
+ " set_engine(\"lm\") %>% \r\n",
+ " set_mode(\"regression\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Bundle recipe and model spec into a workflow\r\n",
+ "poly_wf <- workflow() %>% \r\n",
+ " add_recipe(poly_pumpkins_recipe) %>% \r\n",
+ " add_model(poly_spec)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Create a model\r\n",
+ "poly_wf_fit <- poly_wf %>% \r\n",
+ " fit(data = pumpkins_train)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Print learned model coefficients\r\n",
+ "poly_wf_fit\r\n",
+ "\r\n",
+ " "
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "63n_YyRXw3CC"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "#### Avaliar o desempenho do modelo\n",
+ "\n",
+ "👏👏Você construiu um modelo polinomial, vamos fazer previsões no conjunto de teste!\n"
+ ],
+ "metadata": {
+ "id": "-LHZtztSxDP0"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make price predictions on test data\r\n",
+ "poly_results <- poly_wf_fit %>% predict(new_data = pumpkins_test) %>% \r\n",
+ " bind_cols(pumpkins_test %>% select(c(package, price))) %>% \r\n",
+ " relocate(.pred, .after = last_col())\r\n",
+ "\r\n",
+ "\r\n",
+ "# Print the results\r\n",
+ "poly_results %>% \r\n",
+ " slice_head(n = 10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "YUFpQ_dKxJGx"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Uhuu, vamos avaliar como o modelo se saiu no test_set usando `yardstick::metrics()`.\n"
+ ],
+ "metadata": {
+ "id": "qxdyj86bxNGZ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "metrics(data = poly_results, truth = price, estimate = .pred)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "8AW5ltkBxXDm"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "🤩🤩 Desempenho muito melhor.\n",
+ "\n",
+ "O `rmse` diminuiu de cerca de 7 para cerca de 3, indicando uma redução no erro entre o preço real e o preço previsto. Você pode *interpretar livremente* isso como significando que, em média, as previsões incorretas erram por volta de R\\$3. O `rsq` aumentou de cerca de 0,4 para 0,8.\n",
+ "\n",
+ "Todas essas métricas indicam que o modelo polinomial tem um desempenho muito melhor do que o modelo linear. Bom trabalho!\n",
+ "\n",
+ "Vamos ver se conseguimos visualizar isso!\n"
+ ],
+ "metadata": {
+ "id": "6gLHNZDwxYaS"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Bind encoded package column to the results\r\n",
+ "poly_results <- poly_results %>% \r\n",
+ " bind_cols(package_encode %>% \r\n",
+ " rename(package_integer = package)) %>% \r\n",
+ " relocate(package_integer, .after = package)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Print new results data frame\r\n",
+ "poly_results %>% \r\n",
+ " slice_head(n = 5)\r\n",
+ "\r\n",
+ "\r\n",
+ "# Make a scatter plot\r\n",
+ "poly_results %>% \r\n",
+ " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
+ " geom_point(size = 1.6) +\r\n",
+ " # Overlay a line of best fit\r\n",
+ " geom_line(aes(y = .pred), color = \"midnightblue\", size = 1.2) +\r\n",
+ " xlab(\"package\")\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "A83U16frxdF1"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Você pode ver uma linha curva que se ajusta melhor aos seus dados! 🤩\n",
+ "\n",
+ "Você pode torná-la ainda mais suave passando uma fórmula polinomial para `geom_smooth`, assim:\n"
+ ],
+ "metadata": {
+ "id": "4U-7aHOVxlGU"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make a scatter plot\r\n",
+ "poly_results %>% \r\n",
+ " ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
+ " geom_point(size = 1.6) +\r\n",
+ " # Overlay a line of best fit\r\n",
+ " geom_smooth(method = lm, formula = y ~ poly(x, degree = 4), color = \"midnightblue\", size = 1.2, se = FALSE) +\r\n",
+ " xlab(\"package\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "5vzNT0Uexm-w"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Muito parecido com uma curva suave!🤩\n",
+ "\n",
+ "Aqui está como você pode fazer uma nova previsão:\n"
+ ],
+ "metadata": {
+ "id": "v9u-wwyLxq4G"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make a hypothetical data frame\r\n",
+ "hypo_tibble <- tibble(package = \"bushel baskets\")\r\n",
+ "\r\n",
+ "# Make predictions using linear model\r\n",
+ "lm_pred <- lm_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
+ "\r\n",
+ "# Make predictions using polynomial model\r\n",
+ "poly_pred <- poly_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
+ "\r\n",
+ "# Return predictions in a list\r\n",
+ "list(\"linear model prediction\" = lm_pred, \r\n",
+ " \"polynomial model prediction\" = poly_pred)\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "jRPSyfQGxuQv"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "A previsão do `polynomial model` faz sentido, considerando os gráficos de dispersão de `price` e `package`! E, se este modelo for melhor do que o anterior, analisando os mesmos dados, você precisará planejar um orçamento para essas abóboras mais caras!\n",
+ "\n",
+ "🏆 Muito bem! Você criou dois modelos de regressão em uma única lição. Na seção final sobre regressão, você aprenderá sobre regressão logística para determinar categorias.\n",
+ "\n",
+ "## **🚀Desafio**\n",
+ "\n",
+ "Teste várias variáveis diferentes neste notebook para ver como a correlação corresponde à precisão do modelo.\n",
+ "\n",
+ "## [**Questionário pós-aula**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n",
+ "\n",
+ "## **Revisão e Autoestudo**\n",
+ "\n",
+ "Nesta lição, aprendemos sobre Regressão Linear. Existem outros tipos importantes de Regressão. Leia sobre as técnicas Stepwise, Ridge, Lasso e Elasticnet. Um bom curso para aprender mais é o [curso de Aprendizado Estatístico de Stanford](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).\n",
+ "\n",
+ "Se você quiser aprender mais sobre como usar o incrível framework Tidymodels, confira os seguintes recursos:\n",
+ "\n",
+ "- Site do Tidymodels: [Comece com Tidymodels](https://www.tidymodels.org/start/)\n",
+ "\n",
+ "- Max Kuhn e Julia Silge, [*Tidy Modeling with R*](https://www.tmwr.org/)*.*\n",
+ "\n",
+ "###### **AGRADECIMENTOS A:**\n",
+ "\n",
+ "[Allison Horst](https://twitter.com/allison_horst?lang=en) por criar as ilustrações incríveis que tornam o R mais acolhedor e envolvente. Encontre mais ilustrações na sua [galeria](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n"
+ ],
+ "metadata": {
+ "id": "8zOLOWqMxzk5"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/3-Linear/solution/notebook.ipynb b/translations/br/2-Regression/3-Linear/solution/notebook.ipynb
new file mode 100644
index 000000000..61755c0b0
--- /dev/null
+++ b/translations/br/2-Regression/3-Linear/solution/notebook.ipynb
@@ -0,0 +1,1111 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Regressão Linear e Polinomial para Precificação de Abóboras - Aula 3\n",
+ "\n",
+ "Carregue as bibliotecas necessárias e o conjunto de dados. Converta os dados para um dataframe contendo um subconjunto dos dados:\n",
+ "\n",
+ "- Considere apenas abóboras com preços definidos por alqueire\n",
+ "- Converta a data para o formato de mês\n",
+ "- Calcule o preço como uma média entre os preços mais altos e mais baixos\n",
+ "- Converta o preço para refletir a precificação pela quantidade em alqueires\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 167,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Type
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Sub Variety
\n",
+ "
Grade
\n",
+ "
Date
\n",
+ "
Low Price
\n",
+ "
High Price
\n",
+ "
Mostly Low
\n",
+ "
...
\n",
+ "
Unit of Sale
\n",
+ "
Quality
\n",
+ "
Condition
\n",
+ "
Appearance
\n",
+ "
Storage
\n",
+ "
Crop
\n",
+ "
Repack
\n",
+ "
Trans Mode
\n",
+ "
Unnamed: 24
\n",
+ "
Unnamed: 25
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
4/29/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
5/6/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
11/5/16
\n",
+ "
90.0
\n",
+ "
100.0
\n",
+ "
90.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Type Package Variety Sub Variety Grade Date \\\n",
+ "0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \n",
+ "1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n",
+ "2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n",
+ "\n",
+ " Low Price High Price Mostly Low ... Unit of Sale Quality Condition \\\n",
+ "0 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "1 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "2 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "3 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "4 90.0 100.0 90.0 ... NaN NaN NaN \n",
+ "\n",
+ " Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n",
+ "0 NaN NaN NaN E NaN NaN NaN \n",
+ "1 NaN NaN NaN E NaN NaN NaN \n",
+ "2 NaN NaN NaN N NaN NaN NaN \n",
+ "3 NaN NaN NaN N NaN NaN NaN \n",
+ "4 NaN NaN NaN N NaN NaN NaN \n",
+ "\n",
+ "[5 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 167,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from datetime import datetime\n",
+ "\n",
+ "pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n",
+ "pumpkins.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 168,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.scatter(X_test,y_test)\n",
+ "plt.plot(X_test,pred)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A inclinação da linha pode ser determinada a partir dos coeficientes de regressão linear:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 178,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(array([-0.01751876]), 21.133734359909326)"
+ ]
+ },
+ "execution_count": 178,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "lin_reg.coef_, lin_reg.intercept_"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 179,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([16.64893156])"
+ ]
+ },
+ "execution_count": 179,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Pumpkin price on programmer's day\n",
+ "\n",
+ "lin_reg.predict([[256]])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Regressão Polinomial\n",
+ "\n",
+ "Às vezes, a relação entre as características e os resultados é inerentemente não linear. Por exemplo, os preços de abóboras podem ser altos no inverno (meses=1,2), depois caírem no verão (meses=5-7) e subirem novamente. A regressão linear não consegue capturar essa relação com precisão.\n",
+ "\n",
+ "Nesse caso, podemos considerar adicionar características extras. Uma maneira simples é usar polinômios das características de entrada, o que resultaria em **regressão polinomial**. No Scikit Learn, podemos pré-computar automaticamente características polinomiais usando pipelines:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 180,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Mean error: 2.73 (17.0%)\n",
+ "Model determination: 0.07639977655280217\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[]"
+ ]
+ },
+ "execution_count": 180,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from sklearn.preprocessing import PolynomialFeatures\n",
+ "from sklearn.pipeline import make_pipeline\n",
+ "\n",
+ "pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())\n",
+ "\n",
+ "pipeline.fit(X_train,y_train)\n",
+ "\n",
+ "pred = pipeline.predict(X_test)\n",
+ "\n",
+ "mse = np.sqrt(mean_squared_error(y_test,pred))\n",
+ "print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')\n",
+ "\n",
+ "score = pipeline.score(X_train,y_train)\n",
+ "print('Model determination: ', score)\n",
+ "\n",
+ "plt.scatter(X_test,y_test)\n",
+ "plt.plot(sorted(X_test),pipeline.predict(sorted(X_test)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Codificando variedades\n",
+ "\n",
+ "No mundo ideal, queremos ser capazes de prever os preços de diferentes variedades de abóbora usando o mesmo modelo. Para levar a variedade em consideração, primeiro precisamos convertê-la para uma forma numérica, ou seja, **codificar**. Existem várias maneiras de fazer isso:\n",
+ "\n",
+ "* Codificação numérica simples, que cria uma tabela com as diferentes variedades e, em seguida, substitui o nome da variedade por um índice nessa tabela. Essa não é a melhor ideia para regressão linear, porque a regressão linear considera o valor numérico do índice, e esse valor numérico provavelmente não terá uma correlação direta com o preço.\n",
+ "* Codificação one-hot, que substitui a coluna `Variety` por 4 colunas diferentes, uma para cada variedade, que conterão 1 se a linha correspondente for da variedade em questão, e 0 caso contrário.\n",
+ "\n",
+ "O código abaixo mostra como podemos realizar a codificação one-hot de uma variedade:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 181,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
FAIRYTALE
\n",
+ "
MINIATURE
\n",
+ "
MIXED HEIRLOOM VARIETIES
\n",
+ "
PIE TYPE
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
70
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
71
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
72
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
73
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
74
\n",
+ "
0
\n",
+ "
0
\n",
+ "
0
\n",
+ "
1
\n",
+ "
\n",
+ "
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
...
\n",
+ "
\n",
+ "
\n",
+ "
1738
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1739
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1740
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1741
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ "
\n",
+ "
1742
\n",
+ "
0
\n",
+ "
1
\n",
+ "
0
\n",
+ "
0
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
415 rows × 4 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " FAIRYTALE MINIATURE MIXED HEIRLOOM VARIETIES PIE TYPE\n",
+ "70 0 0 0 1\n",
+ "71 0 0 0 1\n",
+ "72 0 0 0 1\n",
+ "73 0 0 0 1\n",
+ "74 0 0 0 1\n",
+ "... ... ... ... ...\n",
+ "1738 0 1 0 0\n",
+ "1739 0 1 0 0\n",
+ "1740 0 1 0 0\n",
+ "1741 0 1 0 0\n",
+ "1742 0 1 0 0\n",
+ "\n",
+ "[415 rows x 4 columns]"
+ ]
+ },
+ "execution_count": 181,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "pd.get_dummies(new_pumpkins['Variety'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Regressão Linear em Variedade\n",
+ "\n",
+ "Agora usaremos o mesmo código mencionado acima, mas, em vez de `DayOfYear`, utilizaremos nossa variedade codificada em one-hot como entrada:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 182,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "X = pd.get_dummies(new_pumpkins['Variety'])\n",
+ "y = new_pumpkins['Price']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 183,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Mean error: 5.24 (19.7%)\n",
+ "Model determination: 0.774085281105197\n"
+ ]
+ }
+ ],
+ "source": [
+ "def run_linear_regression(X,y):\n",
+ " X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n",
+ " lin_reg = LinearRegression()\n",
+ " lin_reg.fit(X_train,y_train)\n",
+ "\n",
+ " pred = lin_reg.predict(X_test)\n",
+ "\n",
+ " mse = np.sqrt(mean_squared_error(y_test,pred))\n",
+ " print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')\n",
+ "\n",
+ " score = lin_reg.score(X_train,y_train)\n",
+ " print('Model determination: ', score)\n",
+ "\n",
+ "run_linear_regression(X,y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Podemos também tentar usar outras características da mesma maneira e combiná-las com características numéricas, como `Month` ou `DayOfYear`:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 184,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Mean error: 2.84 (10.5%)\n",
+ "Model determination: 0.9401096672643048\n"
+ ]
+ }
+ ],
+ "source": [
+ "X = pd.get_dummies(new_pumpkins['Variety']) \\\n",
+ " .join(new_pumpkins['Month']) \\\n",
+ " .join(pd.get_dummies(new_pumpkins['City'])) \\\n",
+ " .join(pd.get_dummies(new_pumpkins['Package']))\n",
+ "y = new_pumpkins['Price']\n",
+ "\n",
+ "run_linear_regression(X,y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Regressão Polinomial\n",
+ "\n",
+ "A regressão polinomial também pode ser usada com características categóricas que foram codificadas em one-hot. O código para treinar a regressão polinomial seria essencialmente o mesmo que vimos acima.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Mean error: 2.23 (8.25%)\n",
+ "Model determination: 0.9652870784724543\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.preprocessing import PolynomialFeatures\n",
+ "from sklearn.pipeline import make_pipeline\n",
+ "\n",
+ "pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n",
+ "\n",
+ "pipeline.fit(X_train,y_train)\n",
+ "\n",
+ "pred = pipeline.predict(X_test)\n",
+ "\n",
+ "mse = np.sqrt(mean_squared_error(y_test,pred))\n",
+ "print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')\n",
+ "\n",
+ "score = pipeline.score(X_train,y_train)\n",
+ "print('Model determination: ', score)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "interpreter": {
+ "hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
+ },
+ "kernelspec": {
+ "display_name": "Python 3.7.0 64-bit ('3.7')",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.5"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "d77bd89ae7e79780c68c58bab91f13f8",
+ "translation_date": "2025-08-29T22:47:23+00:00",
+ "source_file": "2-Regression/3-Linear/solution/notebook.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/4-Logistic/README.md b/translations/br/2-Regression/4-Logistic/README.md
new file mode 100644
index 000000000..b37a8d728
--- /dev/null
+++ b/translations/br/2-Regression/4-Logistic/README.md
@@ -0,0 +1,415 @@
+
+# Regressão logística para prever categorias
+
+
+
+## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)
+
+> ### [Esta lição está disponível em R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html)
+
+## Introdução
+
+Nesta última lição sobre Regressão, uma das técnicas básicas _clássicas_ de ML, vamos explorar a Regressão Logística. Você usaria essa técnica para descobrir padrões e prever categorias binárias. Este doce é chocolate ou não? Esta doença é contagiosa ou não? Este cliente escolherá este produto ou não?
+
+Nesta lição, você aprenderá:
+
+- Uma nova biblioteca para visualização de dados
+- Técnicas para regressão logística
+
+✅ Aprofunde seu entendimento sobre como trabalhar com este tipo de regressão neste [módulo do Learn](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott)
+
+## Pré-requisito
+
+Depois de trabalhar com os dados de abóboras, já estamos familiarizados o suficiente para perceber que há uma categoria binária com a qual podemos trabalhar: `Color`.
+
+Vamos construir um modelo de regressão logística para prever, com base em algumas variáveis, _qual é a cor provável de uma abóbora_ (laranja 🎃 ou branca 👻).
+
+> Por que estamos falando de classificação binária em uma lição sobre regressão? Apenas por conveniência linguística, já que a regressão logística é [na verdade um método de classificação](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), embora baseado em um modelo linear. Aprenda sobre outras formas de classificar dados no próximo grupo de lições.
+
+## Definir a pergunta
+
+Para nossos propósitos, vamos expressar isso como um binário: 'Branca' ou 'Não Branca'. Há também uma categoria 'listrada' em nosso conjunto de dados, mas há poucas instâncias dela, então não a utilizaremos. Ela desaparece quando removemos valores nulos do conjunto de dados, de qualquer forma.
+
+> 🎃 Curiosidade: às vezes chamamos abóboras brancas de abóboras 'fantasmas'. Elas não são muito fáceis de esculpir, então não são tão populares quanto as laranjas, mas têm uma aparência interessante! Assim, também poderíamos reformular nossa pergunta como: 'Fantasma' ou 'Não Fantasma'. 👻
+
+## Sobre regressão logística
+
+A regressão logística difere da regressão linear, que você aprendeu anteriormente, em alguns aspectos importantes.
+
+[](https://youtu.be/KpeCT6nEpBY "ML para iniciantes - Entendendo Regressão Logística para Classificação em Machine Learning")
+
+> 🎥 Clique na imagem acima para um breve vídeo sobre regressão logística.
+
+### Classificação binária
+
+A regressão logística não oferece os mesmos recursos que a regressão linear. A primeira oferece uma previsão sobre uma categoria binária ("branca ou não branca"), enquanto a segunda é capaz de prever valores contínuos, por exemplo, dado a origem de uma abóbora e o tempo de colheita, _quanto seu preço aumentará_.
+
+
+> Infográfico por [Dasani Madipalli](https://twitter.com/dasani_decoded)
+
+### Outras classificações
+
+Existem outros tipos de regressão logística, incluindo multinomial e ordinal:
+
+- **Multinomial**, que envolve mais de uma categoria - "Laranja, Branca e Listrada".
+- **Ordinal**, que envolve categorias ordenadas, útil se quisermos ordenar nossos resultados logicamente, como nossas abóboras ordenadas por um número finito de tamanhos (mini,pequeno,médio,grande,xl,xxl).
+
+
+
+### As variáveis NÃO precisam ser correlacionadas
+
+Lembra como a regressão linear funcionava melhor com variáveis mais correlacionadas? A regressão logística é o oposto - as variáveis não precisam estar alinhadas. Isso funciona para este conjunto de dados, que tem correlações um tanto fracas.
+
+### Você precisa de muitos dados limpos
+
+A regressão logística fornecerá resultados mais precisos se você usar mais dados; nosso pequeno conjunto de dados não é ideal para esta tarefa, então tenha isso em mente.
+
+[](https://youtu.be/B2X4H9vcXTs "ML para iniciantes - Análise e Preparação de Dados para Regressão Logística")
+
+> 🎥 Clique na imagem acima para um breve vídeo sobre preparação de dados para regressão linear.
+
+✅ Pense nos tipos de dados que se adaptariam bem à regressão logística.
+
+## Exercício - organizar os dados
+
+Primeiro, limpe os dados um pouco, removendo valores nulos e selecionando apenas algumas colunas:
+
+1. Adicione o seguinte código:
+
+ ```python
+
+ columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']
+ pumpkins = full_pumpkins.loc[:, columns_to_select]
+
+ pumpkins.dropna(inplace=True)
+ ```
+
+ Você sempre pode dar uma olhada no seu novo dataframe:
+
+ ```python
+ pumpkins.info
+ ```
+
+### Visualização - gráfico categórico
+
+Agora que você carregou o [notebook inicial](./notebook.ipynb) com os dados de abóboras novamente e os limpou para preservar um conjunto de dados contendo algumas variáveis, incluindo `Color`, vamos visualizar o dataframe no notebook usando uma biblioteca diferente: [Seaborn](https://seaborn.pydata.org/index.html), que é construída sobre o Matplotlib que usamos anteriormente.
+
+O Seaborn oferece algumas maneiras interessantes de visualizar seus dados. Por exemplo, você pode comparar distribuições dos dados para cada `Variety` e `Color` em um gráfico categórico.
+
+1. Crie tal gráfico usando a função `catplot`, com os dados de abóboras `pumpkins`, e especificando um mapeamento de cores para cada categoria de abóbora (laranja ou branca):
+
+ ```python
+ import seaborn as sns
+
+ palette = {
+ 'ORANGE': 'orange',
+ 'WHITE': 'wheat',
+ }
+
+ sns.catplot(
+ data=pumpkins, y="Variety", hue="Color", kind="count",
+ palette=palette,
+ )
+ ```
+
+ 
+
+ Observando os dados, você pode ver como os dados de `Color` se relacionam com `Variety`.
+
+ ✅ Dado este gráfico categórico, quais são algumas explorações interessantes que você pode imaginar?
+
+### Pré-processamento de dados: codificação de características e rótulos
+
+Nosso conjunto de dados de abóboras contém valores de string para todas as suas colunas. Trabalhar com dados categóricos é intuitivo para humanos, mas não para máquinas. Os algoritmos de aprendizado de máquina funcionam bem com números. Por isso, a codificação é uma etapa muito importante na fase de pré-processamento de dados, pois permite transformar dados categóricos em dados numéricos, sem perder informações. Uma boa codificação leva à construção de um bom modelo.
+
+Para a codificação de características, existem dois principais tipos de codificadores:
+
+1. Codificador ordinal: é adequado para variáveis ordinais, que são variáveis categóricas cujos dados seguem uma ordem lógica, como a coluna `Item Size` em nosso conjunto de dados. Ele cria um mapeamento em que cada categoria é representada por um número, que é a ordem da categoria na coluna.
+
+ ```python
+ from sklearn.preprocessing import OrdinalEncoder
+
+ item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']]
+ ordinal_features = ['Item Size']
+ ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
+ ```
+
+2. Codificador categórico: é adequado para variáveis nominais, que são variáveis categóricas cujos dados não seguem uma ordem lógica, como todas as características diferentes de `Item Size` em nosso conjunto de dados. É uma codificação one-hot, o que significa que cada categoria é representada por uma coluna binária: a variável codificada é igual a 1 se a abóbora pertence àquela `Variety` e 0 caso contrário.
+
+ ```python
+ from sklearn.preprocessing import OneHotEncoder
+
+ categorical_features = ['City Name', 'Package', 'Variety', 'Origin']
+ categorical_encoder = OneHotEncoder(sparse_output=False)
+ ```
+
+Depois, `ColumnTransformer` é usado para combinar múltiplos codificadores em uma única etapa e aplicá-los às colunas apropriadas.
+
+```python
+ from sklearn.compose import ColumnTransformer
+
+ ct = ColumnTransformer(transformers=[
+ ('ord', ordinal_encoder, ordinal_features),
+ ('cat', categorical_encoder, categorical_features)
+ ])
+
+ ct.set_output(transform='pandas')
+ encoded_features = ct.fit_transform(pumpkins)
+```
+
+Por outro lado, para codificar o rótulo, usamos a classe `LabelEncoder` do scikit-learn, que é uma classe utilitária para ajudar a normalizar rótulos de forma que contenham apenas valores entre 0 e n_classes-1 (aqui, 0 e 1).
+
+```python
+ from sklearn.preprocessing import LabelEncoder
+
+ label_encoder = LabelEncoder()
+ encoded_label = label_encoder.fit_transform(pumpkins['Color'])
+```
+
+Depois de codificar as características e o rótulo, podemos mesclá-los em um novo dataframe `encoded_pumpkins`.
+
+```python
+ encoded_pumpkins = encoded_features.assign(Color=encoded_label)
+```
+
+✅ Quais são as vantagens de usar um codificador ordinal para a coluna `Item Size`?
+
+### Analisar relações entre variáveis
+
+Agora que pré-processamos nossos dados, podemos analisar as relações entre as características e o rótulo para ter uma ideia de quão bem o modelo será capaz de prever o rótulo com base nas características.
+
+A melhor maneira de realizar esse tipo de análise é plotando os dados. Usaremos novamente a função `catplot` do Seaborn para visualizar as relações entre `Item Size`, `Variety` e `Color` em um gráfico categórico. Para melhor plotar os dados, usaremos a coluna codificada `Item Size` e a coluna não codificada `Variety`.
+
+```python
+ palette = {
+ 'ORANGE': 'orange',
+ 'WHITE': 'wheat',
+ }
+ pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
+
+ g = sns.catplot(
+ data=pumpkins,
+ x="Item Size", y="Color", row='Variety',
+ kind="box", orient="h",
+ sharex=False, margin_titles=True,
+ height=1.8, aspect=4, palette=palette,
+ )
+ g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
+ g.set_titles(row_template="{row_name}")
+```
+
+
+
+### Usar um gráfico de dispersão (swarm plot)
+
+Como `Color` é uma categoria binária (Branca ou Não), ela precisa de '[uma abordagem especializada](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) para visualização'. Existem outras maneiras de visualizar a relação dessa categoria com outras variáveis.
+
+Você pode visualizar variáveis lado a lado com gráficos do Seaborn.
+
+1. Experimente um gráfico de dispersão ('swarm') para mostrar a distribuição de valores:
+
+ ```python
+ palette = {
+ 0: 'orange',
+ 1: 'wheat'
+ }
+ sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
+ ```
+
+ 
+
+**Atenção**: o código acima pode gerar um aviso, já que o Seaborn pode falhar ao representar tal quantidade de pontos de dados em um gráfico de dispersão. Uma solução possível é diminuir o tamanho do marcador, usando o parâmetro 'size'. No entanto, esteja ciente de que isso pode afetar a legibilidade do gráfico.
+
+> **🧮 Mostre-me a Matemática**
+>
+> A regressão logística baseia-se no conceito de 'máxima verossimilhança' usando [funções sigmoides](https://wikipedia.org/wiki/Sigmoid_function). Uma 'Função Sigmoide' em um gráfico parece uma forma de 'S'. Ela pega um valor e o mapeia para algo entre 0 e 1. Sua curva também é chamada de 'curva logística'. Sua fórmula é assim:
+>
+> 
+>
+> onde o ponto médio da sigmoide encontra-se no ponto 0 de x, L é o valor máximo da curva e k é a inclinação da curva. Se o resultado da função for maior que 0,5, o rótulo em questão será classificado como '1' da escolha binária. Caso contrário, será classificado como '0'.
+
+## Construir seu modelo
+
+Construir um modelo para encontrar essas classificações binárias é surpreendentemente simples no Scikit-learn.
+
+[](https://youtu.be/MmZS2otPrQ8 "ML para iniciantes - Regressão Logística para classificação de dados")
+
+> 🎥 Clique na imagem acima para um breve vídeo sobre como construir um modelo de regressão linear.
+
+1. Selecione as variáveis que deseja usar em seu modelo de classificação e divida os conjuntos de treinamento e teste chamando `train_test_split()`:
+
+ ```python
+ from sklearn.model_selection import train_test_split
+
+ X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]
+ y = encoded_pumpkins['Color']
+
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
+
+ ```
+
+2. Agora você pode treinar seu modelo, chamando `fit()` com seus dados de treinamento, e imprimir o resultado:
+
+ ```python
+ from sklearn.metrics import f1_score, classification_report
+ from sklearn.linear_model import LogisticRegression
+
+ model = LogisticRegression()
+ model.fit(X_train, y_train)
+ predictions = model.predict(X_test)
+
+ print(classification_report(y_test, predictions))
+ print('Predicted labels: ', predictions)
+ print('F1-score: ', f1_score(y_test, predictions))
+ ```
+
+ Veja o desempenho do seu modelo. Não é ruim, considerando que você tem apenas cerca de 1000 linhas de dados:
+
+ ```output
+ precision recall f1-score support
+
+ 0 0.94 0.98 0.96 166
+ 1 0.85 0.67 0.75 33
+
+ accuracy 0.92 199
+ macro avg 0.89 0.82 0.85 199
+ weighted avg 0.92 0.92 0.92 199
+
+ Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
+ 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
+ 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 0 0 0 1 0 0 0 0 0 0 0 0 1 1]
+ F1-score: 0.7457627118644068
+ ```
+
+## Melhor compreensão por meio de uma matriz de confusão
+
+Embora você possa obter um relatório de desempenho [termos](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) imprimindo os itens acima, talvez seja mais fácil entender seu modelo usando uma [matriz de confusão](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) para ajudar a entender como o modelo está se saindo.
+
+> 🎓 Uma '[matriz de confusão](https://wikipedia.org/wiki/Confusion_matrix)' (ou 'matriz de erro') é uma tabela que expressa os verdadeiros vs. falsos positivos e negativos do seu modelo, avaliando assim a precisão das previsões.
+
+1. Para usar uma matriz de confusão, chame `confusion_matrix()`:
+
+ ```python
+ from sklearn.metrics import confusion_matrix
+ confusion_matrix(y_test, predictions)
+ ```
+
+ Veja a matriz de confusão do seu modelo:
+
+ ```output
+ array([[162, 4],
+ [ 11, 22]])
+ ```
+
+No Scikit-learn, as linhas (eixo 0) da matriz de confusão são os rótulos reais e as colunas (eixo 1) são os rótulos previstos.
+
+| | 0 | 1 |
+| :---: | :---: | :---: |
+| 0 | TN | FP |
+| 1 | FN | TP |
+
+O que está acontecendo aqui? Digamos que nosso modelo seja solicitado a classificar abóboras entre duas categorias binárias, categoria 'branca' e categoria 'não branca'.
+
+- Se o modelo prevê uma abóbora como não branca e ela realmente pertence à categoria 'não branca', chamamos isso de verdadeiro negativo, mostrado pelo número no canto superior esquerdo.
+- Se o modelo prevê uma abóbora como branca e ela realmente pertence à categoria 'não branca', chamamos isso de falso negativo, mostrado pelo número no canto inferior esquerdo.
+- Se o modelo prevê uma abóbora como não branca e ela realmente pertence à categoria 'branca', chamamos isso de falso positivo, mostrado pelo número no canto superior direito.
+- Se o modelo prevê uma abóbora como branca e ela realmente pertence à categoria 'branca', chamamos isso de verdadeiro positivo, mostrado pelo número no canto inferior direito.
+
+Como você deve ter adivinhado, é preferível ter um número maior de verdadeiros positivos e verdadeiros negativos e um número menor de falsos positivos e falsos negativos, o que implica que o modelo está se saindo melhor.
+Como a matriz de confusão se relaciona com precisão e recall? Lembre-se, o relatório de classificação mostrado acima indicou precisão (0,85) e recall (0,67).
+
+Precisão = tp / (tp + fp) = 22 / (22 + 4) = 0,8461538461538461
+
+Recall = tp / (tp + fn) = 22 / (22 + 11) = 0,6666666666666666
+
+✅ P: De acordo com a matriz de confusão, como o modelo se saiu? R: Não foi ruim; há um bom número de verdadeiros negativos, mas também alguns falsos negativos.
+
+Vamos revisitar os termos que vimos anteriormente com a ajuda do mapeamento de TP/TN e FP/FN na matriz de confusão:
+
+🎓 Precisão: TP/(TP + FP) A fração de instâncias relevantes entre as instâncias recuperadas (por exemplo, quais rótulos foram bem rotulados).
+
+🎓 Recall: TP/(TP + FN) A fração de instâncias relevantes que foram recuperadas, independentemente de estarem bem rotuladas ou não.
+
+🎓 f1-score: (2 * precisão * recall)/(precisão + recall) Uma média ponderada entre precisão e recall, sendo o melhor 1 e o pior 0.
+
+🎓 Suporte: O número de ocorrências de cada rótulo recuperado.
+
+🎓 Precisão geral (Accuracy): (TP + TN)/(TP + TN + FP + FN) A porcentagem de rótulos previstos corretamente para uma amostra.
+
+🎓 Macro Avg: O cálculo da média não ponderada das métricas para cada rótulo, sem levar em conta o desequilíbrio entre os rótulos.
+
+🎓 Weighted Avg: O cálculo da média das métricas para cada rótulo, levando em conta o desequilíbrio entre os rótulos ao ponderá-los pelo suporte (o número de instâncias verdadeiras para cada rótulo).
+
+✅ Você consegue pensar em qual métrica deve observar se quiser que seu modelo reduza o número de falsos negativos?
+
+## Visualizar a curva ROC deste modelo
+
+[](https://youtu.be/GApO575jTA0 "ML para iniciantes - Analisando o desempenho da regressão logística com curvas ROC")
+
+> 🎥 Clique na imagem acima para um breve vídeo sobre curvas ROC.
+
+Vamos fazer mais uma visualização para ver a chamada curva 'ROC':
+
+```python
+from sklearn.metrics import roc_curve, roc_auc_score
+import matplotlib
+import matplotlib.pyplot as plt
+%matplotlib inline
+
+y_scores = model.predict_proba(X_test)
+fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
+
+fig = plt.figure(figsize=(6, 6))
+plt.plot([0, 1], [0, 1], 'k--')
+plt.plot(fpr, tpr)
+plt.xlabel('False Positive Rate')
+plt.ylabel('True Positive Rate')
+plt.title('ROC Curve')
+plt.show()
+```
+
+Usando Matplotlib, plote a [Curva Característica de Operação do Receptor](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) ou ROC do modelo. As curvas ROC são frequentemente usadas para visualizar o desempenho de um classificador em termos de seus verdadeiros positivos versus falsos positivos. "As curvas ROC geralmente apresentam a taxa de verdadeiros positivos no eixo Y e a taxa de falsos positivos no eixo X." Assim, a inclinação da curva e o espaço entre a linha do ponto médio e a curva são importantes: você quer uma curva que rapidamente suba e ultrapasse a linha. No nosso caso, há falsos positivos no início, e então a linha sobe e ultrapassa adequadamente:
+
+
+
+Por fim, use a API [`roc_auc_score`](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) do Scikit-learn para calcular a 'Área Sob a Curva' (AUC):
+
+```python
+auc = roc_auc_score(y_test,y_scores[:,1])
+print(auc)
+```
+
+O resultado é `0,9749908725812341`. Dado que a AUC varia de 0 a 1, você quer um valor alto, já que um modelo que é 100% correto em suas previsões terá uma AUC de 1; neste caso, o modelo está _muito bom_.
+
+Em futuras lições sobre classificações, você aprenderá como iterar para melhorar os resultados do seu modelo. Mas, por enquanto, parabéns! Você concluiu estas lições sobre regressão!
+
+---
+## 🚀Desafio
+
+Há muito mais para explorar sobre regressão logística! Mas a melhor maneira de aprender é experimentando. Encontre um conjunto de dados que se preste a este tipo de análise e construa um modelo com ele. O que você aprende? dica: experimente [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) para conjuntos de dados interessantes.
+
+## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/16/)
+
+## Revisão e Autoestudo
+
+Leia as primeiras páginas [deste artigo de Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) sobre alguns usos práticos da regressão logística. Pense em tarefas que são mais adequadas para um ou outro tipo de regressão entre as que estudamos até agora. O que funcionaria melhor?
+
+## Tarefa
+
+[Repetindo esta regressão](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/4-Logistic/assignment.md b/translations/br/2-Regression/4-Logistic/assignment.md
new file mode 100644
index 000000000..6f376cf45
--- /dev/null
+++ b/translations/br/2-Regression/4-Logistic/assignment.md
@@ -0,0 +1,25 @@
+
+# Repetindo uma Regressão
+
+## Instruções
+
+Na aula, você utilizou um subconjunto dos dados de abóbora. Agora, volte aos dados originais e tente usar todos eles, limpos e padronizados, para construir um modelo de Regressão Logística.
+
+## Rubrica
+
+| Critério | Exemplary | Adequado | Precisa de Melhorias |
+| --------- | ----------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- |
+| | Um notebook é apresentado com um modelo bem explicado e de bom desempenho | Um notebook é apresentado com um modelo que apresenta desempenho mínimo | Um notebook é apresentado com um modelo de baixo desempenho ou nenhum |
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/4-Logistic/notebook.ipynb b/translations/br/2-Regression/4-Logistic/notebook.ipynb
new file mode 100644
index 000000000..f29d1084e
--- /dev/null
+++ b/translations/br/2-Regression/4-Logistic/notebook.ipynb
@@ -0,0 +1,269 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Variedades de Abóbora e Cor\n",
+ "\n",
+ "Carregue as bibliotecas necessárias e o conjunto de dados. Converta os dados para um dataframe contendo um subconjunto dos dados:\n",
+ "\n",
+ "Vamos observar a relação entre cor e variedade\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Type
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Sub Variety
\n",
+ "
Grade
\n",
+ "
Date
\n",
+ "
Low Price
\n",
+ "
High Price
\n",
+ "
Mostly Low
\n",
+ "
...
\n",
+ "
Unit of Sale
\n",
+ "
Quality
\n",
+ "
Condition
\n",
+ "
Appearance
\n",
+ "
Storage
\n",
+ "
Crop
\n",
+ "
Repack
\n",
+ "
Trans Mode
\n",
+ "
Unnamed: 24
\n",
+ "
Unnamed: 25
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
4/29/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
5/6/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
11/5/16
\n",
+ "
90.0
\n",
+ "
100.0
\n",
+ "
90.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Type Package Variety Sub Variety Grade Date \\\n",
+ "0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \n",
+ "1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n",
+ "2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n",
+ "\n",
+ " Low Price High Price Mostly Low ... Unit of Sale Quality Condition \\\n",
+ "0 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "1 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "2 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "3 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "4 90.0 100.0 90.0 ... NaN NaN NaN \n",
+ "\n",
+ " Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n",
+ "0 NaN NaN NaN E NaN NaN NaN \n",
+ "1 NaN NaN NaN E NaN NaN NaN \n",
+ "2 NaN NaN NaN N NaN NaN NaN \n",
+ "3 NaN NaN NaN N NaN NaN NaN \n",
+ "4 NaN NaN NaN N NaN NaN NaN \n",
+ "\n",
+ "[5 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n",
+ "full_pumpkins = pd.read_csv('../data/US-pumpkins.csv')\n",
+ "\n",
+ "full_pumpkins.head()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.1"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "dee08c2b49057b0de8b6752c4dbca368",
+ "translation_date": "2025-08-29T22:57:44+00:00",
+ "source_file": "2-Regression/4-Logistic/notebook.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/4-Logistic/solution/Julia/README.md b/translations/br/2-Regression/4-Logistic/solution/Julia/README.md
new file mode 100644
index 000000000..79e0d6458
--- /dev/null
+++ b/translations/br/2-Regression/4-Logistic/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb b/translations/br/2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb
new file mode 100644
index 000000000..b438410e3
--- /dev/null
+++ b/translations/br/2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb
@@ -0,0 +1,685 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Construir um modelo de regressão logística - Aula 4\n",
+ "\n",
+ "\n",
+ "\n",
+ "#### **[Questionário pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)**\n",
+ "\n",
+ "#### Introdução\n",
+ "\n",
+ "Nesta última aula sobre Regressão, uma das técnicas *clássicas* básicas de Machine Learning, vamos explorar a Regressão Logística. Você usaria essa técnica para descobrir padrões e prever categorias binárias. Este doce é de chocolate ou não? Esta doença é contagiosa ou não? Este cliente escolherá este produto ou não?\n",
+ "\n",
+ "Nesta aula, você aprenderá:\n",
+ "\n",
+ "- Técnicas para regressão logística\n",
+ "\n",
+ "✅ Aprofunde seu entendimento sobre como trabalhar com este tipo de regressão neste [módulo do Learn](https://learn.microsoft.com/training/modules/introduction-classification-models/?WT.mc_id=academic-77952-leestott)\n",
+ "\n",
+ "## Pré-requisito\n",
+ "\n",
+ "Depois de trabalhar com os dados de abóboras, já estamos suficientemente familiarizados com eles para perceber que há uma categoria binária com a qual podemos trabalhar: `Color`.\n",
+ "\n",
+ "Vamos construir um modelo de regressão logística para prever, dado algumas variáveis, *qual é a cor provável de uma determinada abóbora* (laranja 🎃 ou branca 👻).\n",
+ "\n",
+ "> Por que estamos falando de classificação binária em uma aula sobre regressão? Apenas por conveniência linguística, já que a regressão logística é [na verdade um método de classificação](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), embora baseado em um modelo linear. Aprenda sobre outras formas de classificar dados no próximo grupo de aulas.\n",
+ "\n",
+ "Para esta aula, precisaremos dos seguintes pacotes:\n",
+ "\n",
+ "- `tidyverse`: O [tidyverse](https://www.tidyverse.org/) é uma [coleção de pacotes R](https://www.tidyverse.org/packages) projetada para tornar a ciência de dados mais rápida, fácil e divertida!\n",
+ "\n",
+ "- `tidymodels`: O [tidymodels](https://www.tidymodels.org/) é uma [coleção de pacotes](https://www.tidymodels.org/packages/) para modelagem e aprendizado de máquina.\n",
+ "\n",
+ "- `janitor`: O pacote [janitor](https://github.com/sfirke/janitor) oferece ferramentas simples para examinar e limpar dados desorganizados.\n",
+ "\n",
+ "- `ggbeeswarm`: O pacote [ggbeeswarm](https://github.com/eclarke/ggbeeswarm) fornece métodos para criar gráficos no estilo \"beeswarm\" usando ggplot2.\n",
+ "\n",
+ "Você pode instalá-los com o seguinte comando:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"ggbeeswarm\"))`\n",
+ "\n",
+ "Alternativamente, o script abaixo verifica se você possui os pacotes necessários para completar este módulo e os instala caso estejam ausentes.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
+ "\n",
+ "pacman::p_load(tidyverse, tidymodels, janitor, ggbeeswarm)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## **Defina a pergunta**\n",
+ "\n",
+ "Para os nossos propósitos, vamos expressar isso como um binário: 'Branco' ou 'Não Branco'. Há também uma categoria 'listrado' em nosso conjunto de dados, mas há poucos exemplos dela, então não a utilizaremos. De qualquer forma, ela desaparece quando removemos os valores nulos do conjunto de dados.\n",
+ "\n",
+ "> 🎃 Curiosidade: às vezes chamamos abóboras brancas de abóboras 'fantasmas'. Elas não são muito fáceis de esculpir, então não são tão populares quanto as laranjas, mas têm uma aparência bem legal! Assim, também poderíamos reformular nossa pergunta como: 'Fantasma' ou 'Não Fantasma'. 👻\n",
+ "\n",
+ "## **Sobre regressão logística**\n",
+ "\n",
+ "A regressão logística difere da regressão linear, que você aprendeu anteriormente, de algumas maneiras importantes.\n",
+ "\n",
+ "#### **Classificação binária**\n",
+ "\n",
+ "A regressão logística não oferece os mesmos recursos que a regressão linear. A primeira fornece uma previsão sobre uma `categoria binária` (\"laranja ou não laranja\"), enquanto a segunda é capaz de prever `valores contínuos`, por exemplo, dado a origem de uma abóbora e o momento da colheita, *quanto o preço dela vai aumentar*.\n",
+ "\n",
+ "\n",
+ "\n",
+ "### Outras classificações\n",
+ "\n",
+ "Existem outros tipos de regressão logística, incluindo multinomial e ordinal:\n",
+ "\n",
+ "- **Multinomial**, que envolve mais de uma categoria - \"Laranja, Branco e Listrado\".\n",
+ "\n",
+ "- **Ordinal**, que envolve categorias ordenadas, útil se quisermos organizar nossos resultados de forma lógica, como nossas abóboras ordenadas por um número finito de tamanhos (mini,pequeno,médio,grande,xl,xxl).\n",
+ "\n",
+ "\n",
+ "\n",
+ "#### **As variáveis NÃO precisam ser correlacionadas**\n",
+ "\n",
+ "Lembra como a regressão linear funcionava melhor com variáveis mais correlacionadas? A regressão logística é o oposto - as variáveis não precisam estar alinhadas. Isso funciona para este conjunto de dados, que tem correlações um tanto fracas.\n",
+ "\n",
+ "#### **Você precisa de muitos dados limpos**\n",
+ "\n",
+ "A regressão logística fornecerá resultados mais precisos se você usar mais dados; nosso pequeno conjunto de dados não é o ideal para essa tarefa, então tenha isso em mente.\n",
+ "\n",
+ "✅ Pense nos tipos de dados que se adaptariam bem à regressão logística.\n",
+ "\n",
+ "## Exercício - organize os dados\n",
+ "\n",
+ "Primeiro, limpe um pouco os dados, removendo valores nulos e selecionando apenas algumas das colunas:\n",
+ "\n",
+ "1. Adicione o seguinte código:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Load the core tidyverse packages\n",
+ "library(tidyverse)\n",
+ "\n",
+ "# Import the data and clean column names\n",
+ "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\") %>% \n",
+ " clean_names()\n",
+ "\n",
+ "# Select desired columns\n",
+ "pumpkins_select <- pumpkins %>% \n",
+ " select(c(city_name, package, variety, origin, item_size, color)) \n",
+ "\n",
+ "# Drop rows containing missing values and encode color as factor (category)\n",
+ "pumpkins_select <- pumpkins_select %>% \n",
+ " drop_na() %>% \n",
+ " mutate(color = factor(color))\n",
+ "\n",
+ "# View the first few rows\n",
+ "pumpkins_select %>% \n",
+ " slice_head(n = 5)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Você pode sempre dar uma olhada no seu novo dataframe usando a função [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) como mostrado abaixo:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "pumpkins_select %>% \n",
+ " glimpse()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Vamos confirmar que estaremos realmente lidando com um problema de classificação binária:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Subset distinct observations in outcome column\n",
+ "pumpkins_select %>% \n",
+ " distinct(color)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Visualização - gráfico categórico\n",
+ "Agora você já carregou novamente os dados das abóboras e os limpou para preservar um conjunto de dados contendo algumas variáveis, incluindo Cor. Vamos visualizar o dataframe no notebook usando a biblioteca ggplot.\n",
+ "\n",
+ "A biblioteca ggplot oferece maneiras interessantes de visualizar seus dados. Por exemplo, você pode comparar as distribuições dos dados para cada Variedade e Cor em um gráfico categórico.\n",
+ "\n",
+ "1. Crie um gráfico desse tipo usando a função geombar, com os dados das abóboras, e especifique um mapeamento de cores para cada categoria de abóbora (laranja ou branca):\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "python"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Specify colors for each value of the hue variable\n",
+ "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
+ "\n",
+ "# Create the bar plot\n",
+ "ggplot(pumpkins_select, aes(y = variety, fill = color)) +\n",
+ " geom_bar(position = \"dodge\") +\n",
+ " scale_fill_manual(values = palette) +\n",
+ " labs(y = \"Variety\", fill = \"Color\") +\n",
+ " theme_minimal()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Ao observar os dados, você pode ver como as informações de Cor se relacionam com a Variedade.\n",
+ "\n",
+ "✅ Dado este gráfico categórico, quais são algumas explorações interessantes que você consegue imaginar?\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Pré-processamento de dados: codificação de características\n",
+ "\n",
+ "Nosso conjunto de dados de abóboras contém valores em formato de texto para todas as suas colunas. Trabalhar com dados categóricos é intuitivo para humanos, mas não para máquinas. Os algoritmos de aprendizado de máquina funcionam melhor com números. Por isso, a codificação é uma etapa muito importante na fase de pré-processamento de dados, pois nos permite transformar dados categóricos em dados numéricos, sem perder nenhuma informação. Uma boa codificação contribui para a construção de um bom modelo.\n",
+ "\n",
+ "Para a codificação de características, existem dois principais tipos de codificadores:\n",
+ "\n",
+ "1. Codificador ordinal: é adequado para variáveis ordinais, que são variáveis categóricas cujos dados seguem uma ordem lógica, como a coluna `item_size` no nosso conjunto de dados. Ele cria um mapeamento em que cada categoria é representada por um número, que corresponde à ordem da categoria na coluna.\n",
+ "\n",
+ "2. Codificador categórico: é adequado para variáveis nominais, que são variáveis categóricas cujos dados não seguem uma ordem lógica, como todas as características diferentes de `item_size` no nosso conjunto de dados. Trata-se de uma codificação one-hot, o que significa que cada categoria é representada por uma coluna binária: a variável codificada é igual a 1 se a abóbora pertence àquela variedade e 0 caso contrário.\n",
+ "\n",
+ "O Tidymodels oferece mais um pacote interessante: [recipes](https://recipes.tidymodels.org/) - um pacote para pré-processamento de dados. Vamos definir uma `recipe` que especifica que todas as colunas preditoras devem ser codificadas em um conjunto de números inteiros, `prep` para estimar as quantidades e estatísticas necessárias para quaisquer operações e, por fim, `bake` para aplicar os cálculos aos novos dados.\n",
+ "\n",
+ "> Normalmente, o recipes é usado como um pré-processador para modelagem, onde define quais etapas devem ser aplicadas a um conjunto de dados para prepará-lo para a modelagem. Nesse caso, é **altamente recomendado** que você use um `workflow()` em vez de estimar manualmente uma receita usando prep e bake. Veremos tudo isso em breve.\n",
+ ">\n",
+ "> No entanto, por enquanto, estamos usando recipes + prep + bake para especificar quais etapas devem ser aplicadas a um conjunto de dados para prepará-lo para análise de dados e, em seguida, extrair os dados pré-processados com as etapas aplicadas.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Preprocess and extract data to allow some data analysis\n",
+ "baked_pumpkins <- recipe(color ~ ., data = pumpkins_select) %>%\n",
+ " # Define ordering for item_size column\n",
+ " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
+ " # Convert factors to numbers using the order defined above (Ordinal encoding)\n",
+ " step_integer(item_size, zero_based = F) %>%\n",
+ " # Encode all other predictors using one hot encoding\n",
+ " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE) %>%\n",
+ " prep(data = pumpkin_select) %>%\n",
+ " bake(new_data = NULL)\n",
+ "\n",
+ "# Display the first few rows of preprocessed data\n",
+ "baked_pumpkins %>% \n",
+ " slice_head(n = 5)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "✅ Quais são as vantagens de usar um codificador ordinal para a coluna Item Size?\n",
+ "\n",
+ "### Analisar relações entre variáveis\n",
+ "\n",
+ "Agora que pré-processamos nossos dados, podemos analisar as relações entre as características e o rótulo para ter uma ideia de quão bem o modelo será capaz de prever o rótulo com base nas características. A melhor maneira de realizar esse tipo de análise é plotando os dados. \n",
+ "Usaremos novamente a função ggplot geom_boxplot_ para visualizar as relações entre Item Size, Variety e Color em um gráfico categórico. Para melhorar a visualização dos dados, utilizaremos a coluna codificada de Item Size e a coluna não codificada de Variety.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Define the color palette\n",
+ "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n",
+ "\n",
+ "# We need the encoded Item Size column to use it as the x-axis values in the plot\n",
+ "pumpkins_select_plot<-pumpkins_select\n",
+ "pumpkins_select_plot$item_size <- baked_pumpkins$item_size\n",
+ "\n",
+ "# Create the grouped box plot\n",
+ "ggplot(pumpkins_select_plot, aes(x = `item_size`, y = color, fill = color)) +\n",
+ " geom_boxplot() +\n",
+ " facet_grid(variety ~ ., scales = \"free_x\") +\n",
+ " scale_fill_manual(values = palette) +\n",
+ " labs(x = \"Item Size\", y = \"\") +\n",
+ " theme_minimal() +\n",
+ " theme(strip.text = element_text(size = 12)) +\n",
+ " theme(axis.text.x = element_text(size = 10)) +\n",
+ " theme(axis.title.x = element_text(size = 12)) +\n",
+ " theme(axis.title.y = element_blank()) +\n",
+ " theme(legend.position = \"bottom\") +\n",
+ " guides(fill = guide_legend(title = \"Color\")) +\n",
+ " theme(panel.spacing = unit(0.5, \"lines\"))+\n",
+ " theme(strip.text.y = element_text(size = 4, hjust = 0)) \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Use um gráfico swarm\n",
+ "\n",
+ "Como Cor é uma categoria binária (Branco ou Não), ela requer '[uma abordagem especializada](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf) para visualização'.\n",
+ "\n",
+ "Experimente um `gráfico swarm` para mostrar a distribuição de cor em relação ao item_size.\n",
+ "\n",
+ "Usaremos o [pacote ggbeeswarm](https://github.com/eclarke/ggbeeswarm), que fornece métodos para criar gráficos no estilo beeswarm usando ggplot2. Gráficos beeswarm são uma forma de plotar pontos que normalmente se sobreporiam, organizando-os lado a lado.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Create beeswarm plots of color and item_size\n",
+ "baked_pumpkins %>% \n",
+ " mutate(color = factor(color)) %>% \n",
+ " ggplot(mapping = aes(x = color, y = item_size, color = color)) +\n",
+ " geom_quasirandom() +\n",
+ " scale_color_brewer(palette = \"Dark2\", direction = -1) +\n",
+ " theme(legend.position = \"none\")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Agora que temos uma ideia da relação entre as categorias binárias de cor e o grupo maior de tamanhos, vamos explorar a regressão logística para determinar a provável cor de uma abóbora.\n",
+ "\n",
+ "## Construa seu modelo\n",
+ "\n",
+ "Selecione as variáveis que você deseja usar no seu modelo de classificação e divida os dados em conjuntos de treinamento e teste. O [rsample](https://rsample.tidymodels.org/), um pacote do Tidymodels, fornece uma infraestrutura para divisão e reamostragem de dados de forma eficiente:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Split data into 80% for training and 20% for testing\n",
+ "set.seed(2056)\n",
+ "pumpkins_split <- pumpkins_select %>% \n",
+ " initial_split(prop = 0.8)\n",
+ "\n",
+ "# Extract the data in each split\n",
+ "pumpkins_train <- training(pumpkins_split)\n",
+ "pumpkins_test <- testing(pumpkins_split)\n",
+ "\n",
+ "# Print out the first 5 rows of the training set\n",
+ "pumpkins_train %>% \n",
+ " slice_head(n = 5)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "🙌 Estamos prontos para treinar um modelo ajustando as características de treinamento ao rótulo de treinamento (cor).\n",
+ "\n",
+ "Começaremos criando uma receita que especifica as etapas de pré-processamento que devem ser realizadas em nossos dados para prepará-los para a modelagem, ou seja: codificar variáveis categóricas em um conjunto de números inteiros. Assim como `baked_pumpkins`, criaremos uma `pumpkins_recipe`, mas não usaremos `prep` e `bake`, já que isso será incorporado em um fluxo de trabalho, como você verá em apenas alguns passos.\n",
+ "\n",
+ "Existem várias maneiras de especificar um modelo de regressão logística no Tidymodels. Veja `?logistic_reg()`. Por enquanto, especificaremos um modelo de regressão logística usando o mecanismo padrão `stats::glm()`.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Create a recipe that specifies preprocessing steps for modelling\n",
+ "pumpkins_recipe <- recipe(color ~ ., data = pumpkins_train) %>% \n",
+ " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n",
+ " step_integer(item_size, zero_based = F) %>% \n",
+ " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE)\n",
+ "\n",
+ "# Create a logistic model specification\n",
+ "log_reg <- logistic_reg() %>% \n",
+ " set_engine(\"glm\") %>% \n",
+ " set_mode(\"classification\")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Agora que temos uma receita e uma especificação de modelo, precisamos encontrar uma maneira de combiná-los em um objeto que primeiro pré-processará os dados (prep+bake nos bastidores), ajustará o modelo nos dados pré-processados e também permitirá atividades de pós-processamento, se necessário.\n",
+ "\n",
+ "No Tidymodels, esse objeto prático é chamado de [`workflow`](https://workflows.tidymodels.org/) e organiza convenientemente seus componentes de modelagem.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Bundle modelling components in a workflow\n",
+ "log_reg_wf <- workflow() %>% \n",
+ " add_recipe(pumpkins_recipe) %>% \n",
+ " add_model(log_reg)\n",
+ "\n",
+ "# Print out the workflow\n",
+ "log_reg_wf\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Depois que um fluxo de trabalho é *especificado*, um modelo pode ser `treinado` usando a função [`fit()`](https://tidymodels.github.io/parsnip/reference/fit.html). O fluxo de trabalho estimará uma receita e pré-processará os dados antes do treinamento, então não será necessário fazer isso manualmente usando prep e bake.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Train the model\n",
+ "wf_fit <- log_reg_wf %>% \n",
+ " fit(data = pumpkins_train)\n",
+ "\n",
+ "# Print the trained workflow\n",
+ "wf_fit\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "O modelo exibe os coeficientes aprendidos durante o treinamento.\n",
+ "\n",
+ "Agora que treinamos o modelo usando os dados de treinamento, podemos fazer previsões nos dados de teste usando [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Vamos começar usando o modelo para prever os rótulos do nosso conjunto de teste e as probabilidades para cada rótulo. Quando a probabilidade for maior que 0,5, a classe prevista será `WHITE`, caso contrário, será `ORANGE`.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Make predictions for color and corresponding probabilities\n",
+ "results <- pumpkins_test %>% select(color) %>% \n",
+ " bind_cols(wf_fit %>% \n",
+ " predict(new_data = pumpkins_test)) %>%\n",
+ " bind_cols(wf_fit %>%\n",
+ " predict(new_data = pumpkins_test, type = \"prob\"))\n",
+ "\n",
+ "# Compare predictions\n",
+ "results %>% \n",
+ " slice_head(n = 10)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Muito bom! Isso oferece mais insights sobre como a regressão logística funciona.\n",
+ "\n",
+ "### Melhor compreensão por meio de uma matriz de confusão\n",
+ "\n",
+ "Comparar cada previsão com seu respectivo valor real (\"ground truth\") não é uma maneira muito eficiente de determinar o quão bem o modelo está prevendo. Felizmente, o Tidymodels tem mais algumas cartas na manga: [`yardstick`](https://yardstick.tidymodels.org/) - um pacote usado para medir a eficácia de modelos utilizando métricas de desempenho.\n",
+ "\n",
+ "Uma métrica de desempenho associada a problemas de classificação é a [`matriz de confusão`](https://wikipedia.org/wiki/Confusion_matrix). Uma matriz de confusão descreve o quão bem um modelo de classificação está performando. Ela tabula quantos exemplos de cada classe foram classificados corretamente por um modelo. No nosso caso, ela mostrará quantas abóboras laranjas foram classificadas como laranjas e quantas abóboras brancas foram classificadas como brancas; a matriz de confusão também mostra quantas foram classificadas nas categorias **erradas**.\n",
+ "\n",
+ "A função [**`conf_mat()`**](https://tidymodels.github.io/yardstick/reference/conf_mat.html) do yardstick calcula essa tabela cruzada de classes observadas e previstas.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Confusion matrix for prediction results\n",
+ "conf_mat(data = results, truth = color, estimate = .pred_class)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Vamos interpretar a matriz de confusão. Nosso modelo foi solicitado a classificar abóboras entre duas categorias binárias, a categoria `branca` e a categoria `não-branca`.\n",
+ "\n",
+ "- Se o seu modelo prevê que uma abóbora é branca e ela realmente pertence à categoria 'branca', chamamos isso de `verdadeiro positivo`, representado pelo número no canto superior esquerdo.\n",
+ "\n",
+ "- Se o seu modelo prevê que uma abóbora não é branca e ela realmente pertence à categoria 'branca', chamamos isso de `falso negativo`, representado pelo número no canto inferior esquerdo.\n",
+ "\n",
+ "- Se o seu modelo prevê que uma abóbora é branca e ela realmente pertence à categoria 'não-branca', chamamos isso de `falso positivo`, representado pelo número no canto superior direito.\n",
+ "\n",
+ "- Se o seu modelo prevê que uma abóbora não é branca e ela realmente pertence à categoria 'não-branca', chamamos isso de `verdadeiro negativo`, representado pelo número no canto inferior direito.\n",
+ "\n",
+ "| Verdade |\n",
+ "|:-------:|\n",
+ "\n",
+ "| | | |\n",
+ "|---------------|--------|-------|\n",
+ "| **Previsto** | BRANCA | LARANJA |\n",
+ "| BRANCA | VP | FP |\n",
+ "| LARANJA | FN | VN |\n",
+ "\n",
+ "Como você deve ter imaginado, é preferível ter um número maior de verdadeiros positivos e verdadeiros negativos e um número menor de falsos positivos e falsos negativos, o que implica que o modelo tem um desempenho melhor.\n",
+ "\n",
+ "A matriz de confusão é útil porque dá origem a outras métricas que podem nos ajudar a avaliar melhor o desempenho de um modelo de classificação. Vamos analisar algumas delas:\n",
+ "\n",
+ "🎓 Precisão: `VP/(VP + FP)` definida como a proporção de positivos previstos que são realmente positivos. Também chamada de [valor preditivo positivo](https://en.wikipedia.org/wiki/Positive_predictive_value \"Positive predictive value\").\n",
+ "\n",
+ "🎓 Revocação: `VP/(VP + FN)` definida como a proporção de resultados positivos em relação ao número de amostras que eram realmente positivas. Também conhecida como `sensibilidade`.\n",
+ "\n",
+ "🎓 Especificidade: `VN/(VN + FP)` definida como a proporção de resultados negativos em relação ao número de amostras que eram realmente negativas.\n",
+ "\n",
+ "🎓 Acurácia: `VP + VN/(VP + VN + FP + FN)` A porcentagem de rótulos previstos corretamente para uma amostra.\n",
+ "\n",
+ "🎓 Medida F: Uma média ponderada entre a precisão e a revocação, sendo 1 o melhor valor e 0 o pior.\n",
+ "\n",
+ "Vamos calcular essas métricas!\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Combine metric functions and calculate them all at once\n",
+ "eval_metrics <- metric_set(ppv, recall, spec, f_meas, accuracy)\n",
+ "eval_metrics(data = results, truth = color, estimate = .pred_class)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Visualizar a curva ROC deste modelo\n",
+ "\n",
+ "Vamos fazer mais uma visualização para observar a chamada [`curva ROC`](https://en.wikipedia.org/wiki/Receiver_operating_characteristic):\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Make a roc_curve\n",
+ "results %>% \n",
+ " roc_curve(color, .pred_ORANGE) %>% \n",
+ " autoplot()\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Curvas ROC são frequentemente usadas para obter uma visão do desempenho de um classificador em termos de verdadeiros positivos versus falsos positivos. Curvas ROC geralmente apresentam a `Taxa de Verdadeiros Positivos`/Sensibilidade no eixo Y e a `Taxa de Falsos Positivos`/1-Especificidade no eixo X. Assim, a inclinação da curva e o espaço entre a linha do ponto médio e a curva são importantes: você quer uma curva que rapidamente suba e ultrapasse a linha. No nosso caso, há falsos positivos no início, e então a linha sobe e ultrapassa adequadamente.\n",
+ "\n",
+ "Por fim, vamos usar `yardstick::roc_auc()` para calcular a Área Sob a Curva. Uma forma de interpretar a AUC é como a probabilidade de que o modelo classifique um exemplo positivo aleatório mais alto do que um exemplo negativo aleatório.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "vscode": {
+ "languageId": "r"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Calculate area under curve\n",
+ "results %>% \n",
+ " roc_auc(color, .pred_ORANGE)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "O resultado é cerca de `0.975`. Dado que o AUC varia de 0 a 1, você quer um valor alto, já que um modelo que acerta 100% das previsões terá um AUC de 1; neste caso, o modelo é *muito bom*.\n",
+ "\n",
+ "Em futuras lições sobre classificações, você aprenderá como melhorar os resultados do seu modelo (como lidar com dados desbalanceados neste caso).\n",
+ "\n",
+ "## 🚀Desafio\n",
+ "\n",
+ "Há muito mais para explorar sobre regressão logística! Mas a melhor forma de aprender é experimentando. Encontre um conjunto de dados que se preste a esse tipo de análise e construa um modelo com ele. O que você aprende? dica: experimente [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) para conjuntos de dados interessantes.\n",
+ "\n",
+ "## Revisão & Estudo Individual\n",
+ "\n",
+ "Leia as primeiras páginas [deste artigo de Stanford](https://web.stanford.edu/~jurafsky/slp3/5.pdf) sobre alguns usos práticos da regressão logística. Pense em tarefas que são mais adequadas para um ou outro tipo de regressão entre as que estudamos até agora. O que funcionaria melhor?\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": "",
+ "kernelspec": {
+ "display_name": "R",
+ "langauge": "R",
+ "name": "ir"
+ },
+ "language_info": {
+ "codemirror_mode": "r",
+ "file_extension": ".r",
+ "mimetype": "text/x-r-source",
+ "name": "R",
+ "pygments_lexer": "r",
+ "version": "3.4.1"
+ },
+ "coopTranslator": {
+ "original_hash": "feaf125f481a89c468fa115bf2aed580",
+ "translation_date": "2025-08-29T23:04:05+00:00",
+ "source_file": "2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/4-Logistic/solution/notebook.ipynb b/translations/br/2-Regression/4-Logistic/solution/notebook.ipynb
new file mode 100644
index 000000000..7042722d3
--- /dev/null
+++ b/translations/br/2-Regression/4-Logistic/solution/notebook.ipynb
@@ -0,0 +1,1255 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Regressão Logística - Aula 4\n",
+ "\n",
+ "Carregue as bibliotecas necessárias e o conjunto de dados. Converta os dados para um dataframe contendo um subconjunto dos dados:\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Type
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Sub Variety
\n",
+ "
Grade
\n",
+ "
Date
\n",
+ "
Low Price
\n",
+ "
High Price
\n",
+ "
Mostly Low
\n",
+ "
...
\n",
+ "
Unit of Sale
\n",
+ "
Quality
\n",
+ "
Condition
\n",
+ "
Appearance
\n",
+ "
Storage
\n",
+ "
Crop
\n",
+ "
Repack
\n",
+ "
Trans Mode
\n",
+ "
Unnamed: 24
\n",
+ "
Unnamed: 25
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
4/29/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
1
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
5/6/17
\n",
+ "
270.0
\n",
+ "
280.0
\n",
+ "
270.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
E
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
9/24/16
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
160.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
BALTIMORE
\n",
+ "
NaN
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
11/5/16
\n",
+ "
90.0
\n",
+ "
100.0
\n",
+ "
90.0
\n",
+ "
...
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
N
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
NaN
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Type Package Variety Sub Variety Grade Date \n",
+ "0 BALTIMORE NaN 24 inch bins NaN NaN NaN 4/29/17 \\\n",
+ "1 BALTIMORE NaN 24 inch bins NaN NaN NaN 5/6/17 \n",
+ "2 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "3 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 9/24/16 \n",
+ "4 BALTIMORE NaN 24 inch bins HOWDEN TYPE NaN NaN 11/5/16 \n",
+ "\n",
+ " Low Price High Price Mostly Low ... Unit of Sale Quality Condition \n",
+ "0 270.0 280.0 270.0 ... NaN NaN NaN \\\n",
+ "1 270.0 280.0 270.0 ... NaN NaN NaN \n",
+ "2 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "3 160.0 160.0 160.0 ... NaN NaN NaN \n",
+ "4 90.0 100.0 90.0 ... NaN NaN NaN \n",
+ "\n",
+ " Appearance Storage Crop Repack Trans Mode Unnamed: 24 Unnamed: 25 \n",
+ "0 NaN NaN NaN E NaN NaN NaN \n",
+ "1 NaN NaN NaN E NaN NaN NaN \n",
+ "2 NaN NaN NaN N NaN NaN NaN \n",
+ "3 NaN NaN NaN N NaN NaN NaN \n",
+ "4 NaN NaN NaN N NaN NaN NaN \n",
+ "\n",
+ "[5 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 63,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "\n",
+ "full_pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n",
+ "\n",
+ "full_pumpkins.head()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
City Name
\n",
+ "
Package
\n",
+ "
Variety
\n",
+ "
Origin
\n",
+ "
Item Size
\n",
+ "
Color
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
2
\n",
+ "
BALTIMORE
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
DELAWARE
\n",
+ "
med
\n",
+ "
ORANGE
\n",
+ "
\n",
+ "
\n",
+ "
3
\n",
+ "
BALTIMORE
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
VIRGINIA
\n",
+ "
med
\n",
+ "
ORANGE
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
BALTIMORE
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
MARYLAND
\n",
+ "
lge
\n",
+ "
ORANGE
\n",
+ "
\n",
+ "
\n",
+ "
5
\n",
+ "
BALTIMORE
\n",
+ "
24 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
MARYLAND
\n",
+ "
lge
\n",
+ "
ORANGE
\n",
+ "
\n",
+ "
\n",
+ "
6
\n",
+ "
BALTIMORE
\n",
+ "
36 inch bins
\n",
+ "
HOWDEN TYPE
\n",
+ "
MARYLAND
\n",
+ "
med
\n",
+ "
ORANGE
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " City Name Package Variety Origin Item Size Color\n",
+ "2 BALTIMORE 24 inch bins HOWDEN TYPE DELAWARE med ORANGE\n",
+ "3 BALTIMORE 24 inch bins HOWDEN TYPE VIRGINIA med ORANGE\n",
+ "4 BALTIMORE 24 inch bins HOWDEN TYPE MARYLAND lge ORANGE\n",
+ "5 BALTIMORE 24 inch bins HOWDEN TYPE MARYLAND lge ORANGE\n",
+ "6 BALTIMORE 36 inch bins HOWDEN TYPE MARYLAND med ORANGE"
+ ]
+ },
+ "execution_count": 64,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Select the columns we want to use\n",
+ "columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']\n",
+ "pumpkins = full_pumpkins.loc[:, columns_to_select]\n",
+ "\n",
+ "# Drop rows with missing values\n",
+ "pumpkins.dropna(inplace=True)\n",
+ "\n",
+ "pumpkins.head()"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Vamos dar uma olhada nos nossos dados!\n",
+ "\n",
+ "Visualizando-os com Seaborn\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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S0tLab1CCxcuxAcffIBXXnkFbm5uGDZsGF555RW89dZbBtd1cnLCjBkzMGjQIFy6dAleXl4AYHDuomRnZyM7O1t6nJ6eXqJxRERU/THQEMzMzHD79u2nuuaQIUOwefNmDB06FL1798bp06dx5syZYseYmZkBAHJycsq0Znh4OD755BO9dssOi2BlaQ7bBv5lmpeIiKoe76F5jomiiN27d+PXX39F586di+1br149affFwsICPj4+5V5/+fLlOH36NMaOHYvly5fDwcGhyL4pKSn44osvULduXWl3BgCmTJkiq8vCwgIHDhwwOEdoaCjS0tKk4/r16+W+BiIiqh64Q/Mc2rFjBywsLJCbm4uCggK8+eabmDVrVrFjDhw4ILs3pUaNGuWuw9HREe+99x62bNmCnj17GuxTr149iKKI//77D82aNcPGjRthYmIinZ80aRKCg4NlY+rWrWtwLrVaDbVaXe66iYio+mGgeQ5ptVpERkbCxMQEderUgUr15B8Dd3f3Et1DU1oqlarY9Q8cOAArKys4OjoavNnX3t4eHh4eFV4XEREpCwPNc8jc3FwxIaCyghQRET1bGGioRG7duoWsrCxZm52dXYW89FQeGRkZep+HU7NmTb23mBMR0bONNwVTiXh5ecHJyUl2/PHHH1VdFmbMmKFX1+TJk6u6LCIiesoEURTFqi6CqCqkp6fD2toaV05u4du2iYgUjjs0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4/LZteu7Z1tfy27mJiBSOOzRERESkeAw0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4DDRERESkeAw0REREpHgMNERERKR4/KRgeu5dXdUElmYlz/Zuw65UYjVERFQW3KEhIiIixWOgISIiIsVjoCEiIiLFY6AhIiIixWOgISIiIsVjoCEiIiLFY6AhIiIixWOgISIiIsVjoCEiIiLFY6AhIiIixWOgISIiIsVjoCEiIiLFY6AhIiIixWOgISIiIsVjoCml4OBgCIIgHXZ2dggMDMSpU6dk/QRBwJYtW2RtcXFxeO211+Dg4ABTU1M0aNAAAwYMwP79+4td083NDYIgYO3atXrnfHx8IAgCVq5cqXcu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",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import seaborn as sns\n",
+ "# Specify colors for each values of the hue variable\n",
+ "palette = {\n",
+ " 'ORANGE': 'orange',\n",
+ " 'WHITE': 'wheat',\n",
+ "}\n",
+ "# Plot a bar plot to visualize how many pumpkins of each variety are orange or white\n",
+ "sns.catplot(\n",
+ " data=pumpkins, y=\"Variety\", hue=\"Color\", kind=\"count\",\n",
+ " palette=palette, \n",
+ ")"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Pré-processamento de dados\n",
+ "\n",
+ "Vamos codificar as características e os rótulos para melhor visualizar os dados e treinar o modelo\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['med', 'lge', 'sml', 'xlge', 'med-lge', 'jbo', 'exjbo'],\n",
+ " dtype=object)"
+ ]
+ },
+ "execution_count": 66,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Let's look at the different values of the 'Item Size' column\n",
+ "pumpkins['Item Size'].unique()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.preprocessing import OrdinalEncoder\n",
+ "# Encode the 'Item Size' column using ordinal encoding\n",
+ "item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']]\n",
+ "ordinal_features = ['Item Size']\n",
+ "ordinal_encoder = OrdinalEncoder(categories=item_size_categories)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.preprocessing import OneHotEncoder\n",
+ "# Encode all the other features using one-hot encoding\n",
+ "categorical_features = ['City Name', 'Package', 'Variety', 'Origin']\n",
+ "categorical_encoder = OneHotEncoder(sparse_output=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Suppressing warning message claiming that a portion of points cannot be placed into the plot due to the high number of data points\n",
+ "import warnings\n",
+ "warnings.filterwarnings(action='ignore', category=UserWarning, module='seaborn')\n",
+ "\n",
+ "palette = {\n",
+ " 0: 'orange',\n",
+ " 1: 'wheat'\n",
+ "}\n",
+ "sns.swarmplot(x=\"Color\", y=\"ord__Item Size\", hue=\"Color\", data=encoded_pumpkins, palette=palette)"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Atenção**: Ignorar avisos NÃO é uma boa prática e deve ser evitado sempre que possível. Avisos geralmente contêm mensagens úteis que nos permitem melhorar nosso código e resolver um problema. \n",
+ "O motivo pelo qual estamos ignorando este aviso específico é para garantir a legibilidade do gráfico. Plotar todos os pontos de dados com um tamanho de marcador reduzido, mantendo a consistência com a paleta de cores, gera uma visualização pouco clara.\n"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "# X is the encoded features\n",
+ "X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]\n",
+ "# y is the encoded label\n",
+ "y = encoded_pumpkins['Color']\n",
+ "\n",
+ "# Split the data into training and test sets\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " precision recall f1-score support\n",
+ "\n",
+ " 0 0.94 0.98 0.96 166\n",
+ " 1 0.85 0.67 0.75 33\n",
+ "\n",
+ " accuracy 0.92 199\n",
+ " macro avg 0.89 0.82 0.85 199\n",
+ "weighted avg 0.92 0.92 0.92 199\n",
+ "\n",
+ "Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0\n",
+ " 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
+ " 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0\n",
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0\n",
+ " 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1\n",
+ " 0 0 0 1 0 0 0 0 0 0 0 0 1 1]\n",
+ "F1-score: 0.7457627118644068\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.metrics import f1_score, classification_report \n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "\n",
+ "# Train a logistic regression model on the pumpkin dataset\n",
+ "model = LogisticRegression()\n",
+ "model.fit(X_train, y_train)\n",
+ "predictions = model.predict(X_test)\n",
+ "\n",
+ "# Evaluate the model and print the results\n",
+ "print(classification_report(y_test, predictions))\n",
+ "print('Predicted labels: ', predictions)\n",
+ "print('F1-score: ', f1_score(y_test, predictions))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[162, 4],\n",
+ " [ 11, 22]])"
+ ]
+ },
+ "execution_count": 76,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.metrics import confusion_matrix\n",
+ "confusion_matrix(y_test, predictions)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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EBoaii1btkAul78xCtOzZ0+cOHECYWFhb2z//PlzZGVlafSaRKaAV/IkMgHZV/I8ffq0+hBJtm3btqFHjx5Yvnw5hgwZAuDVYQYfHx/89ttvaNmyJbp37w5ra2scPXoUGzduRPXq1REREZHjSp4qlQpffPEFNmzYgPr166uv5BkXF4edO3fi1KlTOH78OJo0aZJnzidPnqBdu3Y4d+4cvLy80KZNG9ja2uKff/7Bli1bEBsbi/T0dACvzjqpWbMm6tSpg/79++Px48dYsWIFSpYsicTERPUpuHfu3EGFChUwf/78HAXldZs2bcLnn38Oe3t7uLm5qU+ZzZaSkoIWLVrg/Pnz+OKLL9CgQQMkJyfjwoUL2LZtG+7cuZPjkAoRgVfyJDIFeV1oSwghlEqlqFSpkqhUqVKOi2QplUrxyy+/iGbNmgkHBwehUCjExx9/LGbMmCFevnyZ52tt27ZNtGvXThQrVkxYWFiI0qVLCx8fHxEVFZWvrCkpKWLBggXik08+EXZ2dkIul4vKlSuLkSNHihs3buRYd+PGjaJixYpCLpeLunXrirCwsLdeaCsviYmJwtraWgAQGzduzHWdpKQkMWnSJPHRRx8JuVwunJycRNOmTcWCBQtERkZGvt4bkSnhCAYRERFpHedgEBERkdaxYBAREZHWsWAQERGR1rFgEBERkdaxYBAREZHWsWAQERGR1pncvUhUKhUePXoEe3t7yGQyqeMQEREZDCEEkpKSUKZMGZiZvX2MwuQKxqNHj+Ds7Cx1DCIiIoN1//59lCtX7q3rmFzByL699P3799W3hyYiIqJ3S0xMhLOzs/p36duYXMHIPizi4ODAgkFERFQA+ZliwEmeREREpHUsGERERKR1LBhERESkdSwYREREpHUsGERERKR1LBhERESkdSwYREREpHUsGERERKR1LBhERESkdSwYREREpHUsGERERKR1LBhERESkdSwYREREpHUsGERERKR1khaMw4cPw8vLC2XKlIFMJsPOnTvfuU1UVBTq168PKysrfPTRRwgODtZ5TiIiItKMpAUjOTkZderUQVBQUL7Wv337Njp27IhWrVohJiYGX331FQYMGICwsDAdJyUiIiJNWEj54u3bt0f79u3zvf6KFStQoUIFLFy4EABQvXp1HD16FIsXL4aHh4euYhoVIQSi7z3Dk6R0qaMQEVEhaFLJCY7WloX+upIWDE2dOHEC7u7uOZZ5eHjgq6++ynOb9PR0pKf//y/TxMREXcUzCCdvPUXvVSeljkFERIVk76gWLBjvEhcXh5IlS+ZYVrJkSSQmJiI1NRXW1tZvbDN37lzMmDGjsCLqvQsPnwMAnOys4PKBjbRhiIhI52zk5pK8rkEVjIKYNGkSAgIC1I8TExPh7OwsYSJp3XuaAgDo9YkzxnlUlTgNERFp05kzZ/DTTz9h5cqVsLQs/FGL1xlUwShVqhTi4+NzLIuPj4eDg0OuoxcAYGVlBSsrq8KIZxDuPU0FAJQvxtELIiJjcvr0abRr1w7Pnz9H+fLlJR+9N6jrYDRp0gQRERE5lh04cABNmjSRKJHhuf+/EQxnFgwiIqNx6tQptG3bFs+fP0ezZs0wbtw4qSNJWzBevnyJmJgYxMTEAHh1GmpMTAzu3bsH4NXhDV9fX/X6Q4YMwa1btzB+/HhcvXoVy5YtQ2hoKMaMGSNFfIOjVAk8ePaqYJTn/AsiIqPw119/oW3btnjx4gWaN2+Offv2wd7eXupY0haMv//+G/Xq1UO9evUAAAEBAahXrx6mTZsGAIiNjVWXDQCoUKEC9uzZgwMHDqBOnTpYuHAhVq9ezVNU8yn2RSoylQKW5jKUclBIHYeIiN7TyZMn0a5dOyQmJqJFixZ6Uy4AQCaEEFKHKEyJiYlwdHTEixcv4ODgIHWcQnX8ZgL6rPoLFZxsETnOTeo4RET0HlJTU1GpUiXExsbC1dUVu3fvhp2dnU5fU5PfoQY1B4PeD+dfEBEZD2tra2zevBkdO3bEnj17dF4uNGVQZ5HQ+8k+RfVDFgwiIoOVmZmpPgXVzc0Nbm5u0gbKA0cwTAhPUSUiMmxHjx5FtWrVcPHiRamjvBMLhgm5x0MkREQG68iRI/D09MStW7fw7bffSh3nnVgwTEj2HAyOYBARGZbDhw+jffv2SE5Ohru7O9auXSt1pHdiwTARSWmZeJqcAQBwLpb7VU+JiEj/HDp0SF0u2rZti127duV59Wp9woJhIrIPjxSzlcNeIe316YmIKH8iIyPRoUMHpKSkwMPDA7///rtBlAuABcNk8BRVIiLDIoTA3LlzkZKSAk9PT+zcudNgygXAgmEyeIoqEZFhkclk2LZtGyZMmIAdO3ZAoTCsKzCzYJiIe5zgSURkEO7evav+3MHBAfPmzTO4cgGwYJgMXgODiEj/HThwANWqVcO8efOkjvLeWDBMBOdgEBHptz///BNeXl5IS0vD8ePHoVQqpY70XlgwTABv005EpN/CwsLQuXNnpKeno0uXLti2bRvMzc2ljvVeWDBMAG/TTkSkv/bt24cuXbogPT0d3t7eCA0NhVwulzrWe2PBMAHZEzzLFbWBuZlM4jRERJRt79698Pb2Rnp6Orp27YqQkBCjKBcAC4ZJ4CXCiYj0040bN5CRkYHu3bsbVbkAeLt2k8BTVImI9NOoUaNQoUIFeHp6qm/Bbiw4gmECeIoqEZH+OHjwIJ49e6Z+7OXlZXTlAmDBMAn3/k0GwFNUiYik9vvvv8PT0xPt2rVDYmKi1HF0igXDBPAQCRGR9Hbs2IHPPvsMmZmZqFy5MmxsjPtnMguGkUtMy8SzlEwAvAYGEZFUtm/fjp49eyIrKwt9+vTB+vXrYWFh3NMgWTCMXPYZJB/YymFnZdz/mImI9NFvv/0GHx8fZGVloW/fviZRLgAWDKPHS4QTEUln586d6nLRr18/rFu3zuCv0Jlfxl+hTBznXxARSad69eooUaIE2rZti7Vr15pMuQBYMIweCwYRkXSqVq2KU6dOoXTp0iZVLgAeIjF6d/9lwSAiKky//vor/vzzT/XjcuXKmVy5ADiCYfQ4B4OIqPBs2rQJvr6+kMvlOHXqFGrVqiV1JMlwBMOIvbpN+/+u4slTVImIdGrjxo3w9fWFSqXC559/jo8//ljqSJJiwTBisS9SkaUSkJub8TbtREQ6tGHDBnW5GDhwIH7++WeYmZn2r1geIjEiT5LSkZKRpX4cc/85AKBcUWvepp2ISEfWrVsHf39/CCEwaNAgLF++3OTLBcCCYTR2n3+EEZvP5vo1zr8gItKNqKgodbkYMmQIgoKCWC7+hwXDSFx+9OqmOZbmMlhZ/P9sZbmFGbrVLytVLCIio9a8eXP4+PigaNGiCAoKgkzG0eJsLBhG5vNPP0Sgl2lPLCIiKiwWFhbYsGEDzM3NWS7+g+M4REREGli9ejUGDBgAlUoF4FXJYLl4E0cwiIiI8mnlypUYPHgwAMDd3R29evWSOJH+4ggGERFRPvz888/qcjF69Gj4+PhInEi/sWAQERG9w/LlyzFkyBAAwJgxY7B48WIeFnkHFgwiIqK3CAoKwrBhwwAAY8eOxcKFC1ku8oEFg4iIKA93795FQEAAAGDcuHGYP38+y0U+cZInERFRHj788EOEhobi1KlTmD17NsuFBlgwiIiI/iMpKQn29vYAgC5duqBLly4SJzI8PERCRET0msWLF6NmzZq4ffu21FEMGgsGERHR/yxatAgBAQG4d+8efvvtN6njGDQWDCIiIgALFy7E2LFjAQBTp05Vf04Fw4JBREQmb/78+Rg3bhwAYNq0aZgxYwYndL4nFgwiIjJp33//PcaPHw8AmD59OsuFlvAsEiIiMllpaWnYtGkTAGDGjBmYNm2axImMBwsGERGZLIVCgfDwcGzfvl19nxHSDh4iISIik3P27Fn158WLF2e50AEWDCIiMimzZs1C/fr1sXLlSqmjGDUWDCIiMhmvz7N4+vSpxGmMG+dgEBGRScg+QwQA5s2bhwkTJkicyLixYBARkVETQmD69OmYOXMmgFenpX799dcSpzJ+LBhERGS0hBCYNm0aZs+eDQBYsGABr9BZSFgwiIjIJCxatAhjxoyROobJYMEgIiKjJZPJMHPmTLRv3x5NmzaVOo5J4VkkRERkVIQQWLVqFVJSUgC8KhksF4WPBYOIiIyGEAITJkzAoEGD0LlzZyiVSqkjmSweIiEiIqMghMD48eOxYMECAEDXrl1hbm4ucSrTxYJBREQGTwiBcePGYdGiRQCAoKAgDBs2TOJUpo0Fg4iIDJoQAgEBAViyZAkAYPny5RgyZIi0oYgFg4iIDNvUqVPV5WLFihW8cZme4CRPIiIyaN26dUOxYsXw888/s1zoEY5gEBGRQatfvz7++ecfFCtWTOoo9BqOYBARkUHJPlvk5MmT6mUsF/qHBYOIiAyGSqXC8OHDMX/+fLRv3563XNdjPERCREQGQaVSYdiwYfj5558hk8mwZMkSjlzoMRYMIiLSeyqVCkOHDsXKlSshk8kQHBwMX19fqWPRW7BgGAkhdQAiIh1RqVQYPHgwVq9eDTMzM6xbtw6ff/651LHoHVgwjMSp26+OQ5Z2VEichIhIu4KCgtTlYv369ejbt6/UkSgfWDCMwLW4JJy5+wwWZjJ41ysrdRwiIq0aOHAgwsLC0KdPH/Tp00fqOJRPLBhG4NdT9wAA7tVLooQ9RzCIyPCpVCrIZDLIZDIoFAr88ccfkMlkUsciDfA0VQOXmqHEb9EPAAC9G5eXOA0R0ftTKpXw9/fH119/DSFezTBjuTA8kheMoKAguLi4QKFQoHHjxjh16tRb11+yZAmqVq0Ka2trODs7Y8yYMUhLSyuktPpnz4VYJKVloVxRa7T4yEnqOERE7yW7XKxfvx5LlizB+fPnpY5EBSRpwQgJCUFAQAACAwMRHR2NOnXqwMPDA48fP851/c2bN2PixIkIDAzElStXsGbNGoSEhGDy5MmFnFx/ZB8e6d2oPMzM2PCJyHAplUr4+flhw4YNMDc3x5YtW1CnTh2pY1EBSVowFi1ahIEDB8Lf3x81atTAihUrYGNjg7Vr1+a6/vHjx9GsWTP06dMHLi4uaNeuHXr37v3OUQ9j9frkzh4Ny0kdh4iowLKysuDr64tNmzbBwsICISEh+Oyzz6SORe9BsoKRkZGBM2fOwN3d/f/DmJnB3d0dJ06cyHWbpk2b4syZM+pCcevWLezduxcdOnTI83XS09ORmJiY48NYcHInERmD7HKxefNmWFhYIDQ0FN27d5c6Fr0nyc4iSUhIgFKpRMmSJXMsL1myJK5evZrrNn369EFCQgKaN28OIQSysrIwZMiQtx4imTt3LmbMmKHV7Prg9cmdfTi5k4gM2LFjx7BlyxZYWFhg69at8Pb2ljoSaYHkkzw1ERUVhTlz5mDZsmWIjo7G9u3bsWfPHsyaNSvPbSZNmoQXL16oP+7fv1+IiXUne3KnczFrNOfkTiIyYK6urggODsa2bdtYLoyIZCMYTk5OMDc3R3x8fI7l8fHxKFWqVK7bTJ06Ff369cOAAQMAALVq1UJycjIGDRqEb775BmZmb/YlKysrWFlZaf8NSCz78EivTzi5k4gMT2ZmJp4/f47ixYsDAO8rYoQkG8GQy+Vo0KABIiIi1MtUKhUiIiLQpEmTXLdJSUl5o0SYm5sDgPpcaVPAyZ1EZMgyMzPRu3dvtGzZEnFxcVLHIR2R9EqeAQEB8PPzQ8OGDdGoUSMsWbIEycnJ8Pf3B/Cq0ZYtWxZz584FAHh5eWHRokWoV68eGjdujBs3bmDq1Knw8vJSFw1TsO3Mq8M8bWtwcicRGZbMzEz06tUL27dvh1wux8WLF/MctSbDJmnB8PHxwZMnTzBt2jTExcWhbt262L9/v3ri571793KMWEyZMgUymQxTpkzBw4cPUbx4cXh5eeHbb7+V6i1I4u+7zwAAHh/zm5KIDEdGRgZ69eqFHTt2QC6XY8eOHTnOJCTjIhOmdGwBQGJiIhwdHfHixQs4ODhIHUdjWUoVak4PQ1qmChFjXVGpuJ3UkYiI3ikjIwM9e/bE77//DisrK+zcuROenp5SxyINafI7lDc7MzA3nrxEWqYKdlYWqPCBrdRxiIjeKSMjAz169MCuXbtgZWWF33//HR4eHlLHIh0zqNNUCbjw4AUA4OMyDjx7hIgMwtOnT3Hp0iUoFArs2rWL5cJEcATDwFx8+Kpg1CrrKHESIqL8KVWqFCIjI3Hjxg20atVK6jhUSDiCYWDOZxeMciwYRKS/0tPTERUVpX7s7OzMcmFiWDAMSJZShSuxr+6lUpMjGESkp9LS0tCtWze4u7tj69atUschibBgGBBO8CQifZeWloauXbti7969kMvl+OCDD6SORBLhHAwDwgmeRKTPUlNT4e3tjT///BM2NjbYs2cP3NzcpI5FEmHBMCAXOMGTiPRUamoqunTpggMHDsDGxgZ79+6Fq6ur1LFIQiwYBuQCJ3gSkR5KT09H586dER4eDltbW+zduxctW7aUOhZJjHMwDAQneBKRvpLL5ahcuTJsbW2xb98+lgsCwIJhMDjBk4j0lUwmw08//YTo6Gi0aNFC6jikJ1gwDAQneBKRPklOTsbMmTORmZkJADAzM0OVKlUkTkX6hHMwDAQneBKRvkhOTkbHjh1x6NAh3Lp1C8HBwVJHIj3EEQwDwQmeRKQPXr58iQ4dOuDQoUNwcHDAkCFDpI5EeoojGAbg9QmeHMEgIqlkl4sjR47AwcEBf/75Jxo3bix1LNJTHMEwAK9P8HThBE8ikkBSUhLat2+PI0eOwNHREQcOHGC5oLfiCIYBOM8JnkQkISEEevTogaNHj6JIkSI4cOAAGjZsKHUs0nMcwTAAvEU7EUlJJpNh0qRJKFu2LMLDw1kuKF84gmEAOMGTiKTm6uqKGzduQKFQSB2FDARHMPQcJ3gSkRRevHgBLy8vXLx4Ub2M5YI0wREMPccJnkRU2J4/fw4PDw+cOnUKN27cwMWLF2Fubi51LDIwLBh6jhM8iagwPX/+HO3atcPp06fxwQcfYMuWLSwXVCA8RKLnOMGTiArLs2fP0LZtW5w+fRpOTk44ePAg6tSpI3UsMlAcwdBjSpVAxJXHAIB65YtKnIaIjNnTp0/Rtm1bREdHq8tFrVq1pI5FBowjGHrs8D9P8PB5KhytLdGmegmp4xCREZs8eTKio6NRvHhxREZGslzQe2PB0GO//nUPANCtflkoLHkMlIh0Z/78+fD29sbBgwdRs2ZNqeOQEeAhEj0Vn5iGiKuvDo/0aVRe4jREZIxSU1NhbW0NALC3t8eOHTskTkTGhCMYeir09H0oVQKfuBRF5ZL2UschIiOTkJCATz/9FHPnzpU6ChkpFgw9pFQJbDl9HwDQpzFHL4hIu548eYLWrVvj/Pnz+OGHH/D06VOpI5ERYsHQQ69P7mxfs7TUcYjIiDx+/BitW7fGhQsXUKpUKURFRaFYsWJSxyIjxDkYeoiTO4lIF7LLxaVLl1C6dGlERkaiatWqUsciI8URDD3DyZ1EpAvx8fFo1aoVLl26hDJlyiAqKorlgnSKIxh6hpM7iUgXwsLCcPnyZXW5qFy5stSRyMixYOgRTu4kIl3x9fVFWloaWrVqxXJBhYIFQ49wcicRaVNcXBysrKxQtOirWw0MGjRI4kRkSjgHQ49s/t/kzu71y3FyJxG9l9jYWLi5uaFdu3Z4/vy51HHIBLFg6Im4F2k4mD25s7GzxGmIyJA9evQIbm5uuHbtGuLj4/Hs2TOpI5EJYsHQE6F/v5rc2cilGD4qwcmdRFQwDx8+hJubG65fv44PP/wQhw4dQoUKFaSORSaIczD0gFIlEPK/yZ29OXpBRAX04MEDtGrVCjdu3MCHH36IqKgouLi4SB2LTBRHMPTA4euc3ElE7+f+/ftwc3PDjRs34OLiwnJBkmPB0AObT3FyJxG9n9TUVKSkpKBChQosF6QXeIhEYpzcSUTaUKVKFURGRsLa2hrly/M6OiQ9jmBIjJM7iaig7t69i4iICPXjqlWrslyQ3mDBkNDrkzt55U4i0sSdO3fg5uaGjh074uDBg1LHIXoDC4aEXp/c6VmzlNRxiMhAZJeLO3fuwNnZmTctI73EgiEhTu4kIk3dvn0brq6uuHv3LipXroyoqCiULVtW6lhEb2DBkAgndxKRpm7dugU3Nzfcu3cPVapUYbkgvcazSAqRSiVw/Oa/eJmeicirTzi5k4jyLfvy3/fv30fVqlURGRmJ0qV53RzSXywYhWjTX3cx9fdLOZZxcicR5UeJEiXQrFkzxMTE4ODBgywXpPdYMAqJEALrTtwFAFQpaQcHhSVcnGzRoRZ/SBDRu1lYWGDDhg14/vw5nJycpI5D9E4sGIXk77vPcOPxS1hbmuO3oU1hr7CUOhIR6bnr169j1apV+O6772BmZgYLCwuWCzIYLBiFZPNfr84Y6VynDMsFEb3TtWvX0KpVK8TGxsLOzg6BgYFSRyLSCM8iKQTPUzKw50IsAKA351wQ0TtcvXpVXS5q1qyJoUOHSh2JSGMcwSgEv0U/REaWCjVKO6BOOUep4xCRHssuF3FxcahVqxYiIiJQvHhxqWMRaYwjGDomhMCv/7ugVu/G5SGTySRORET66sqVK3Bzc0NcXBxq166NgwcPslyQwWLB0LHTd/5/cqd33TJSxyEiPZWWlgYPDw/Ex8ejbt26OHjwICd0kkFjwdCx7NELTu4kordRKBQICgpC48aNER4ejg8++EDqSETvhQVDh54lc3InEb2dEEL9uZeXF44fP85yQUbhvQpGWlqatnIYpe1nObmTiPJ2/vx5NGzYELdu3VIvMzPj331kHDT+l6xSqTBr1iyULVsWdnZ26m+MqVOnYs2aNVoPaKiEENj816srd3JyJxH917lz59C6dWtER0dj3LhxUsch0jqNC8bs2bMRHByM77//HnK5XL28Zs2aWL16tVbDGbLTd57h5pNkTu4kojfExMSgTZs2+Pfff9GwYUP+cUZGSeOCsX79eqxcuRJ9+/aFubm5enmdOnVw9epVrYYzZNmjF5zcSUSvO3v2rLpcfPLJJzhw4ACKFi0qdSwirdO4YDx8+BAfffTRG8tVKhUyMzO1EsrQPUvOwN6LcQB4t1Qi+n/R0dFo06YNnj59ikaNGuHAgQMoUqSI1LGIdELjglGjRg0cOXLkjeXbtm1DvXr1tBLK0L0+ubM2J3cSEV7Nyxo7diyePXuGxo0b488//4SjI38+kPHS+FLh06ZNg5+fHx4+fAiVSoXt27fj2rVrWL9+PXbv3q2LjAaFkzuJKDcymQxbt27FhAkTsHjxYjg4OEgdiUinNB7B6NKlC/744w+Eh4fD1tYW06ZNw5UrV/DHH3+gbdu2ushoUDi5k4he9++//6o/d3Jywpo1a1guyCQU6GZnLVq0wIEDB7SdxShwcicRZTt9+jQ8PDwwb948DBo0SOo4RIVK4xGMihUr5mjk2Z4/f46KFStqJZSh4uROIsp26tQpuLu749mzZ9i0aROUSqXUkYgKlcYF486dO7l+o6Snp+Phw4daCWWofot+wMmdRIS//voLbdu2RWJiIlq0aIE9e/bkOK2fyBTk+xDJrl271J+HhYXlmP2sVCoREREBFxcXrYYzJK/flr0PJ3cSmawTJ07Aw8MDSUlJaNmyJfbs2QM7OzupYxEVunwXDG9vbwCvZkL7+fnl+JqlpSVcXFywcOFCrYYzJKduP1VP7uzCyZ1EJun48ePw9PREUlIS3NzcsHv3btja2kodi0gS+S4YKpUKAFChQgWcPn0aTk5OOgtliHhbdiKKjIxEUlISWrVqhT/++IPlgkyaxmeR3L59Wxc5DBondxIRAEyePBllypSBj48PbGxspI5DJKkC3Rc4OTkZe/fuxYoVK/Djjz/m+NBUUFAQXFxcoFAo0LhxY5w6deqt6z9//hzDhw9H6dKlYWVlhSpVqmDv3r0FeRtawyt3Epmu6OhoJCcnA3h1CNnf35/lgggFGME4e/YsOnTogJSUFCQnJ6NYsWJISEiAjY0NSpQogVGjRuX7uUJCQhAQEIAVK1agcePGWLJkCTw8PHDt2jWUKFHijfUzMjLQtm1blChRAtu2bUPZsmVx9+5dya/lf+nRCwCAZ81SnNxJZEIOHz6MDh06oFGjRti9ezeLBdFrNB7BGDNmDLy8vPDs2TNYW1vj5MmTuHv3Lho0aIAFCxZo9FyLFi3CwIED4e/vjxo1amDFihWwsbHB2rVrc11/7dq1ePr0KXbu3IlmzZrBxcUFrq6uqFOnjqZvQyesLAo0IEREBujQoUNo3749kpOTYWlpyT8uiP5D49+IMTExGDt2LMzMzGBubo709HQ4Ozvj+++/x+TJk/P9PBkZGThz5gzc3d3/P4yZGdzd3XHixIlct9m1axeaNGmC4cOHo2TJkqhZsybmzJnz1gvYpKenIzExMccHEdH7iIqKUo/kenh4YOfOnbC2tpY6FpFe0bhgWFpawszs1WYlSpTAvXuvzp5wdHTE/fv38/08CQkJUCqVKFmyZI7lJUuWRFxcXK7b3Lp1C9u2bYNSqcTevXsxdepULFy4ELNnz87zdebOnQtHR0f1h7Ozc74zEhH918GDB9XlwtPTk+WCKA8az8GoV68eTp8+jcqVK8PV1RXTpk1DQkICNmzYgJo1a+oio5pKpUKJEiWwcuVKmJubo0GDBnj48CHmz5+PwMDAXLeZNGkSAgIC1I8TExNZMoioQA4ePIhOnTohNTUV7du3x/bt26FQKKSORaSXNC4Yc+bMQVJSEgDg22+/ha+vL4YOHYrKlStjzZo1+X4eJycnmJubIz4+Psfy+Ph4lCpVKtdtSpcuDUtLyxyX3K1evTri4uKQkZEBuVz+xjZWVlawsrLKdy4iorwUKVIECoUCrVu3xm+//cafLURvoXHBaNiwofrzEiVKYP/+/QV6YblcjgYNGiAiIkJ9lVCVSoWIiAiMGDEi122aNWuGzZs3Q6VSqQ/TXL9+HaVLl861XBARaVP9+vVx/PhxVKhQgeWC6B20dtpDdHQ0OnXqpNE2AQEBWLVqFdatW4crV65g6NChSE5Ohr+/PwDA19cXkyZNUq8/dOhQPH36FKNHj8b169exZ88ezJkzB8OHD9fW2yAiyuHPP//E8ePH1Y+rVavGckGUDxqNYISFheHAgQOQy+UYMGAAKlasiKtXr2LixIn4448/4OHhodGL+/j44MmTJ5g2bRri4uJQt25d7N+/Xz3x8969e+qRCgBwdnZGWFgYxowZg9q1a6Ns2bIYPXo0JkyYoNHrEhHlx/79++Ht7Q25XI4TJ07g448/ljoSkcHId8FYs2YNBg4ciGLFiuHZs2dYvXo1Fi1ahJEjR8LHxwcXL15E9erVNQ4wYsSIPA+JREVFvbGsSZMmOHnypMavQ0SkiX379qFr165IT09H+/btUblyZakjERmUfB8i+eGHH/Ddd98hISEBoaGhSEhIwLJly3DhwgWsWLGiQOWCiEgf7d27F97e3khPT0fXrl0RGhrKeV5EGsp3wbh58yZ69OgBAOjWrRssLCwwf/58lCtXTmfhiIgK2+7du9G1a1dkZGSge/fuCAkJgaUl75BMpKl8F4zU1FT1dfZlMhmsrKxQunRpnQUjIipsx48fR7du3ZCRkYHPPvsMv/76K8sFUQFpNMlz9erVsLOzAwBkZWUhODgYTk5OOdbR5GZnRET6pH79+nB3d4ednR02bdrEckH0HvJdMMqXL49Vq1apH5cqVQobNmzIsY5MJmPBICKDpVAosH37dlhYWMDCQuPLBBHRa/L9HXTnzh0dxiAiksaOHTtw8uRJzJs3DzKZjJf+JtISVnQiMlnbt2+Hj48PsrKyULduXfTu3VvqSERGQ2tX8iQiMiTbtm1Dz549kZWVhb59+6rPkiMi7WDBICKTs3XrVvTq1QtKpRL9+vXDunXrOOeCSMtYMIjIpISEhKB3795QKpXw9fXFL7/8kuMOzUSkHSwYRGQy7t+/j379+kGpVMLPzw9r165luSDSkQIVjJs3b2LKlCno3bs3Hj9+DODVdfsvXbqk1XBERNrk7OyM1atXo3///lizZg3LBZEOaVwwDh06hFq1auGvv/7C9u3b8fLlSwDAuXPnEBgYqPWARETvKzMzU/25r68vVq9ezXJBpGMaF4yJEydi9uzZ6tu2Z2vdujXvckpEemfjxo2oV68e4uLipI5CZFI0LhgXLlxA165d31heokQJJCQkaCUUEZE2bNiwAX5+frh06RJWrlwpdRwik6JxwShSpAhiY2PfWH727FmULVtWK6GIiN7XunXr4OfnB5VKhcGDB2PKlClSRyIyKRoXjF69emHChAmIi4uDTCaDSqXCsWPHMG7cOPj6+uoiIxGRRoKDg+Hv7w8hBIYMGYJly5bBzIwnzREVJo2/4+bMmYNq1arB2dkZL1++RI0aNdCyZUs0bdqUfyEQkeR++eUXfPnllxBCYNiwYSwXRBLR+NJ1crkcq1atwtSpU3Hx4kW8fPkS9erVQ+XKlXWRj4go39LS0jB37lwIITB8+HAsXboUMplM6lhEJknjgnH06FE0b94c5cuXR/ny5XWRiYioQBQKBSIiIrBu3Tp88803LBdEEtJ43LB169aoUKECJk+ejMuXL+siExGRRm7fvq3+3NnZGVOmTGG5IJKYxgXj0aNHGDt2LA4dOoSaNWuibt26mD9/Ph48eKCLfEREb/Xzzz+jSpUqCA0NlToKEb1G44Lh5OSEESNG4NixY7h58yZ69OiBdevWwcXFBa1bt9ZFRiKiXC1fvhxDhgxBVlYWTp8+LXUcInrNe02trlChAiZOnIh58+ahVq1aOHTokLZyERG91bJlyzBs2DAAwNixY/H9999LnIiIXlfggnHs2DEMGzYMpUuXRp8+fVCzZk3s2bNHm9mIiHL1008/Yfjw4QCAr7/+GvPnz+ecCyI9o/FZJJMmTcKWLVvw6NEjtG3bFj/88AO6dOkCGxsbXeQjIsph6dKlGDVqFABg/PjxmDdvHssFkR7SuGAcPnwYX3/9NXr27AknJyddZCIiytO1a9cAvLrx4pw5c1guiPSUxgXj2LFjushBRJQvS5cuRbt27eDl5cVyQaTH8lUwdu3ahfbt28PS0hK7du1667qdO3fWSjAiomy///472rdvD7lcDplMxp8zRAYgXwXD29sbcXFxKFGiBLy9vfNcTyaTQalUaisbEREWLlyIcePGwdvbG9u2bYO5ubnUkYgoH/JVMFQqVa6fExHp0vz58zF+/HgAQO3atXnTMiIDovF36/r165Genv7G8oyMDKxfv14roYiIvvvuO3W5CAwMxIwZMzjngsiAaFww/P398eLFizeWJyUlwd/fXyuhiMi0zZs3DxMnTgQATJ8+HdOnT5c2EBFpTOOzSIQQuf4V8eDBAzg6OmolFBGZrvnz52PSpEkAgJkzZ2Lq1KkSJyKigsh3wahXrx5kMhlkMhnatGkDC4v/31SpVOL27dvw9PTUSUgiMh2NGjWCjY0NJk2ahClTpkgdh4gKKN8FI/vskZiYGHh4eMDOzk79NblcDhcXF3Tv3l3rAYnItLi6uuLKlSsoX7681FGI6D3ku2AEBgYCAFxcXODj4wOFQqGzUERkWhYsWABPT0/UrFkTAFguiIyAxpM8/fz8WC6ISGumT5+Or7/+Gq1bt8a///4rdRwi0pJ8jWAUK1YM169fh5OTE4oWLfrWU8WePn2qtXBEZLyEEJg+fTpmzpwJ4NWNyz744AOJUxGRtuSrYCxevBj29vbqz3kuOhG9DyEEpk2bhtmzZwN4dYhk7NixEqciIm3KV8Hw8/NTf/7FF1/oKgsRmQAhBKZOnYpvv/0WALBo0SKMGTNG4lREpG0az8GIjo7GhQsX1I9///13eHt7Y/LkycjIyNBqOCIyPqtXr1aXi8WLF7NcEBkpjQvG4MGDcf36dQDArVu34OPjAxsbG2zdulV9WV8iorz06tULzZo1w5IlS/DVV19JHYeIdETjK3lev34ddevWBQBs3boVrq6u2Lx5M44dO4ZevXphyZIlWo5IRIbu9SsA29vbIyoqKsfF+ojI+Gg8giGEUN9RNTw8HB06dAAAODs7IyEhQbvpiMjgCSHw9ddfY+7cueplLBdExk/j7/KGDRti9uzZcHd3x6FDh7B8+XIAwO3bt1GyZEmtByQiwyWEwLhx47Bo0SIAgKenJ+rVqydxKiIqDBqPYCxZsgTR0dEYMWIEvvnmG3z00UcAgG3btqFp06ZaD0hEhkkIgYCAAHW5WL58OcsFkQnReASjdu3aOc4iyTZ//nyYm5trJRQRGTYhBMaMGYMffvgBAPDzzz9j0KBBEqciosJU4AOhZ86cwZUrVwAANWrUQP369bUWiogMlxACo0ePxtKlSwEAK1euxMCBAyVORUSFTeOC8fjxY/j4+ODQoUMoUqQIAOD58+do1aoVtmzZguLFi2s7IxEZkEOHDmHp0qWQyWRYtWoV+vfvL3UkIpKAxnMwRo4ciZcvX+LSpUt4+vQpnj59iosXLyIxMRGjRo3SRUYiMiBubm5YsmQJVq9ezXJBZMI0HsHYv38/wsPDUb16dfWyGjVqICgoCO3atdNqOCIyDCqVCsnJyep7Fo0ePVriREQkNY1HMFQqFSwtLd9Ybmlpqb4+BhGZDpVKhWHDhqFVq1Z4/vy51HGISE9oXDBat26N0aNH49GjR+plDx8+xJgxY9CmTRuthiMi/aZSqTBkyBD8/PPPiI6OxuHDh6WORER6QuOC8dNPPyExMREuLi6oVKkSKlWqhAoVKiAxMVE9a5yIjJ9KpcLgwYOxatUqmJmZYf369ejcubPUsYhIT2g8B8PZ2RnR0dGIiIhQn6ZavXp1uLu7az0cEeknlUqFgQMHYu3atepy0bdvX6ljEZEe0ahghISEYNeuXcjIyECbNm0wcuRIXeUiIj2lUqkwYMAA/PLLLzAzM8OGDRvQp08fqWMRkZ7Jd8FYvnw5hg8fjsqVK8Pa2hrbt2/HzZs3MX/+fF3mIyI9Exsbi/3798PMzAybNm1Cr169pI5ERHoo33MwfvrpJwQGBuLatWuIiYnBunXrsGzZMl1mIyI9VLZsWURGRmLr1q0sF0SUp3wXjFu3bsHPz0/9uE+fPsjKykJsbKxOghGR/lAqlYiJiVE/rlq1Krp16yZdICLSe/kuGOnp6bC1tf3/Dc3MIJfLkZqaqpNgRKQflEolvvjiC3z66acICwuTOg4RGQiNJnlOnToVNjY26scZGRn49ttv4ejoqF6WfWtmIjJ8WVlZ8PPzw+bNm2FhYYGXL19KHYmIDES+C0bLli1x7dq1HMuaNm2KW7duqR/LZDLtJSMiSWVlZcHX1xe//vorLCwsEBISwsMiRJRv+S4YUVFROoxBRPokKysLn3/+OUJCQmBhYYHQ0FB07dpV6lhEZEA0vtAWERm3rKws9O3bF6GhobC0tMTWrVvRpUsXqWMRkYFhwSCiN5ibm8PS0hLbtm3j5b+JqEA0vhcJERk3CwsLrF+/HseOHWO5IKICY8EgImRmZmLZsmVQKpUAXpWMTz75ROJURGTIWDCITFxGRgZ8fHwwfPhwDB8+XOo4RGQkClQwjhw5gs8//xxNmjTBw4cPAQAbNmzA0aNHtRqOiHQru1zs2LEDVlZWnMxJRFqjccH47bff4OHhAWtra5w9exbp6ekAgBcvXmDOnDlaD0hEupGRkYEePXpg586dsLKyws6dO9G+fXupYxGRkdC4YMyePRsrVqzAqlWrYGlpqV7erFkzREdHazUcEelGeno6PvvsM+zatQsKhQK7du2Cp6en1LGIyIhofJrqtWvX0LJlyzeWOzo64vnz59rIREQ61rdvX/zxxx/qctG2bVupIxGRkdF4BKNUqVK4cePGG8uPHj2KihUrFihEUFAQXFxcoFAo0LhxY5w6dSpf223ZsgUymQze3t4Fel0iU+Xn5wdHR0f88ccfLBdEpBMaF4yBAwdi9OjR+OuvvyCTyfDo0SNs2rQJ48aNw9ChQzUOEBISgoCAAAQGBiI6Ohp16tSBh4cHHj9+/Nbt7ty5g3HjxqFFixYavyaRqfPy8sKdO3fg7u4udRQiMlIaF4yJEyeiT58+aNOmDV6+fImWLVtiwIABGDx4MEaOHKlxgEWLFmHgwIHw9/dHjRo1sGLFCtjY2GDt2rV5bqNUKtG3b1/MmDGjwKMmRKYkLS0N/fv3z3FzwiJFikgXiIiMnsYFQyaT4ZtvvsHTp09x8eJFnDx5Ek+ePMGsWbM0fvGMjAycOXMmx19RZmZmcHd3x4kTJ/LcbubMmShRogT69+//ztdIT09HYmJijg8iU5KamoouXbpg7dq16NSpk/piWkREulTge5HI5XLUqFHjvV48ISEBSqUSJUuWzLG8ZMmSuHr1aq7bHD16FGvWrEFMTEy+XmPu3LmYMWPGe+UkMlTZ5eLAgQOwtbXFihUrYG5uLnUsIjIBGheMVq1aQSaT5fn1gwcPvlegt0lKSkK/fv2watUqODk55WubSZMmISAgQP04MTERzs7OuopIpDdSUlLQpUsXhIeHw9bWFvv27eOcJSIqNBoXjLp16+Z4nJmZiZiYGFy8eBF+fn4aPZeTkxPMzc0RHx+fY3l8fDxKlSr1xvo3b97EnTt34OXlpV6mUqkAvLp3wrVr11CpUqUc21hZWcHKykqjXESGLiUlBZ07d0ZERATs7Oywb98+NG/eXOpYRGRCNC4YixcvznX59OnT8fLlS42eSy6Xo0GDBoiIiFCfaqpSqRAREYERI0a8sX61atVw4cKFHMumTJmCpKQk/PDDDxyZIPqf8ePHq8vF/v370axZM6kjEZGJKfAcjP/6/PPP0ahRIyxYsECj7QICAuDn54eGDRuiUaNGWLJkCZKTk+Hv7w8A8PX1RdmyZTF37lwoFArUrFkzx/bZM+H/u5zIlE2fPh3nzp3Dd999h6ZNm0odh4hMkNYKxokTJ6BQKDTezsfHB0+ePMG0adMQFxeHunXrYv/+/eqJn/fu3YOZGW/6SvQuSqVSPYHTyckJhw8ffut8KSIiXdK4YHTr1i3HYyEEYmNj8ffff2Pq1KkFCjFixIhcD4kAQFRU1Fu3DQ4OLtBrEhmTly9folOnTujduzcGDx4MACwXRCQpjQuGo6NjjsdmZmaoWrUqZs6ciXbt2mktGBHlT1JSEjp06ICjR4/i3Llz6N69e77PsiIi0hWNCoZSqYS/vz9q1aqFokWL6ioTEeVTUlIS2rdvj2PHjsHR0RFhYWEsF0SkFzSa3GBubo527drxrqlEeiAxMRGenp7qcnHgwAE0atRI6lhERAAKcKnwmjVr5rifAREVvuxycfz4cRQpUgTh4eH45JNPpI5FRKSmccGYPXs2xo0bh927dyM2Npb3+SCSQGhoKE6cOIGiRYsiPDwcDRs2lDoSEVEO+Z6DMXPmTIwdOxYdOnQAAHTu3DnHLHUhBGQyGW+kRFQI+vfvjydPnsDDwwP169eXOg4R0RvyXTBmzJiBIUOGIDIyUpd5iCgPL168gIWFBWxtbSGTyTBp0iSpIxER5SnfBUMIAQBwdXXVWRgiyt3z58/Rrl072NnZYffu3bCxsZE6EhHRW2k0B4MX7iEqfM+ePUPbtm1x+vRpnD9/Hvfu3ZM6EhHRO2l0HYwqVaq8s2Q8ffr0vQIR0f97+vQp2rZti+joaDg5OSEiIgLVqlWTOhYR0TtpVDBmzJjxxpU8iUg3nj59Cnd3d5w9exZOTk44ePAgatWqJXUsIqJ80ahg9OrVCyVKlNBVFiL6n3///Rfu7u6IiYlB8eLFcfDgQd4xmIgMSr7nYHD+BVHhefToEe7evYsSJUogMjKS5YKIDI7GZ5EQke7VqlUL4eHhUCgUqFGjhtRxiIg0lu+CoVKpdJmDyOQlJCTg9u3b6kt+8wJaRGTINL5UOBFp35MnT9C6dWu0adMGJ0+elDoOEdF7Y8Egktjjx4/RunVrXLhwAXZ2dihatKjUkYiI3ptGZ5EQkXZll4tLly6hTJkyiIyMRJUqVaSORUT03jiCQSSR+Ph4tGrVCpcuXULZsmURFRXFckFERoMjGEQSePLkCVq1aoUrV66oy8VHH30kdSwiIq1hwSCSgL29PVxcXJCUlITIyEiWCyIyOiwYRBJQKBTYvn07Hj9+jPLly0sdh4hI6zgHg6iQPHr0CN999536onUKhYLlgoiMFkcwiArBw4cP0apVK/zzzz9QqVSYNGmS1JGIiHSKIxhEOvbgwQO4ubnhn3/+wYcffojevXtLHYmISOdYMIh06P79+3Bzc8ONGzfg4uKCQ4cOwcXFRepYREQ6x4JBpCPZ5eLmzZuoUKECoqKi8OGHH0odi4ioULBgEOlAeno62rRpg1u3bqFixYosF0RkclgwiHTAysoK06ZNQ5UqVRAVFcWzRYjI5LBgEOnI559/jvPnz8PZ2VnqKEREhY4Fg0hLbt++DU9PT8TGxqqXWVlZSZiIiEg6LBhEWnDr1i24ubkhLCwMQ4YMkToOEZHkWDCI3tPNmzfh5uaGe/fuoUqVKli+fLnUkYiIJMcreRK9h+xy8eDBA1StWhWRkZEoXbq01LGIiCTHEQyiArpx4wZcXV3x4MEDVKtWDVFRUSwXRET/w4JBVEADBgzAw4cPUb16dURGRqJUqVJSRyIi0hssGEQFtGHDBnh5ebFcEBHlgnMwiDSQmpoKa2trAICzszN27dolcSIiIv3EEQyifLp27RqqVq2K0NBQqaMQEek9FgyifLh69Src3Nxw//59zJs3D1lZWVJHIiLSaywYRO9w5coVuLm5IS4uDrVr18aff/4JCwseXSQiehsWDKK3uHz5Mtzc3BAfH486deogIiICTk5OUsciItJ7LBhEebh06RJatWqFx48fo27duiwXREQaYMEgysPmzZvx+PFj1KtXDxEREfjggw+kjkREZDB4IJkoD7Nnz0aRIkXQv39/FCtWTOo4REQGhSMYRK+5ceMGMjIyAAAymQxff/01ywURUQGwYBD9z7lz5/Dpp5+iZ8+e6pJBREQFw4JBBCAmJgatW7fGv//+i0ePHiE1NVXqSEREBo0Fg0ze2bNn0aZNGzx9+hSNGzfGgQMH4OjoKHUsIiKDxoJBJi06OlpdLj799FOEhYWxXBARaQELBpmsM2fOoE2bNnj27BmaNGnCckFEpEUsGGSykpOTkZGRgaZNm2L//v1wcHCQOhIRkdHgdTDIZLVs2RKRkZGoXr067O3tpY5DRGRUWDDIpJw6dQoKhQK1a9cGADRq1EjiRERExomHSMhknDx5Em3btkWbNm1w9epVqeMQERk1FgwyCSdOnEC7du2QmJiIGjVqoFy5clJHIiIyaiwYZPSOHz8ODw8PJCUlwdXVFXv37oWdnZ3UsYiIjBoLBhm1Y8eOqcuFm5sb9uzZA1tbW6ljEREZPRYMMlpnzpyBp6cnXr58idatW7NcEBEVIp5FQkarSpUqqFOnDhQKBXbt2gUbGxupIxERmQwWDDJa9vb22LdvH8zNzVkuiIgKGQ+RkFE5dOgQ5s+fr35sb2/PckFEJAGOYJDRiIyMRKdOnZCSkoLy5cvDx8dH6khERCaLIxhkFA4ePIiOHTsiJSUFnp6e6NKli9SRiIhMGgsGGbyIiAh06tQJqamp6NChA3bs2AGFQiF1LCIik8ZDJGTQwsPD4eXlhbS0NHTo0AHbt2+HlZWV1LGIiEweRzDIYD18+BCdO3dGWloaOnbsyHJBRKRHOIJBBqts2bKYN28ewsPDsXXrVpYLIiI9whEMMjhCCPXno0aNws6dO1kuiIj0DAsGGZR9+/ahRYsWePbsmXqZmRn/GRMR6Rv+ZCaDsXfvXnh7e+PYsWM5LqZFRET6hwWDDMLu3bvRtWtXZGRkoHv37pgxY4bUkYiI6C1YMEjv/fHHH+jWrRsyMjLw2Wef4ddff4WlpaXUsYiI6C30omAEBQXBxcUFCoUCjRs3xqlTp/Jcd9WqVWjRogWKFi2KokWLwt3d/a3rk2HbtWsXunfvjszMTPTo0QObN29muSAiMgCSF4yQkBAEBAQgMDAQ0dHRqFOnDjw8PPD48eNc14+KikLv3r0RGRmJEydOwNnZGe3atcPDhw8LOTnpWnp6OkaPHo3MzEz4+PiwXBARGRDJC8aiRYswcOBA+Pv7o0aNGlixYgVsbGywdu3aXNfftGkThg0bhrp166JatWpYvXo1VCoVIiIiCjk56ZqVlRXCwsIwcuRIbNy4ERYWvGwLEZGhkLRgZGRk4MyZM3B3d1cvMzMzg7u7O06cOJGv50hJSUFmZiaKFSuW69fT09ORmJiY44P0W0JCgvrzKlWq4Mcff2S5ICIyMJIWjISEBCiVSpQsWTLH8pIlSyIuLi5fzzFhwgSUKVMmR0l53dy5c+Ho6Kj+cHZ2fu/cpDvbtm1DhQoVEBYWJnUUIiJ6D5IfInkf8+bNw5YtW95698xJkybhxYsX6o/79+8XckrKr61bt6JXr154+fIltm3bJnUcIiJ6D5KOOzs5OcHc3Bzx8fE5lsfHx6NUqVJv3XbBggXq+1DUrl07z/WsrKx4GWkDEBoaij59+kCpVMLX1xcrVqyQOhIREb0HSUcw5HI5GjRokGOCZvaEzSZNmuS53ffff49Zs2Zh//79aNiwYWFEJR3asmWLulz4+flh7dq1MDc3lzoWERG9B8lnzgUEBMDPzw8NGzZEo0aNsGTJEiQnJ8Pf3x8A4Ovri7Jly2Lu3LkAgO+++w7Tpk3D5s2b4eLiop6rYWdnBzs7O8neBxXMr7/+is8//xwqlQr+/v5YtWoVywURkRGQvGD4+PjgyZMnmDZtGuLi4lC3bl3s379fPfHz3r17OW5mtXz5cvUVHV8XGBiI6dOnF2Z00oJ9+/ZBpVLhyy+/xKpVq3jjMiIiIyF5wQCAESNGYMSIEbl+LSoqKsfjO3fu6D4QFZq1a9fC1dUV/v7+LBdEREaEP9Gp0B09ehRKpRIAYGFhgf79+7NcEBEZGf5Up0K1bt06tGzZEv3791eXDCIiMj4sGFRogoOD4e/vDyEErK2tIZPJpI5EREQ6woJBhWLt2rX48ssvIYTA0KFDERQUxMMiRERGjD/hSefWrFmDAQMGQAiBYcOGsVwQEZkA/pQnnXq9XIwYMQI//fQTD40QEZkAvThNlYxXiRIlYGlpiaFDh2LJkiUsF0REJoIFg3TKy8sLZ86cQc2aNVkuiIhMCA+RkNatW7cON2/eVD+uVasWywURkYlhwSCtWrZsGb744gu0atUKCQkJUschIiKJsGCQ1gQFBWH48OEAXt1j5oMPPpA4ERERSYUFg7Ri6dKl6vvJjB8/Ht9//z0PixARmTAWDHpvP/74I0aNGgUAmDBhAubNm8dyQURk4lgw6L1s3LgRo0ePBgBMmjQJc+fOZbkgIiKepkrvx9PTE7Vr14aXlxdmzZrFckFERABYMOg9OTk54fjx47CxsWG5ICIiNR4iIY3Nnz8fK1asUD+2tbVluSAiohw4gkEa+e677zBx4kQAwCeffIIGDRpInIiIiPQRRzAo3+bNm6cuFzNmzGC5ICKiPLFgUL7MmTMHkyZNAgDMmjUL06ZNkzgRERHpMx4ioXf69ttvMWXKFPXnkydPljgRERHpOxYMeqvDhw+ry8XroxhERERvw4JBb9WyZUtMmzYNNjY2mDBhgtRxiIjIQLBg0BuEEMjMzIRcLgfwakInERGRJjjJk3IQQiAwMBAeHh5ISUmROg4RERkoFgxSE0Jg2rRpmDVrFqKiorB7926pIxERkYHiIRIC8KpcTJkyBXPmzAEALFq0CD179pQ4FRERGSoWDIIQApMnT8a8efMAAIsXL8ZXX30lbSgiIjJoLBgmTgiBSZMm4bvvvgMA/PDDDxg1apTEqYiIyNCxYJi4R48eYeXKlQCApUuXYsSIERInIiIiY8CCYeLKli2LiIgI/P333xg4cKDUcYiIyEiwYJggIQTu3LmDChUqAADq1auHevXqSZyKiIiMCU9TNTFCCIwdOxZ16tTBiRMnpI5DRERGigXDhAghMGbMGCxevBhJSUm4dOmS1JGIiMhI8RCJiRBCYPTo0Vi6dCkAYOXKlRgwYIDEqYiIyFixYJgAIQRGjhyJoKAgAMCqVatYLoiISKdYMIycEAIjRozAsmXLIJPJsHr1anz55ZdSxyIiIiPHgmHkMjMzcefOHchkMqxZswb+/v5SRyIiIhPAgmHk5HI5fvvtNxw6dAgeHh5SxyEiIhPBs0iMkEqlwtatWyGEAAAoFAqWCyIiKlQsGEZGpVJhyJAh6NmzJ8aPHy91HCIiMlE8RGJEVCoVBg0ahDVr1sDMzAx169aVOhIREZkoFgwjoVKpMHDgQKxduxZmZmbYsGED+vTpI3UsIiIyUSwYRkCpVGLAgAEIDg6GmZkZNm3ahF69ekkdi4iITBjnYBiBQYMGITg4GObm5ti8eTPLBRERSY4Fwwi0atUKcrkcmzdvho+Pj9RxiIiIeIjEGHz++edwdXWFs7Oz1FGIiIgAcATDIGVlZWHixImIjY1VL2O5ICIifcKCYWCysrLg6+uL7777Dh4eHsjKypI6EhER0Rt4iMSAZGVloV+/ftiyZQssLCwwc+ZMWFjwfyEREekf/nYyEFlZWejbty9CQ0NhaWmJrVu3okuXLlLHIiIiyhULhgHIzMxE3759sXXrVlhaWuK3336Dl5eX1LGIiIjyxDkYBmDChAnYunUr5HI5tm/fznJBRER6jwXDAAQEBODjjz/G9u3b0alTJ6njEBERvRMPkegpIQRkMhkAoFy5coiJieGETiIiMhgcwdBDGRkZ6NGjB0JCQtTLWC6IiMiQsGDomfT0dHz22Wf47bff0L9/fzx58kTqSERERBrjn8V6JLtc7N69GwqFAtu3b0fx4sWljkVERKQxFgw9kZ6eju7du2PPnj1QKBTYtWsX2rZtK3UsIiKiAmHB0ANpaWno3r079u7dC4VCgT/++APu7u5SxyIiIiowzsHQA+vWrcPevXthbW2N3bt3s1wQEZHB4wiGHhg0aBCuX7+Ojh07onXr1lLHISIiem8sGBJJTU2Fubk55HI5ZDIZFi5cKHUkIiIireEhEgmkpqaiS5cu6NmzJzIyMqSOQ0REpHUcwShkKSkp6NKlC8LDw2Fra4urV6+idu3aUsciIiLSKhaMQpSSkgIvLy8cPHgQtra22LdvH8sFEREZJR4iKSTJycno1KkTDh48CDs7O+zfvx8tWrSQOhYREZFOcASjEGSXi6ioKNjb22P//v1o2rSp1LGIiIh0hgWjEFy9ehWnT5+Gvb09wsLC0KRJE6kjERER6RQLRiFo0KAB9uzZA7lcznJBREQmgQVDR16+fIkHDx6gWrVqAABXV1eJExERERUeTvLUgaSkJLRv3x4tWrTAhQsXpI5DRERU6FgwtCwxMRGenp44evQoMjMzkZaWJnUkIiKiQqcXBSMoKAguLi5QKBRo3LgxTp069db1t27dimrVqkGhUKBWrVrYu3dvISV9u7T0dHh6euL48eMoUqQIwsPD8cknn0gdi4iIqNBJXjBCQkIQEBCAwMBAREdHo06dOvDw8MDjx49zXf/48ePo3bs3+vfvj7Nnz8Lb2xve3t64ePFiISd/0+pVq3DixAkULVoU4eHhaNiwodSRiIiIJCETQggpAzRu3BiffPIJfvrpJwCASqWCs7MzRo4ciYkTJ76xvo+PD5KTk7F79271sk8//RR169bFihUr3vl6iYmJcHR0xIsXL+Dg4KCV9zBy42n8cfExnkWuhfk/kQgPD0f9+vW18txERET6QpPfoZKOYGRkZODMmTNwd3dXLzMzM4O7uztOnDiR6zYnTpzIsT4AeHh45Ll+eno6EhMTc3xom0z26r/WNjaIiIhguSAiIpMnacFISEiAUqlEyZIlcywvWbIk4uLict0mLi5Oo/Xnzp0LR0dH9Yezs7N2wr+mcqkiqFfOAVPHjkS9evW0/vxERESGxuivgzFp0iQEBASoHycmJmq9ZIxsUxkj21TW6nMSEREZMkkLhpOTE8zNzREfH59jeXx8PEqVKpXrNqVKldJofSsrK1hZWWknMBEREeWLpIdI5HI5GjRogIiICPUylUqFiIiIPC+p3aRJkxzrA8CBAwd4CW4iIiI9IvkhkoCAAPj5+aFhw4Zo1KgRlixZguTkZPj7+wMAfH19UbZsWcydOxcAMHr0aLi6umLhwoXo2LEjtmzZgr///hsrV66U8m0QERHRayQvGD4+Pnjy5AmmTZuGuLg41K1bF/v371dP5Lx37x7MzP5/oKVp06bYvHkzpkyZgsmTJ6Ny5crYuXMnatasKdVbICIiov+Q/DoYhU0X18EgIiIyBQZzHQwiIiIyTiwYREREpHUsGERERKR1LBhERESkdSwYREREpHUsGERERKR1LBhERESkdSwYREREpHUsGERERKR1LBhERESkdSwYREREpHUsGERERKR1LBhERESkdZLfrr2wZd88NjExUeIkREREhiX7d2d+bsRucgUjKSkJAODs7CxxEiIiIsOUlJQER0fHt64jE/mpIUZEpVLh0aNHsLe3h0wm08pzJiYmwtnZGffv34eDg4NWntPUcZ9qH/epdnF/ah/3qXbpYn8KIZCUlIQyZcrAzOztsyxMbgTDzMwM5cqV08lzOzg48JtCy7hPtY/7VLu4P7WP+1S7tL0/3zVykY2TPImIiEjrWDCIiIhI61gwtMDKygqBgYGwsrKSOorR4D7VPu5T7eL+1D7uU+2Sen+a3CRPIiIi0j2OYBAREZHWsWAQERGR1rFgEBERkdaxYBAREZHWsWDkU1BQEFxcXKBQKNC4cWOcOnXqretv3boV1apVg0KhQK1atbB3795CSmo4NNmnq1atQosWLVC0aFEULVoU7u7u7/x/YGo0/TeabcuWLZDJZPD29tZtQAOk6T59/vw5hg8fjtKlS8PKygpVqlTh9/5rNN2fS5YsQdWqVWFtbQ1nZ2eMGTMGaWlphZRW/x0+fBheXl4oU6YMZDIZdu7c+c5toqKiUL9+fVhZWeGjjz5CcHCw7gIKeqctW7YIuVwu1q5dKy5duiQGDhwoihQpIuLj43Nd/9ixY8Lc3Fx8//334vLly2LKlCnC0tJSXLhwoZCT6y9N92mfPn1EUFCQOHv2rLhy5Yr44osvhKOjo3jw4EEhJ9dPmu7PbLdv3xZly5YVLVq0EF26dCmcsAZC032anp4uGjZsKDp06CCOHj0qbt++LaKiokRMTEwhJ9dPmu7PTZs2CSsrK7Fp0yZx+/ZtERYWJkqXLi3GjBlTyMn11969e8U333wjtm/fLgCIHTt2vHX9W7duCRsbGxEQECAuX74sli5dKszNzcX+/ft1ko8FIx8aNWokhg8frn6sVCpFmTJlxNy5c3Ndv2fPnqJjx445ljVu3FgMHjxYpzkNiab79L+ysrKEvb29WLduna4iGpSC7M+srCzRtGlTsXr1auHn58eC8R+a7tPly5eLihUrioyMjMKKaFA03Z/Dhw8XrVu3zrEsICBANGvWTKc5DVV+Csb48ePFxx9/nGOZj4+P8PDw0EkmHiJ5h4yMDJw5cwbu7u7qZWZmZnB3d8eJEydy3ebEiRM51gcADw+PPNc3NQXZp/+VkpKCzMxMFCtWTFcxDUZB9+fMmTNRokQJ9O/fvzBiGpSC7NNdu3ahSZMmGD58OEqWLImaNWtizpw5UCqVhRVbbxVkfzZt2hRnzpxRH0a5desW9u7diw4dOhRKZmNU2L+bTO5mZ5pKSEiAUqlEyZIlcywvWbIkrl69mus2cXFxua4fFxens5yGpCD79L8mTJiAMmXKvPHNYooKsj+PHj2KNWvWICYmphASGp6C7NNbt27h4MGD6Nu3L/bu3YsbN25g2LBhyMzMRGBgYGHE1lsF2Z99+vRBQkICmjdvDiEEsrKyMGTIEEyePLkwIhulvH43JSYmIjU1FdbW1lp9PY5gkMGZN28etmzZgh07dkChUEgdx+AkJSWhX79+WLVqFZycnKSOYzRUKhVKlCiBlStXokGDBvDx8cE333yDFStWSB3NIEVFRWHOnDlYtmwZoqOjsX37duzZswezZs2SOhrlE0cw3sHJyQnm5uaIj4/PsTw+Ph6lSpXKdZtSpUpptL6pKcg+zbZgwQLMmzcP4eHhqF27ti5jGgxN9+fNmzdx584deHl5qZepVCoAgIWFBa5du4ZKlSrpNrSeK8i/0dKlS8PS0hLm5ubqZdWrV0dcXBwyMjIgl8t1mlmfFWR/Tp06Ff369cOAAQMAALVq1UJycjIGDRqEb775BmZm/PtYU3n9bnJwcND66AXAEYx3ksvlaNCgASIiItTLVCoVIiIi0KRJk1y3adKkSY71AeDAgQN5rm9qCrJPAeD777/HrFmzsH//fjRs2LAwohoETfdntWrVcOHCBcTExKg/OnfujFatWiEmJgbOzs6FGV8vFeTfaLNmzXDjxg11WQOA69evo3Tp0iZdLoCC7c+UlJQ3SkR2eRO8hVaBFPrvJp1MHTUyW7ZsEVZWViI4OFhcvnxZDBo0SBQpUkTExcUJIYTo16+fmDhxonr9Y8eOCQsLC7FgwQJx5coVERgYyNNU/0PTfTpv3jwhl8vFtm3bRGxsrPojKSlJqregVzTdn//Fs0jepOk+vXfvnrC3txcjRowQ165dE7t37xYlSpQQs2fPluot6BVN92dgYKCwt7cXv/76q7h165b4888/RaVKlUTPnj2legt6JykpSZw9e1acPXtWABCLFi0SZ8+eFXfv3hVCCDFx4kTRr18/9frZp6l+/fXX4sqVKyIoKIinqeqDpUuXivLlywu5XC4aNWokTp48qf6aq6ur8PPzy7F+aGioqFKlipDL5eLjjz8We/bsKeTE+k+Tffrhhx8KAG98BAYGFn5wPaXpv9HXsWDkTtN9evz4cdG4cWNhZWUlKlasKL799luRlZVVyKn1lyb7MzMzU0yfPl1UqlRJKBQK4ezsLIYNGyaePXtW+MH1VGRkZK4/F7P3o5+fn3B1dX1jm7p16wq5XC4qVqwofvnlF53l4+3aiYiISOs4B4OIiIi0jgWDiIiItI4Fg4iIiLSOBYOIiIi0jgWDiIiItI4Fg4iIiLSOBYOIiIi0jgWDiIiItI4Fg8jIBAcHo0iRIlLHKDCZTIadO3e+dZ0vvvgC3t7ehZKHiAqGBYNID33xxReQyWRvfNy4cUPqaAgODlbnMTMzQ7ly5eDv74/Hjx9r5fljY2PRvn17AMCdO3cgk8kQExOTY50ffvgBwcHBWnm9vEyfPl39Ps3NzeHs7IxBgwbh6dOnGj0PyxCZKt6unUhPeXp64pdffsmxrHjx4hKlycnBwQHXrl2DSqXCuXPn4O/vj0ePHiEsLOy9nzuv23e/ztHR8b1fJz8+/vhjhIeHQ6lU4sqVK/jyyy/x4sULhISEFMrrExkyjmAQ6SkrKyuUKlUqx4e5uTkWLVqEWrVqwdbWFs7Ozhg2bBhevnyZ5/OcO3cOrVq1gr29PRwcHNCgQQP8/fff6q8fPXoULVq0gLW1NZydnTFq1CgkJye/NZtMJkOpUqVQpkwZtG/fHqNGjUJ4eDhSU1OhUqkwc+ZMlCtXDlZWVqhbty7279+v3jYjIwMjRoxA6dKloVAo8OGHH2Lu3Lk5njv7EEmFChUAAPXq1YNMJoObmxuAnKMCK1euRJkyZXLcJh0AunTpgi+//FL9+Pfff0f9+vWhUChQsWJFzJgxA1lZWW99nxYWFihVqhTKli0Ld3d39OjRAwcOHFB/XalUon///qhQoQKsra1RtWpV/PDDD+qvT58+HevWrcPvv/+uHg2JiooCANy/fx89e/ZEkSJFUKxYMXTp0gV37tx5ax4iQ8KCQWRgzMzM8OOPP+LSpUtYt24dDh48iPHjx+e5ft++fVGuXDmcPn0aZ86cwcSJE2FpaQkAuHnzJjw9PdG9e3ecP38eISEhOHr0KEaMGKFRJmtra6hUKmRlZeGHH37AwoULsWDBApw/fx4eHh7o3Lkz/vnnHwDAjz/+iF27diE0NBTXrl3Dpk2b4OLikuvznjp1CgAQHh6O2NhYbN++/Y11evTogX///ReRkZHqZU+fPsX+/fvRt29fAMCRI0fg6+uL0aNH4/Lly/j5558RHByMb7/9Nt/v8c6dOwgLC4NcLlcvU6lUKFeuHLZu3YrLly9j2rRpmDx5MkJDQwEA48aNQ8+ePeHp6YnY2FjExsaiadOmyMzMhIeHB+zt7XHkyBEcO3YMdnZ28PT0REZGRr4zEek1nd2nlYgKzM/PT5ibmwtbW1v1x2effZbrulu3bhUffPCB+vEvv/wiHB0d1Y/t7e1FcHBwrtv2799fDBo0KMeyI0eOCDMzM5GamprrNv99/uvXr4sqVaqIhg0bCiGEKFOmjPj2229zbPPJJ5+IYcOGCSGEGDlypGjdurVQqVS5Pj8AsWPHDiGEELdv3xYAxNmzZ3Os89/by3fp0kV8+eWX6sc///yzKFOmjFAqlUIIIdq0aSPmzJmT4zk2bNggSpcunWsGIYQIDAwUZmZmwtbWVigUCvWtsBctWpTnNkIIMXz4cNG9e/c8s2a/dtWqVXPsg/T0dGFtbS3CwsLe+vxEhoJzMIj0VKtWrbB8+XL1Y1tbWwCv/pqfO3curl69isTERGRlZSEtLQ0pKSmwsbF543kCAgIwYMAAbNiwQT3MX6lSJQCvDp+cP38emzZtUq8vhIBKpcLt27dRvXr1XLO9ePECdnZ2UKlUSEtLQ/PmzbF69WokJibi0aNHaNasWY71mzVrhnPnzgF4dXijbdu2qFq1Kjw9PdGpUye0a9fuvfZV3759MXDgQCxbtgxWVlbYtGkTevXqBTMzM/X7PHbsWI4RC6VS+db9BgBVq1bFrl27kJaWho0bNyImJgYjR47MsU5QUBDWrl2Le/fuITU1FRkZGahbt+5b8547dw43btyAvb19juVpaWm4efNmAfYAkf5hwSDSU7a2tvjoo49yLLtz5w46deqEoUOH4ttvv0WxYsVw9OhR9O/fHxkZGbn+opw+fTr69OmDPXv2YN++fQgMDMSWLVvQtWtXvHz5EoMHD8aoUaPe2K58+fJ5ZrO3t0d0dDTMzMxQunRpWFtbAwASExPf+b7q16+P27dvY9++fQgPD0fPnj3h7u6Obdu2vXPbvHh5eUEIgT179uCTTz7BkSNHsHjxYvXXX758iRkzZqBbt25vbKtQKPJ8Xrlcrv5/MG/ePHTs2BEzZszArFmzAABbtmzBuHHjsHDhQjRp0gT29vaYP38+/vrrr7fmffnyJRo0aJCj2GXTl4m8RO+LBYPIgJw5cwYqlQoLFy5U/3Wefbz/bapUqYIqVapgzJgx6N27N3755Rd07doV9evXx+XLl98oMu9iZmaW6zYODg4oU6YMjh07BldXV/XyY8eOoVGjRjnW8/HxgY+PDz777DN4enri6dOnKFasWI7ny57voFQq35pHoVCgW7du2LRpE27cuIGqVauifv366q/Xr18f165d0/h9/teUKVPQunVrDB06VP0+mzZtimHDhqnX+e8IhFwufyN//fr1ERISghIlSsDBweG9MhHpK07yJDIgH330ETIzM7F06VLcunULGzZswIoVK/JcPzU1FSNGjEBUVBTu3r2LY8eO4fTp0+pDHxMmTMDx48cxYsQIxMTE4J9//sHvv/+u8STP13399df47rvvEBISgmvXrmHixImIiYnB6NGjAQCLFi3Cr7/+iqtXr+L69evYunUrSpUqlevFwUqUKAFra2vs378f8fHxePHiRZ6v27dvX+zZswdr165VT+7MNm3aNKxfvx4zZszApUuXcOXKFWzZsgVTpkzR6L01adIEtWvXxpw5cwAAlStXxt9//42wsDBcv34dU6dOxenTp3Ns4+LigvPnz+PatWtISEhAZmYm+vbtCycnJ3Tp0gVHjhzB7du3ERUVhVGjRuHBgwcaZSLSW1JPAiGiN+U2MTDbokWLROnSpYW1tbXw8PAQ69evFwDEs2fPhBA5J2Gmp6eLXr16CWdnZyGXy0WZMmXEiBEjckzgPHXqlGjbtq2ws7MTtra2onbt2m9M0nzdfyd5/pdSqRTTp08XZcuWFZaWlqJOnTpi37596q+vXLlS1K1bV9ja2goHBwfRpk0bER0drf46XpvkKYQQq1atEs7OzsLMzEy4urrmuX+USqUoXbq0ACBu3rz5Rq79+/eLpk2bCmtra+Hg4CAaNWokVq5cmef7CAwMFHXq1Hlj+a+//iqsrKzEvXv3RFpamvjiiy+Eo6OjKFKkiBg6dKiYOHFiju0eP36s3r8ARGRkpBBCiNjYWOHr6yucnJyElZWVqFixohg4cKB48eJFnpmIDIlMCCGkrThERERkbHiIhIiIiLSOBYOIiIi0jgWDiIiItI4Fg4iIiLSOBYOIiIi0jgWDiIiItI4Fg4iIiLSOBYOIiIi0jgWDiIiItI4Fg4iIiLSOBYOIiIi07v8A1k+hWenkwRsAAAAASUVORK5CYII=",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from sklearn.metrics import roc_curve, roc_auc_score\n",
+ "import matplotlib\n",
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline\n",
+ "\n",
+ "y_scores = model.predict_proba(X_test)\n",
+ "# calculate ROC curve\n",
+ "fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])\n",
+ "\n",
+ "# plot ROC curve\n",
+ "fig = plt.figure(figsize=(6, 6))\n",
+ "# Plot the diagonal 50% line\n",
+ "plt.plot([0, 1], [0, 1], 'k--')\n",
+ "# Plot the FPR and TPR achieved by our model\n",
+ "plt.plot(fpr, tpr)\n",
+ "plt.xlabel('False Positive Rate')\n",
+ "plt.ylabel('True Positive Rate')\n",
+ "plt.title('ROC Curve')\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.9749908725812341\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Calculate AUC score\n",
+ "auc = roc_auc_score(y_test,y_scores[:,1])\n",
+ "print(auc)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.16"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "orig_nbformat": 2,
+ "vscode": {
+ "interpreter": {
+ "hash": "949777d72b0d2535278d3dc13498b2535136f6dfe0678499012e853ee9abcab1"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "ef50cc584e0b79412610cc7da15e1f86",
+ "translation_date": "2025-08-29T22:58:37+00:00",
+ "source_file": "2-Regression/4-Logistic/solution/notebook.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
\ No newline at end of file
diff --git a/translations/br/2-Regression/README.md b/translations/br/2-Regression/README.md
new file mode 100644
index 000000000..bb18e6a7c
--- /dev/null
+++ b/translations/br/2-Regression/README.md
@@ -0,0 +1,54 @@
+
+# Modelos de regressão para aprendizado de máquina
+## Tópico regional: Modelos de regressão para preços de abóboras na América do Norte 🎃
+
+Na América do Norte, as abóboras são frequentemente esculpidas em rostos assustadores para o Halloween. Vamos descobrir mais sobre esses vegetais fascinantes!
+
+
+> Foto de Beth Teutschmann no Unsplash
+
+## O que você vai aprender
+
+[](https://youtu.be/5QnJtDad4iQ "Vídeo de introdução à regressão - Clique para assistir!")
+> 🎥 Clique na imagem acima para um vídeo rápido de introdução a esta lição
+
+As lições desta seção abordam os tipos de regressão no contexto do aprendizado de máquina. Os modelos de regressão podem ajudar a determinar o _relacionamento_ entre variáveis. Esse tipo de modelo pode prever valores como comprimento, temperatura ou idade, revelando assim relações entre variáveis enquanto analisa pontos de dados.
+
+Nesta série de lições, você descobrirá as diferenças entre regressão linear e logística, e quando deve preferir uma em vez da outra.
+
+[](https://youtu.be/XA3OaoW86R8 "ML para iniciantes - Introdução aos modelos de regressão para aprendizado de máquina")
+
+> 🎥 Clique na imagem acima para um vídeo curto apresentando os modelos de regressão.
+
+Neste grupo de lições, você será preparado para começar tarefas de aprendizado de máquina, incluindo a configuração do Visual Studio Code para gerenciar notebooks, o ambiente comum para cientistas de dados. Você descobrirá o Scikit-learn, uma biblioteca para aprendizado de máquina, e construirá seus primeiros modelos, com foco nos modelos de regressão neste capítulo.
+
+> Existem ferramentas úteis de baixo código que podem ajudá-lo a aprender sobre o trabalho com modelos de regressão. Experimente [Azure ML para esta tarefa](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
+
+### Lições
+
+1. [Ferramentas do ofício](1-Tools/README.md)
+2. [Gerenciando dados](2-Data/README.md)
+3. [Regressão linear e polinomial](3-Linear/README.md)
+4. [Regressão logística](4-Logistic/README.md)
+
+---
+### Créditos
+
+"ML com regressão" foi escrito com ♥️ por [Jen Looper](https://twitter.com/jenlooper)
+
+♥️ Contribuidores do quiz incluem: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) e [Ornella Altunyan](https://twitter.com/ornelladotcom)
+
+O conjunto de dados de abóboras foi sugerido por [este projeto no Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) e seus dados são provenientes dos [Relatórios Padrão dos Mercados de Culturas Especiais](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) distribuídos pelo Departamento de Agricultura dos Estados Unidos. Adicionamos alguns pontos relacionados à cor com base na variedade para normalizar a distribuição. Esses dados estão em domínio público.
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/3-Web-App/1-Web-App/README.md b/translations/br/3-Web-App/1-Web-App/README.md
new file mode 100644
index 000000000..435ba7fc3
--- /dev/null
+++ b/translations/br/3-Web-App/1-Web-App/README.md
@@ -0,0 +1,359 @@
+
+# Construa um Aplicativo Web para Usar um Modelo de ML
+
+Nesta lição, você irá treinar um modelo de ML em um conjunto de dados fora deste mundo: _avistamentos de OVNIs ao longo do último século_, provenientes do banco de dados do NUFORC.
+
+Você aprenderá:
+
+- Como 'pickle' um modelo treinado
+- Como usar esse modelo em um aplicativo Flask
+
+Continuaremos utilizando notebooks para limpar os dados e treinar nosso modelo, mas você pode levar o processo um passo adiante explorando o uso de um modelo "na prática", por assim dizer: em um aplicativo web.
+
+Para fazer isso, você precisa construir um aplicativo web usando Flask.
+
+## [Quiz pré-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/17/)
+
+## Construindo um aplicativo
+
+Existem várias maneiras de construir aplicativos web para consumir modelos de aprendizado de máquina. Sua arquitetura web pode influenciar a forma como seu modelo é treinado. Imagine que você está trabalhando em uma empresa onde o grupo de ciência de dados treinou um modelo que eles querem que você use em um aplicativo.
+
+### Considerações
+
+Há muitas perguntas que você precisa fazer:
+
+- **É um aplicativo web ou um aplicativo móvel?** Se você está construindo um aplicativo móvel ou precisa usar o modelo em um contexto de IoT, você pode usar [TensorFlow Lite](https://www.tensorflow.org/lite/) e utilizar o modelo em um aplicativo Android ou iOS.
+- **Onde o modelo ficará armazenado?** Na nuvem ou localmente?
+- **Suporte offline.** O aplicativo precisa funcionar offline?
+- **Qual tecnologia foi usada para treinar o modelo?** A tecnologia escolhida pode influenciar as ferramentas que você precisa usar.
+ - **Usando TensorFlow.** Se você está treinando um modelo usando TensorFlow, por exemplo, esse ecossistema oferece a capacidade de converter um modelo TensorFlow para uso em um aplicativo web utilizando [TensorFlow.js](https://www.tensorflow.org/js/).
+ - **Usando PyTorch.** Se você está construindo um modelo usando uma biblioteca como [PyTorch](https://pytorch.org/), você tem a opção de exportá-lo no formato [ONNX](https://onnx.ai/) (Open Neural Network Exchange) para uso em aplicativos web JavaScript que podem utilizar o [Onnx Runtime](https://www.onnxruntime.ai/). Essa opção será explorada em uma lição futura para um modelo treinado com Scikit-learn.
+ - **Usando Lobe.ai ou Azure Custom Vision.** Se você está utilizando um sistema de ML SaaS (Software como Serviço) como [Lobe.ai](https://lobe.ai/) ou [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) para treinar um modelo, esse tipo de software oferece maneiras de exportar o modelo para várias plataformas, incluindo a construção de uma API personalizada para ser consultada na nuvem pelo seu aplicativo online.
+
+Você também tem a oportunidade de construir um aplicativo web Flask completo que seria capaz de treinar o modelo diretamente em um navegador web. Isso também pode ser feito usando TensorFlow.js em um contexto JavaScript.
+
+Para nossos propósitos, já que estamos trabalhando com notebooks baseados em Python, vamos explorar os passos necessários para exportar um modelo treinado de um notebook para um formato legível por um aplicativo web construído em Python.
+
+## Ferramenta
+
+Para esta tarefa, você precisa de duas ferramentas: Flask e Pickle, ambas executadas em Python.
+
+✅ O que é [Flask](https://palletsprojects.com/p/flask/)? Definido como um 'micro-framework' por seus criadores, Flask fornece os recursos básicos de frameworks web usando Python e um mecanismo de templates para construir páginas web. Confira [este módulo de aprendizado](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) para praticar a construção com Flask.
+
+✅ O que é [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 é um módulo Python que serializa e desserializa uma estrutura de objeto Python. Quando você 'pickle' um modelo, você serializa ou achata sua estrutura para uso na web. Atenção: pickle não é intrinsecamente seguro, então tenha cuidado ao ser solicitado a 'despickle' um arquivo. Um arquivo pickled tem o sufixo `.pkl`.
+
+## Exercício - limpe seus dados
+
+Nesta lição, você usará dados de 80.000 avistamentos de OVNIs, coletados pelo [NUFORC](https://nuforc.org) (Centro Nacional de Relatórios de OVNIs). Esses dados têm descrições interessantes de avistamentos de OVNIs, por exemplo:
+
+- **Descrição longa de exemplo.** "Um homem emerge de um feixe de luz que brilha em um campo gramado à noite e corre em direção ao estacionamento da Texas Instruments".
+- **Descrição curta de exemplo.** "as luzes nos perseguiram".
+
+A planilha [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) inclui colunas sobre a `cidade`, `estado` e `país` onde o avistamento ocorreu, o `formato` do objeto e sua `latitude` e `longitude`.
+
+No [notebook](notebook.ipynb) em branco incluído nesta lição:
+
+1. Importe `pandas`, `matplotlib` e `numpy` como você fez em lições anteriores e importe a planilha de ufos. Você pode dar uma olhada em um conjunto de dados de amostra:
+
+ ```python
+ import pandas as pd
+ import numpy as np
+
+ ufos = pd.read_csv('./data/ufos.csv')
+ ufos.head()
+ ```
+
+1. Converta os dados de ufos para um pequeno dataframe com títulos novos. Verifique os valores únicos no campo `Country`.
+
+ ```python
+ ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
+
+ ufos.Country.unique()
+ ```
+
+1. Agora, você pode reduzir a quantidade de dados com que precisamos lidar, descartando quaisquer valores nulos e importando apenas avistamentos entre 1-60 segundos:
+
+ ```python
+ ufos.dropna(inplace=True)
+
+ ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
+
+ ufos.info()
+ ```
+
+1. Importe a biblioteca `LabelEncoder` do Scikit-learn para converter os valores de texto dos países em números:
+
+ ✅ LabelEncoder codifica dados alfabeticamente
+
+ ```python
+ from sklearn.preprocessing import LabelEncoder
+
+ ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])
+
+ ufos.head()
+ ```
+
+ Seus dados devem se parecer com isto:
+
+ ```output
+ Seconds Country Latitude Longitude
+ 2 20.0 3 53.200000 -2.916667
+ 3 20.0 4 28.978333 -96.645833
+ 14 30.0 4 35.823889 -80.253611
+ 23 60.0 4 45.582778 -122.352222
+ 24 3.0 3 51.783333 -0.783333
+ ```
+
+## Exercício - construa seu modelo
+
+Agora você pode se preparar para treinar um modelo dividindo os dados em grupos de treinamento e teste.
+
+1. Selecione as três características que você deseja treinar como seu vetor X, e o vetor y será o `Country`. Você quer ser capaz de inserir `Seconds`, `Latitude` e `Longitude` e obter um id de país como retorno.
+
+ ```python
+ from sklearn.model_selection import train_test_split
+
+ Selected_features = ['Seconds','Latitude','Longitude']
+
+ X = ufos[Selected_features]
+ y = ufos['Country']
+
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
+ ```
+
+1. Treine seu modelo usando regressão logística:
+
+ ```python
+ from sklearn.metrics import accuracy_score, classification_report
+ from sklearn.linear_model import LogisticRegression
+ model = LogisticRegression()
+ model.fit(X_train, y_train)
+ predictions = model.predict(X_test)
+
+ print(classification_report(y_test, predictions))
+ print('Predicted labels: ', predictions)
+ print('Accuracy: ', accuracy_score(y_test, predictions))
+ ```
+
+A precisão não é ruim **(cerca de 95%)**, o que não é surpreendente, já que `Country` e `Latitude/Longitude` estão correlacionados.
+
+O modelo que você criou não é muito revolucionário, já que você deveria ser capaz de inferir um `Country` a partir de sua `Latitude` e `Longitude`, mas é um bom exercício para tentar treinar a partir de dados brutos que você limpou, exportou e depois usou esse modelo em um aplicativo web.
+
+## Exercício - 'pickle' seu modelo
+
+Agora é hora de _pickle_ seu modelo! Você pode fazer isso em algumas linhas de código. Uma vez que ele esteja _pickled_, carregue seu modelo pickled e teste-o contra um array de dados de amostra contendo valores para segundos, latitude e longitude.
+
+```python
+import pickle
+model_filename = 'ufo-model.pkl'
+pickle.dump(model, open(model_filename,'wb'))
+
+model = pickle.load(open('ufo-model.pkl','rb'))
+print(model.predict([[50,44,-12]]))
+```
+
+O modelo retorna **'3'**, que é o código do país para o Reino Unido. Incrível! 👽
+
+## Exercício - construa um aplicativo Flask
+
+Agora você pode construir um aplicativo Flask para chamar seu modelo e retornar resultados semelhantes, mas de uma maneira mais visualmente agradável.
+
+1. Comece criando uma pasta chamada **web-app** ao lado do arquivo _notebook.ipynb_ onde seu arquivo _ufo-model.pkl_ está localizado.
+
+1. Dentro dessa pasta, crie mais três pastas: **static**, com uma pasta **css** dentro dela, e **templates**. Você deve ter agora os seguintes arquivos e diretórios:
+
+ ```output
+ web-app/
+ static/
+ css/
+ templates/
+ notebook.ipynb
+ ufo-model.pkl
+ ```
+
+ ✅ Consulte a pasta de solução para ver o aplicativo finalizado
+
+1. O primeiro arquivo a ser criado na pasta _web-app_ é o arquivo **requirements.txt**. Como o _package.json_ em um aplicativo JavaScript, este arquivo lista as dependências necessárias para o aplicativo. No **requirements.txt** adicione as linhas:
+
+ ```text
+ scikit-learn
+ pandas
+ numpy
+ flask
+ ```
+
+1. Agora, execute este arquivo navegando até _web-app_:
+
+ ```bash
+ cd web-app
+ ```
+
+1. No seu terminal, digite `pip install` para instalar as bibliotecas listadas em _requirements.txt_:
+
+ ```bash
+ pip install -r requirements.txt
+ ```
+
+1. Agora, você está pronto para criar mais três arquivos para finalizar o aplicativo:
+
+ 1. Crie **app.py** na raiz.
+ 2. Crie **index.html** no diretório _templates_.
+ 3. Crie **styles.css** no diretório _static/css_.
+
+1. Desenvolva o arquivo _styles.css_ com alguns estilos:
+
+ ```css
+ body {
+ width: 100%;
+ height: 100%;
+ font-family: 'Helvetica';
+ background: black;
+ color: #fff;
+ text-align: center;
+ letter-spacing: 1.4px;
+ font-size: 30px;
+ }
+
+ input {
+ min-width: 150px;
+ }
+
+ .grid {
+ width: 300px;
+ border: 1px solid #2d2d2d;
+ display: grid;
+ justify-content: center;
+ margin: 20px auto;
+ }
+
+ .box {
+ color: #fff;
+ background: #2d2d2d;
+ padding: 12px;
+ display: inline-block;
+ }
+ ```
+
+1. Em seguida, desenvolva o arquivo _index.html_:
+
+ ```html
+
+
+
+
+ 🛸 UFO Appearance Prediction! 👽
+
+
+
+
+
+
+
+
+
According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?
+
+
+
+
{{ prediction_text }}
+
+
+
+
+
+
+
+ ```
+
+ Observe o uso de templates neste arquivo. Note a sintaxe 'mustache' em torno das variáveis que serão fornecidas pelo aplicativo, como o texto de previsão: `{{}}`. Há também um formulário que envia uma previsão para a rota `/predict`.
+
+ Finalmente, você está pronto para construir o arquivo Python que dirige o consumo do modelo e a exibição das previsões:
+
+1. No `app.py` adicione:
+
+ ```python
+ import numpy as np
+ from flask import Flask, request, render_template
+ import pickle
+
+ app = Flask(__name__)
+
+ model = pickle.load(open("./ufo-model.pkl", "rb"))
+
+
+ @app.route("/")
+ def home():
+ return render_template("index.html")
+
+
+ @app.route("/predict", methods=["POST"])
+ def predict():
+
+ int_features = [int(x) for x in request.form.values()]
+ final_features = [np.array(int_features)]
+ prediction = model.predict(final_features)
+
+ output = prediction[0]
+
+ countries = ["Australia", "Canada", "Germany", "UK", "US"]
+
+ return render_template(
+ "index.html", prediction_text="Likely country: {}".format(countries[output])
+ )
+
+
+ if __name__ == "__main__":
+ app.run(debug=True)
+ ```
+
+ > 💡 Dica: quando você adiciona [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) ao executar o aplicativo web usando Flask, quaisquer alterações feitas no seu aplicativo serão refletidas imediatamente sem a necessidade de reiniciar o servidor. Atenção! Não habilite este modo em um aplicativo de produção.
+
+Se você executar `python app.py` ou `python3 app.py` - seu servidor web será iniciado localmente, e você poderá preencher um formulário simples para obter uma resposta à sua pergunta sobre onde os OVNIs foram avistados!
+
+Antes de fazer isso, dê uma olhada nas partes do `app.py`:
+
+1. Primeiro, as dependências são carregadas e o aplicativo é iniciado.
+1. Em seguida, o modelo é importado.
+1. Depois, o index.html é renderizado na rota inicial.
+
+Na rota `/predict`, várias coisas acontecem quando o formulário é enviado:
+
+1. As variáveis do formulário são coletadas e convertidas em um array numpy. Elas são então enviadas ao modelo e uma previsão é retornada.
+2. Os países que queremos exibir são re-renderizados como texto legível a partir de seu código de país previsto, e esse valor é enviado de volta ao index.html para ser renderizado no template.
+
+Usar um modelo dessa forma, com Flask e um modelo pickled, é relativamente simples. A parte mais difícil é entender qual é o formato dos dados que devem ser enviados ao modelo para obter uma previsão. Isso depende de como o modelo foi treinado. Este modelo requer três pontos de dados como entrada para gerar uma previsão.
+
+Em um ambiente profissional, você pode ver como é importante ter uma boa comunicação entre as pessoas que treinam o modelo e aquelas que o consomem em um aplicativo web ou móvel. No nosso caso, é apenas uma pessoa: você!
+
+---
+
+## 🚀 Desafio
+
+Em vez de trabalhar em um notebook e importar o modelo para o aplicativo Flask, você poderia treinar o modelo diretamente dentro do aplicativo Flask! Tente converter seu código Python no notebook, talvez após limpar seus dados, para treinar o modelo dentro do aplicativo em uma rota chamada `train`. Quais são os prós e contras de seguir esse método?
+
+## [Quiz pós-aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/18/)
+
+## Revisão e Autoestudo
+
+Existem várias maneiras de construir um aplicativo web para consumir modelos de ML. Faça uma lista das maneiras que você poderia usar JavaScript ou Python para construir um aplicativo web que aproveite o aprendizado de máquina. Considere a arquitetura: o modelo deve permanecer no aplicativo ou viver na nuvem? Se for o último caso, como você o acessaria? Desenhe um modelo arquitetural para uma solução web aplicada de ML.
+
+## Tarefa
+
+[Experimente um modelo diferente](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/3-Web-App/1-Web-App/assignment.md b/translations/br/3-Web-App/1-Web-App/assignment.md
new file mode 100644
index 000000000..e227f8a0a
--- /dev/null
+++ b/translations/br/3-Web-App/1-Web-App/assignment.md
@@ -0,0 +1,25 @@
+
+# Experimente um modelo diferente
+
+## Instruções
+
+Agora que você criou um aplicativo web usando um modelo de Regressão treinado, utilize um dos modelos de uma lição anterior sobre Regressão para refazer este aplicativo web. Você pode manter o estilo ou projetá-lo de forma diferente para refletir os dados de abóbora. Certifique-se de alterar os inputs para refletir o método de treinamento do seu modelo.
+
+## Rubrica
+
+| Critérios | Exemplares | Adequados | Necessita Melhorias |
+| -------------------------- | -------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------- |
+| | O aplicativo web funciona como esperado e está implantado na nuvem | O aplicativo web contém falhas ou apresenta resultados inesperados | O aplicativo web não funciona corretamente |
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/3-Web-App/1-Web-App/notebook.ipynb b/translations/br/3-Web-App/1-Web-App/notebook.ipynb
new file mode 100644
index 000000000..e69de29bb
diff --git a/translations/br/3-Web-App/1-Web-App/solution/notebook.ipynb b/translations/br/3-Web-App/1-Web-App/solution/notebook.ipynb
new file mode 100644
index 000000000..303c919ac
--- /dev/null
+++ b/translations/br/3-Web-App/1-Web-App/solution/notebook.ipynb
@@ -0,0 +1,267 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.0"
+ },
+ "orig_nbformat": 2,
+ "kernelspec": {
+ "name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7",
+ "display_name": "Python 3.7.0 64-bit ('3.7')"
+ },
+ "metadata": {
+ "interpreter": {
+ "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
+ }
+ },
+ "coopTranslator": {
+ "original_hash": "5fa2e8f4584c78250ca9729b46562ceb",
+ "translation_date": "2025-08-29T23:40:42+00:00",
+ "source_file": "3-Web-App/1-Web-App/solution/notebook.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " datetime city state country shape \\\n",
+ "0 10/10/1949 20:30 san marcos tx us cylinder \n",
+ "1 10/10/1949 21:00 lackland afb tx NaN light \n",
+ "2 10/10/1955 17:00 chester (uk/england) NaN gb circle \n",
+ "3 10/10/1956 21:00 edna tx us circle \n",
+ "4 10/10/1960 20:00 kaneohe hi us light \n",
+ "\n",
+ " duration (seconds) duration (hours/min) \\\n",
+ "0 2700.0 45 minutes \n",
+ "1 7200.0 1-2 hrs \n",
+ "2 20.0 20 seconds \n",
+ "3 20.0 1/2 hour \n",
+ "4 900.0 15 minutes \n",
+ "\n",
+ " comments date posted latitude \\\n",
+ "0 This event took place in early fall around 194... 4/27/2004 29.883056 \n",
+ "1 1949 Lackland AFB, TX. Lights racing acros... 12/16/2005 29.384210 \n",
+ "2 Green/Orange circular disc over Chester, En... 1/21/2008 53.200000 \n",
+ "3 My older brother and twin sister were leaving ... 1/17/2004 28.978333 \n",
+ "4 AS a Marine 1st Lt. flying an FJ4B fighter/att... 1/22/2004 21.418056 \n",
+ "\n",
+ " longitude \n",
+ "0 -97.941111 \n",
+ "1 -98.581082 \n",
+ "2 -2.916667 \n",
+ "3 -96.645833 \n",
+ "4 -157.803611 "
+ ],
+ "text/html": "
"
+ },
+ "metadata": {},
+ "execution_count": 26
+ }
+ ],
+ "source": [
+ "from sklearn.preprocessing import LabelEncoder\n",
+ "\n",
+ "ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])\n",
+ "\n",
+ "ufos.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "Selected_features = ['Seconds','Latitude','Longitude']\n",
+ "\n",
+ "X = ufos[Selected_features]\n",
+ "y = ufos['Country']\n",
+ "\n",
+ "\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stderr",
+ "text": [
+ "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
+ " FutureWarning)\n",
+ "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:469: FutureWarning: Default multi_class will be changed to 'auto' in 0.22. Specify the multi_class option to silence this warning.\n",
+ " \"this warning.\", FutureWarning)\n",
+ " precision recall f1-score support\n",
+ "\n",
+ " 0 1.00 1.00 1.00 41\n",
+ " 1 1.00 0.02 0.05 250\n",
+ " 2 0.00 0.00 0.00 8\n",
+ " 3 0.94 1.00 0.97 131\n",
+ " 4 0.95 1.00 0.97 4743\n",
+ "\n",
+ " accuracy 0.95 5173\n",
+ " macro avg 0.78 0.60 0.60 5173\n",
+ "weighted avg 0.95 0.95 0.93 5173\n",
+ "\n",
+ "Predicted labels: [4 4 4 ... 3 4 4]\n",
+ "Accuracy: 0.9512855209742895\n",
+ "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/metrics/classification.py:1437: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.\n",
+ " 'precision', 'predicted', average, warn_for)\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.metrics import accuracy_score, classification_report \n",
+ "from sklearn.linear_model import LogisticRegression\n",
+ "model = LogisticRegression()\n",
+ "model.fit(X_train, y_train)\n",
+ "predictions = model.predict(X_test)\n",
+ "\n",
+ "print(classification_report(y_test, predictions))\n",
+ "print('Predicted labels: ', predictions)\n",
+ "print('Accuracy: ', accuracy_score(y_test, predictions))\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[3]\n"
+ ]
+ }
+ ],
+ "source": [
+ "import pickle\n",
+ "model_filename = 'ufo-model.pkl'\n",
+ "pickle.dump(model, open(model_filename,'wb'))\n",
+ "\n",
+ "model = pickle.load(open('ufo-model.pkl','rb'))\n",
+ "print(model.predict([[50,44,-12]]))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/br/3-Web-App/README.md b/translations/br/3-Web-App/README.md
new file mode 100644
index 000000000..2e8e51b92
--- /dev/null
+++ b/translations/br/3-Web-App/README.md
@@ -0,0 +1,35 @@
+
+# Construa um aplicativo web para usar seu modelo de ML
+
+Nesta seção do currículo, você será introduzido a um tópico aplicado de aprendizado de máquina: como salvar seu modelo Scikit-learn como um arquivo que pode ser usado para fazer previsões dentro de um aplicativo web. Depois que o modelo estiver salvo, você aprenderá como utilizá-lo em um aplicativo web construído com Flask. Primeiro, você criará um modelo usando alguns dados relacionados a avistamentos de OVNIs! Em seguida, você construirá um aplicativo web que permitirá inserir um número de segundos junto com valores de latitude e longitude para prever qual país relatou ter visto um OVNI.
+
+
+
+Foto por Michael Herren no Unsplash
+
+## Aulas
+
+1. [Construa um Aplicativo Web](1-Web-App/README.md)
+
+## Créditos
+
+"Construa um Aplicativo Web" foi escrito com ♥️ por [Jen Looper](https://twitter.com/jenlooper).
+
+♥️ Os questionários foram escritos por Rohan Raj.
+
+O conjunto de dados foi obtido de [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings).
+
+A arquitetura do aplicativo web foi sugerida em parte por [este artigo](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) e [este repositório](https://github.com/abhinavsagar/machine-learning-deployment) de Abhinav Sagar.
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/4-Classification/1-Introduction/README.md b/translations/br/4-Classification/1-Introduction/README.md
new file mode 100644
index 000000000..931099abc
--- /dev/null
+++ b/translations/br/4-Classification/1-Introduction/README.md
@@ -0,0 +1,313 @@
+
+# Introdução à classificação
+
+Nestas quatro lições, você explorará um dos focos fundamentais do aprendizado de máquina clássico - _classificação_. Vamos utilizar vários algoritmos de classificação com um conjunto de dados sobre as brilhantes culinárias da Ásia e da Índia. Espero que você esteja com fome!
+
+
+
+> Celebre as culinárias pan-asiáticas nestas lições! Imagem por [Jen Looper](https://twitter.com/jenlooper)
+
+Classificação é uma forma de [aprendizado supervisionado](https://wikipedia.org/wiki/Supervised_learning) que tem muito em comum com técnicas de regressão. Se o aprendizado de máquina é sobre prever valores ou nomes para coisas usando conjuntos de dados, então a classificação geralmente se divide em dois grupos: _classificação binária_ e _classificação multiclasse_.
+
+[](https://youtu.be/eg8DJYwdMyg "Introdução à classificação")
+
+> 🎥 Clique na imagem acima para assistir a um vídeo: John Guttag, do MIT, apresenta a classificação
+
+Lembre-se:
+
+- **Regressão linear** ajudou você a prever relações entre variáveis e fazer previsões precisas sobre onde um novo ponto de dados se encaixaria em relação a essa linha. Por exemplo, você poderia prever _qual seria o preço de uma abóbora em setembro vs. dezembro_.
+- **Regressão logística** ajudou você a descobrir "categorias binárias": neste ponto de preço, _essa abóbora é laranja ou não-laranja_?
+
+A classificação utiliza vários algoritmos para determinar outras maneiras de identificar o rótulo ou a classe de um ponto de dados. Vamos trabalhar com esses dados de culinária para ver se, ao observar um grupo de ingredientes, conseguimos determinar sua origem culinária.
+
+## [Pré-quiz da aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)
+
+> ### [Esta lição está disponível em R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
+
+### Introdução
+
+A classificação é uma das atividades fundamentais do pesquisador de aprendizado de máquina e do cientista de dados. Desde a classificação básica de um valor binário ("este e-mail é spam ou não?") até a classificação e segmentação complexa de imagens usando visão computacional, é sempre útil ser capaz de organizar dados em classes e fazer perguntas sobre eles.
+
+Para descrever o processo de forma mais científica, seu método de classificação cria um modelo preditivo que permite mapear a relação entre variáveis de entrada e variáveis de saída.
+
+
+
+> Problemas binários vs. multiclasse para algoritmos de classificação resolverem. Infográfico por [Jen Looper](https://twitter.com/jenlooper)
+
+Antes de começar o processo de limpar nossos dados, visualizá-los e prepará-los para nossas tarefas de aprendizado de máquina, vamos aprender um pouco sobre as várias maneiras pelas quais o aprendizado de máquina pode ser usado para classificar dados.
+
+Derivada da [estatística](https://wikipedia.org/wiki/Statistical_classification), a classificação usando aprendizado de máquina clássico utiliza características, como `smoker`, `weight` e `age`, para determinar a _probabilidade de desenvolver X doença_. Como uma técnica de aprendizado supervisionado semelhante aos exercícios de regressão que você realizou anteriormente, seus dados são rotulados e os algoritmos de aprendizado de máquina usam esses rótulos para classificar e prever classes (ou 'características') de um conjunto de dados e atribuí-las a um grupo ou resultado.
+
+✅ Tire um momento para imaginar um conjunto de dados sobre culinárias. O que um modelo multiclasse seria capaz de responder? O que um modelo binário seria capaz de responder? E se você quisesse determinar se uma determinada culinária provavelmente usa feno-grego? E se você quisesse ver se, dado um presente de uma sacola de supermercado cheia de anis-estrelado, alcachofras, couve-flor e raiz-forte, você poderia criar um prato típico indiano?
+
+[](https://youtu.be/GuTeDbaNoEU "Cestas misteriosas malucas")
+
+> 🎥 Clique na imagem acima para assistir a um vídeo. Toda a premissa do programa 'Chopped' é a 'cesta misteriosa', onde os chefs têm que fazer um prato com uma escolha aleatória de ingredientes. Certamente um modelo de aprendizado de máquina teria ajudado!
+
+## Olá 'classificador'
+
+A pergunta que queremos fazer sobre este conjunto de dados de culinária é, na verdade, uma **pergunta multiclasse**, já que temos várias possíveis culinárias nacionais para trabalhar. Dado um lote de ingredientes, a qual dessas muitas classes os dados pertencem?
+
+O Scikit-learn oferece vários algoritmos diferentes para classificar dados, dependendo do tipo de problema que você deseja resolver. Nas próximas duas lições, você aprenderá sobre alguns desses algoritmos.
+
+## Exercício - limpar e balancear seus dados
+
+A primeira tarefa, antes de começar este projeto, é limpar e **balancear** seus dados para obter melhores resultados. Comece com o arquivo em branco _notebook.ipynb_ na raiz desta pasta.
+
+A primeira coisa a instalar é o [imblearn](https://imbalanced-learn.org/stable/). Este é um pacote do Scikit-learn que permitirá balancear melhor os dados (você aprenderá mais sobre essa tarefa em breve).
+
+1. Para instalar o `imblearn`, execute `pip install`, assim:
+
+ ```python
+ pip install imblearn
+ ```
+
+1. Importe os pacotes necessários para importar seus dados e visualizá-los, além de importar `SMOTE` do `imblearn`.
+
+ ```python
+ import pandas as pd
+ import matplotlib.pyplot as plt
+ import matplotlib as mpl
+ import numpy as np
+ from imblearn.over_sampling import SMOTE
+ ```
+
+ Agora você está pronto para importar os dados.
+
+1. A próxima tarefa será importar os dados:
+
+ ```python
+ df = pd.read_csv('../data/cuisines.csv')
+ ```
+
+ Usar `read_csv()` lerá o conteúdo do arquivo csv _cusines.csv_ e o colocará na variável `df`.
+
+1. Verifique o formato dos dados:
+
+ ```python
+ df.head()
+ ```
+
+ As primeiras cinco linhas se parecem com isto:
+
+ ```output
+ | | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
+ | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
+ | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+ | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+ | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+ | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+ | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
+ ```
+
+1. Obtenha informações sobre esses dados chamando `info()`:
+
+ ```python
+ df.info()
+ ```
+
+ Sua saída se parece com:
+
+ ```output
+
+ RangeIndex: 2448 entries, 0 to 2447
+ Columns: 385 entries, Unnamed: 0 to zucchini
+ dtypes: int64(384), object(1)
+ memory usage: 7.2+ MB
+ ```
+
+## Exercício - aprendendo sobre culinárias
+
+Agora o trabalho começa a ficar mais interessante. Vamos descobrir a distribuição dos dados por culinária.
+
+1. Plote os dados como barras chamando `barh()`:
+
+ ```python
+ df.cuisine.value_counts().plot.barh()
+ ```
+
+ 
+
+ Há um número finito de culinárias, mas a distribuição dos dados é desigual. Você pode corrigir isso! Antes de fazer isso, explore um pouco mais.
+
+1. Descubra quanto dado está disponível por culinária e imprima:
+
+ ```python
+ thai_df = df[(df.cuisine == "thai")]
+ japanese_df = df[(df.cuisine == "japanese")]
+ chinese_df = df[(df.cuisine == "chinese")]
+ indian_df = df[(df.cuisine == "indian")]
+ korean_df = df[(df.cuisine == "korean")]
+
+ print(f'thai df: {thai_df.shape}')
+ print(f'japanese df: {japanese_df.shape}')
+ print(f'chinese df: {chinese_df.shape}')
+ print(f'indian df: {indian_df.shape}')
+ print(f'korean df: {korean_df.shape}')
+ ```
+
+ A saída se parece com isto:
+
+ ```output
+ thai df: (289, 385)
+ japanese df: (320, 385)
+ chinese df: (442, 385)
+ indian df: (598, 385)
+ korean df: (799, 385)
+ ```
+
+## Descobrindo ingredientes
+
+Agora você pode se aprofundar nos dados e aprender quais são os ingredientes típicos por culinária. Você deve limpar dados recorrentes que criam confusão entre culinárias, então vamos aprender sobre esse problema.
+
+1. Crie uma função `create_ingredient()` em Python para criar um dataframe de ingredientes. Essa função começará removendo uma coluna inútil e classificará os ingredientes por sua contagem:
+
+ ```python
+ def create_ingredient_df(df):
+ ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
+ ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
+ ingredient_df = ingredient_df.sort_values(by='value', ascending=False,
+ inplace=False)
+ return ingredient_df
+ ```
+
+ Agora você pode usar essa função para ter uma ideia dos dez ingredientes mais populares por culinária.
+
+1. Chame `create_ingredient()` e plote chamando `barh()`:
+
+ ```python
+ thai_ingredient_df = create_ingredient_df(thai_df)
+ thai_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. Faça o mesmo para os dados japoneses:
+
+ ```python
+ japanese_ingredient_df = create_ingredient_df(japanese_df)
+ japanese_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. Agora para os ingredientes chineses:
+
+ ```python
+ chinese_ingredient_df = create_ingredient_df(chinese_df)
+ chinese_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. Plote os ingredientes indianos:
+
+ ```python
+ indian_ingredient_df = create_ingredient_df(indian_df)
+ indian_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. Finalmente, plote os ingredientes coreanos:
+
+ ```python
+ korean_ingredient_df = create_ingredient_df(korean_df)
+ korean_ingredient_df.head(10).plot.barh()
+ ```
+
+ 
+
+1. Agora, remova os ingredientes mais comuns que criam confusão entre culinárias distintas, chamando `drop()`:
+
+ Todo mundo adora arroz, alho e gengibre!
+
+ ```python
+ feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
+ labels_df = df.cuisine #.unique()
+ feature_df.head()
+ ```
+
+## Balancear o conjunto de dados
+
+Agora que você limpou os dados, use o [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Técnica de Superamostragem de Minoria Sintética" - para balanceá-los.
+
+1. Chame `fit_resample()`, essa estratégia gera novas amostras por interpolação.
+
+ ```python
+ oversample = SMOTE()
+ transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
+ ```
+
+ Ao balancear seus dados, você terá melhores resultados ao classificá-los. Pense em uma classificação binária. Se a maior parte dos seus dados pertence a uma classe, um modelo de aprendizado de máquina vai prever essa classe com mais frequência, apenas porque há mais dados para ela. Balancear os dados corrige esse desequilíbrio.
+
+1. Agora você pode verificar os números de rótulos por ingrediente:
+
+ ```python
+ print(f'new label count: {transformed_label_df.value_counts()}')
+ print(f'old label count: {df.cuisine.value_counts()}')
+ ```
+
+ Sua saída se parece com isto:
+
+ ```output
+ new label count: korean 799
+ chinese 799
+ indian 799
+ japanese 799
+ thai 799
+ Name: cuisine, dtype: int64
+ old label count: korean 799
+ indian 598
+ chinese 442
+ japanese 320
+ thai 289
+ Name: cuisine, dtype: int64
+ ```
+
+ Os dados estão limpos, balanceados e muito deliciosos!
+
+1. O último passo é salvar seus dados balanceados, incluindo rótulos e características, em um novo dataframe que pode ser exportado para um arquivo:
+
+ ```python
+ transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
+ ```
+
+1. Você pode dar mais uma olhada nos dados usando `transformed_df.head()` e `transformed_df.info()`. Salve uma cópia desses dados para uso em lições futuras:
+
+ ```python
+ transformed_df.head()
+ transformed_df.info()
+ transformed_df.to_csv("../data/cleaned_cuisines.csv")
+ ```
+
+ Este novo CSV pode agora ser encontrado na pasta de dados raiz.
+
+---
+
+## 🚀Desafio
+
+Este currículo contém vários conjuntos de dados interessantes. Explore as pastas `data` e veja se alguma contém conjuntos de dados que seriam apropriados para classificação binária ou multiclasse. Que perguntas você faria a esse conjunto de dados?
+
+## [Pós-quiz da aula](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)
+
+## Revisão e Autoestudo
+
+Explore a API do SMOTE. Para quais casos de uso ele é mais adequado? Que problemas ele resolve?
+
+## Tarefa
+
+[Explore métodos de classificação](assignment.md)
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/4-Classification/1-Introduction/assignment.md b/translations/br/4-Classification/1-Introduction/assignment.md
new file mode 100644
index 000000000..043ae8f3c
--- /dev/null
+++ b/translations/br/4-Classification/1-Introduction/assignment.md
@@ -0,0 +1,25 @@
+
+# Explore métodos de classificação
+
+## Instruções
+
+Na [documentação do Scikit-learn](https://scikit-learn.org/stable/supervised_learning.html), você encontrará uma grande lista de maneiras de classificar dados. Faça uma pequena caça ao tesouro nesses documentos: seu objetivo é procurar métodos de classificação e associar um conjunto de dados deste currículo, uma pergunta que você pode fazer sobre ele e uma técnica de classificação. Crie uma planilha ou tabela em um arquivo .doc e explique como o conjunto de dados funcionaria com o algoritmo de classificação.
+
+## Rubrica
+
+| Critérios | Exemplary | Adequate | Needs Improvement |
+| --------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| | um documento é apresentado com uma visão geral de 5 algoritmos juntamente com uma técnica de classificação. A visão geral é bem explicada e detalhada. | um documento é apresentado com uma visão geral de 3 algoritmos juntamente com uma técnica de classificação. A visão geral é bem explicada e detalhada. | um documento é apresentado com uma visão geral de menos de três algoritmos juntamente com uma técnica de classificação, e a visão geral não é bem explicada nem detalhada. |
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/4-Classification/1-Introduction/notebook.ipynb b/translations/br/4-Classification/1-Introduction/notebook.ipynb
new file mode 100644
index 000000000..16fc0c584
--- /dev/null
+++ b/translations/br/4-Classification/1-Introduction/notebook.ipynb
@@ -0,0 +1,39 @@
+{
+ "metadata": {
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": 3
+ },
+ "orig_nbformat": 2,
+ "coopTranslator": {
+ "original_hash": "d544ef384b7ba73757d830a72372a7f2",
+ "translation_date": "2025-08-29T23:52:57+00:00",
+ "source_file": "4-Classification/1-Introduction/notebook.ipynb",
+ "language_code": "br"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "cells": [
+ {
+ "source": [],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/br/4-Classification/1-Introduction/solution/Julia/README.md b/translations/br/4-Classification/1-Introduction/solution/Julia/README.md
new file mode 100644
index 000000000..fbf44fa07
--- /dev/null
+++ b/translations/br/4-Classification/1-Introduction/solution/Julia/README.md
@@ -0,0 +1,15 @@
+
+
+
+---
+
+**Aviso Legal**:
+Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.
\ No newline at end of file
diff --git a/translations/br/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb b/translations/br/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb
new file mode 100644
index 000000000..2d6a8b111
--- /dev/null
+++ b/translations/br/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb
@@ -0,0 +1,723 @@
+{
+ "nbformat": 4,
+ "nbformat_minor": 2,
+ "metadata": {
+ "colab": {
+ "name": "lesson_10-R.ipynb",
+ "provenance": [],
+ "collapsed_sections": []
+ },
+ "kernelspec": {
+ "name": "ir",
+ "display_name": "R"
+ },
+ "language_info": {
+ "name": "R"
+ },
+ "coopTranslator": {
+ "original_hash": "2621e24705e8100893c9bf84e0fc8aef",
+ "translation_date": "2025-08-29T23:59:26+00:00",
+ "source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
+ "language_code": "br"
+ }
+ },
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# Construir um modelo de classificação: Deliciosas culinárias asiáticas e indianas\n"
+ ],
+ "metadata": {
+ "id": "ItETB4tSFprR"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## Introdução à classificação: Limpe, prepare e visualize seus dados\n",
+ "\n",
+ "Nestes quatro módulos, você explorará um dos focos fundamentais do aprendizado de máquina clássico - *classificação*. Vamos explorar o uso de vários algoritmos de classificação com um conjunto de dados sobre as brilhantes culinárias da Ásia e da Índia. Espero que você esteja com fome!\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Comemore as culinárias pan-asiáticas nestas lições! Imagem de Jen Looper\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "Classificação é uma forma de [aprendizado supervisionado](https://wikipedia.org/wiki/Supervised_learning) que tem muito em comum com técnicas de regressão. Na classificação, você treina um modelo para prever a qual `categoria` um item pertence. Se o aprendizado de máquina é sobre prever valores ou nomes para coisas usando conjuntos de dados, então a classificação geralmente se divide em dois grupos: *classificação binária* e *classificação multiclasses*.\n",
+ "\n",
+ "Lembre-se:\n",
+ "\n",
+ "- **Regressão linear** ajudou você a prever relações entre variáveis e fazer previsões precisas sobre onde um novo ponto de dados se encaixaria em relação a essa linha. Por exemplo, você poderia prever valores numéricos como *qual seria o preço de uma abóbora em setembro vs. dezembro*.\n",
+ "\n",
+ "- **Regressão logística** ajudou você a descobrir \"categorias binárias\": neste ponto de preço, *essa abóbora é laranja ou não-laranja*?\n",
+ "\n",
+ "A classificação utiliza vários algoritmos para determinar outras formas de identificar o rótulo ou a classe de um ponto de dados. Vamos trabalhar com esses dados de culinária para ver se, ao observar um grupo de ingredientes, conseguimos determinar sua origem culinária.\n",
+ "\n",
+ "### [**Questionário pré-aula**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
+ "\n",
+ "### **Introdução**\n",
+ "\n",
+ "A classificação é uma das atividades fundamentais do pesquisador de aprendizado de máquina e do cientista de dados. Desde a classificação básica de um valor binário (\"este e-mail é spam ou não?\") até a classificação e segmentação complexa de imagens usando visão computacional, é sempre útil ser capaz de organizar dados em classes e fazer perguntas sobre eles.\n",
+ "\n",
+ "Para descrever o processo de forma mais científica, seu método de classificação cria um modelo preditivo que permite mapear a relação entre variáveis de entrada e variáveis de saída.\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Problemas binários vs. multiclasses para algoritmos de classificação. Infográfico por Jen Looper\n",
+ "\n",
+ "\n",
+ "\n",
+ "Antes de começar o processo de limpeza dos dados, visualizá-los e prepará-los para nossas tarefas de aprendizado de máquina, vamos aprender um pouco sobre as várias maneiras pelas quais o aprendizado de máquina pode ser usado para classificar dados.\n",
+ "\n",
+ "Derivada da [estatística](https://wikipedia.org/wiki/Statistical_classification), a classificação usando aprendizado de máquina clássico utiliza características, como `fumante`, `peso` e `idade`, para determinar a *probabilidade de desenvolver X doença*. Como uma técnica de aprendizado supervisionado semelhante aos exercícios de regressão que você realizou anteriormente, seus dados são rotulados e os algoritmos de aprendizado de máquina usam esses rótulos para classificar e prever classes (ou 'características') de um conjunto de dados e atribuí-las a um grupo ou resultado.\n",
+ "\n",
+ "✅ Tire um momento para imaginar um conjunto de dados sobre culinárias. O que um modelo multiclasses seria capaz de responder? O que um modelo binário seria capaz de responder? E se você quisesse determinar se uma determinada culinária provavelmente usa feno-grego? E se você quisesse ver se, dado um presente de uma sacola de compras cheia de anis-estrelado, alcachofras, couve-flor e raiz-forte, você poderia criar um prato típico indiano?\n",
+ "\n",
+ "### **Olá 'classificador'**\n",
+ "\n",
+ "A pergunta que queremos fazer sobre este conjunto de dados de culinária é, na verdade, uma questão **multiclasses**, já que temos várias possíveis culinárias nacionais para trabalhar. Dado um lote de ingredientes, a qual dessas muitas classes os dados se encaixam?\n",
+ "\n",
+ "O Tidymodels oferece vários algoritmos diferentes para classificar dados, dependendo do tipo de problema que você deseja resolver. Nas próximas duas lições, você aprenderá sobre alguns desses algoritmos.\n",
+ "\n",
+ "#### **Pré-requisito**\n",
+ "\n",
+ "Para esta lição, precisaremos dos seguintes pacotes para limpar, preparar e visualizar nossos dados:\n",
+ "\n",
+ "- `tidyverse`: O [tidyverse](https://www.tidyverse.org/) é uma [coleção de pacotes R](https://www.tidyverse.org/packages) projetada para tornar a ciência de dados mais rápida, fácil e divertida!\n",
+ "\n",
+ "- `tidymodels`: O [tidymodels](https://www.tidymodels.org/) é uma [coleção de pacotes](https://www.tidymodels.org/packages/) para modelagem e aprendizado de máquina.\n",
+ "\n",
+ "- `DataExplorer`: O [pacote DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) foi criado para simplificar e automatizar o processo de análise exploratória de dados (EDA) e a geração de relatórios.\n",
+ "\n",
+ "- `themis`: O [pacote themis](https://themis.tidymodels.org/) fornece etapas extras de receitas para lidar com dados desbalanceados.\n",
+ "\n",
+ "Você pode instalá-los com:\n",
+ "\n",
+ "`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
+ "\n",
+ "Alternativamente, o script abaixo verifica se você possui os pacotes necessários para completar este módulo e os instala para você caso estejam ausentes.\n"
+ ],
+ "metadata": {
+ "id": "ri5bQxZ-Fz_0"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
+ "\r\n",
+ "pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "KIPxa4elGAPI"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Vamos carregar esses pacotes incríveis mais tarde e torná-los disponíveis na nossa sessão atual do R. (Isso é apenas para ilustração, `pacman::p_load()` já fez isso por você)\n"
+ ],
+ "metadata": {
+ "id": "YkKAxOJvGD4C"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## Exercício - limpar e balancear seus dados\n",
+ "\n",
+ "A primeira tarefa, antes de começar este projeto, é limpar e **balancear** seus dados para obter melhores resultados.\n",
+ "\n",
+ "Vamos conhecer os dados! 🕵️\n"
+ ],
+ "metadata": {
+ "id": "PFkQDlk0GN5O"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Import data\r\n",
+ "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
+ "\r\n",
+ "# View the first 5 rows\r\n",
+ "df %>% \r\n",
+ " slice_head(n = 5)\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "Qccw7okxGT0S"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Interessante! Pelo que parece, a primeira coluna é um tipo de coluna `id`. Vamos obter um pouco mais de informações sobre os dados.\n"
+ ],
+ "metadata": {
+ "id": "XrWnlgSrGVmR"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Basic information about the data\r\n",
+ "df %>%\r\n",
+ " introduce()\r\n",
+ "\r\n",
+ "# Visualize basic information above\r\n",
+ "df %>% \r\n",
+ " plot_intro(ggtheme = theme_light())"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "4UcGmxRxGieA"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "A partir do resultado, podemos ver imediatamente que temos `2448` linhas, `385` colunas e `0` valores ausentes. Também temos 1 coluna discreta, *cuisine*.\n",
+ "\n",
+ "## Exercício - aprendendo sobre culinárias\n",
+ "\n",
+ "Agora o trabalho começa a ficar mais interessante. Vamos descobrir a distribuição dos dados por tipo de culinária.\n"
+ ],
+ "metadata": {
+ "id": "AaPubl__GmH5"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Count observations per cuisine\r\n",
+ "df %>% \r\n",
+ " count(cuisine) %>% \r\n",
+ " arrange(n)\r\n",
+ "\r\n",
+ "# Plot the distribution\r\n",
+ "theme_set(theme_light())\r\n",
+ "df %>% \r\n",
+ " count(cuisine) %>% \r\n",
+ " ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
+ " geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
+ " ylab(\"cuisine\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "FRsBVy5eGrrv"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Existem um número finito de culinárias, mas a distribuição dos dados é desigual. Você pode corrigir isso! Antes de fazer isso, explore um pouco mais.\n",
+ "\n",
+ "Em seguida, vamos atribuir cada culinária ao seu próprio tibble e descobrir quantos dados estão disponíveis (linhas, colunas) por culinária.\n",
+ "\n",
+ "> Um [tibble](https://tibble.tidyverse.org/) é uma versão moderna de um data frame.\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Ilustração por @allison_horst\n"
+ ],
+ "metadata": {
+ "id": "vVvyDb1kG2in"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Create individual tibble for the cuisines\r\n",
+ "thai_df <- df %>% \r\n",
+ " filter(cuisine == \"thai\")\r\n",
+ "japanese_df <- df %>% \r\n",
+ " filter(cuisine == \"japanese\")\r\n",
+ "chinese_df <- df %>% \r\n",
+ " filter(cuisine == \"chinese\")\r\n",
+ "indian_df <- df %>% \r\n",
+ " filter(cuisine == \"indian\")\r\n",
+ "korean_df <- df %>% \r\n",
+ " filter(cuisine == \"korean\")\r\n",
+ "\r\n",
+ "\r\n",
+ "# Find out how much data is available per cuisine\r\n",
+ "cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
+ " \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
+ " \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
+ " \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
+ " \"korean_df:\", dim(korean_df))"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "0TvXUxD3G8Bk"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## **Exercício - Descobrindo os principais ingredientes por culinária usando dplyr**\n",
+ "\n",
+ "Agora você pode explorar mais profundamente os dados e descobrir quais são os ingredientes típicos de cada culinária. É importante limpar dados recorrentes que criam confusão entre as culinárias, então vamos aprender sobre esse problema.\n",
+ "\n",
+ "Crie uma função `create_ingredient()` em R que retorne um dataframe de ingredientes. Essa função começará eliminando uma coluna pouco útil e organizará os ingredientes por sua contagem.\n",
+ "\n",
+ "A estrutura básica de uma função em R é:\n",
+ "\n",
+ "`myFunction <- function(arglist){`\n",
+ "\n",
+ "**`...`**\n",
+ "\n",
+ "**`return`**`(value)`\n",
+ "\n",
+ "`}`\n",
+ "\n",
+ "Uma introdução prática às funções em R pode ser encontrada [aqui](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
+ "\n",
+ "Vamos direto ao ponto! Faremos uso dos [verbos do dplyr](https://dplyr.tidyverse.org/) que aprendemos em nossas lições anteriores. Para relembrar:\n",
+ "\n",
+ "- `dplyr::select()`: ajuda você a escolher quais **colunas** manter ou excluir.\n",
+ "\n",
+ "- `dplyr::pivot_longer()`: ajuda a \"alongar\" os dados, aumentando o número de linhas e diminuindo o número de colunas.\n",
+ "\n",
+ "- `dplyr::group_by()` e `dplyr::summarise()`: ajudam você a encontrar estatísticas resumidas para diferentes grupos e colocá-las em uma tabela organizada.\n",
+ "\n",
+ "- `dplyr::filter()`: cria um subconjunto dos dados contendo apenas as linhas que satisfazem suas condições.\n",
+ "\n",
+ "- `dplyr::mutate()`: ajuda você a criar ou modificar colunas.\n",
+ "\n",
+ "Confira este [tutorial *artístico* do learnr](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) de Allison Horst, que apresenta algumas funções úteis de manipulação de dados no dplyr *(parte do Tidyverse)*.\n"
+ ],
+ "metadata": {
+ "id": "K3RF5bSCHC76"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Creates a functions that returns the top ingredients by class\r\n",
+ "\r\n",
+ "create_ingredient <- function(df){\r\n",
+ " \r\n",
+ " # Drop the id column which is the first colum\r\n",
+ " ingredient_df = df %>% select(-1) %>% \r\n",
+ " # Transpose data to a long format\r\n",
+ " pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
+ " # Find the top most ingredients for a particular cuisine\r\n",
+ " group_by(ingredients) %>% \r\n",
+ " summarise(n_instances = sum(count)) %>% \r\n",
+ " filter(n_instances != 0) %>% \r\n",
+ " # Arrange by descending order\r\n",
+ " arrange(desc(n_instances)) %>% \r\n",
+ " mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
+ " \r\n",
+ " \r\n",
+ " return(ingredient_df)\r\n",
+ "} # End of function"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "uB_0JR82HTPa"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Agora podemos usar a função para ter uma ideia dos dez ingredientes mais populares por culinária. Vamos testá-la com `thai_df`.\n"
+ ],
+ "metadata": {
+ "id": "h9794WF8HWmc"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Call create_ingredient and display popular ingredients\r\n",
+ "thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
+ "\r\n",
+ "thai_ingredient_df %>% \r\n",
+ " slice_head(n = 10)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "agQ-1HrcHaEA"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Na seção anterior, usamos `geom_col()`, vamos ver como você pode usar `geom_bar` também, para criar gráficos de barras. Use `?geom_bar` para leitura adicional.\n"
+ ],
+ "metadata": {
+ "id": "kHu9ffGjHdcX"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Make a bar chart for popular thai cuisines\r\n",
+ "thai_ingredient_df %>% \r\n",
+ " slice_head(n = 10) %>% \r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
+ " xlab(\"\") + ylab(\"\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "fb3Bx_3DHj6e"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "RHP_xgdkHnvM"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
+ "create_ingredient(df = japanese_df) %>% \r\n",
+ " slice_head(n = 10) %>%\r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
+ " xlab(\"\") + ylab(\"\")\r\n"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "019v8F0XHrRU"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "E quanto às culinárias chinesas?\n"
+ ],
+ "metadata": {
+ "id": "iIGM7vO8Hu3v"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
+ "create_ingredient(df = chinese_df) %>% \r\n",
+ " slice_head(n = 10) %>%\r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
+ " xlab(\"\") + ylab(\"\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "lHd9_gd2HyzU"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "ir8qyQbNH1c7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Get popular ingredients for Indian cuisines and make bar chart\r\n",
+ "create_ingredient(df = indian_df) %>% \r\n",
+ " slice_head(n = 10) %>%\r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
+ " xlab(\"\") + ylab(\"\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "ApukQtKjH5FO"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "qv30cwY1H-FM"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Get popular ingredients for Korean cuisines and make bar chart\r\n",
+ "create_ingredient(df = korean_df) %>% \r\n",
+ " slice_head(n = 10) %>%\r\n",
+ " ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
+ " geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
+ " xlab(\"\") + ylab(\"\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "lumgk9cHIBie"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "A partir das visualizações de dados, agora podemos remover os ingredientes mais comuns que geram confusão entre diferentes culinárias, usando `dplyr::select()`.\n",
+ "\n",
+ "Todo mundo adora arroz, alho e gengibre!\n"
+ ],
+ "metadata": {
+ "id": "iO4veMXuIEta"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Drop id column, rice, garlic and ginger from our original data set\r\n",
+ "df_select <- df %>% \r\n",
+ " select(-c(1, rice, garlic, ginger))\r\n",
+ "\r\n",
+ "# Display new data set\r\n",
+ "df_select %>% \r\n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "iHJPiG6rIUcK"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## Pré-processamento de dados usando recipes 👩🍳👨🍳 - Lidando com dados desbalanceados ⚖️\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Arte por @allison_horst\n",
+ "\n",
+ "Dado que esta lição é sobre culinárias, precisamos colocar `recipes` em contexto.\n",
+ "\n",
+ "Tidymodels oferece mais um pacote interessante: `recipes` - um pacote para pré-processamento de dados.\n"
+ ],
+ "metadata": {
+ "id": "kkFd-JxdIaL6"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Vamos dar uma olhada novamente na distribuição das nossas culinárias.\n"
+ ],
+ "metadata": {
+ "id": "6l2ubtTPJAhY"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Distribution of cuisines\r\n",
+ "old_label_count <- df_select %>% \r\n",
+ " count(cuisine) %>% \r\n",
+ " arrange(desc(n))\r\n",
+ "\r\n",
+ "old_label_count"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "1e-E9cb7JDVi"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Como você pode ver, há uma distribuição bastante desigual no número de culinárias. Culinárias coreanas são quase 3 vezes mais numerosas que as culinárias tailandesas. Dados desequilibrados frequentemente têm efeitos negativos no desempenho do modelo. Pense em uma classificação binária. Se a maior parte dos seus dados pertence a uma classe, um modelo de aprendizado de máquina vai prever essa classe com mais frequência, simplesmente porque há mais dados para ela. Balancear os dados corrige qualquer desequilíbrio e ajuda a remover essa disparidade. Muitos modelos apresentam melhor desempenho quando o número de observações é igual e, por isso, tendem a ter dificuldades com dados desequilibrados.\n",
+ "\n",
+ "Existem basicamente duas maneiras de lidar com conjuntos de dados desequilibrados:\n",
+ "\n",
+ "- adicionar observações à classe minoritária: `Over-sampling`, por exemplo, usando um algoritmo SMOTE\n",
+ "\n",
+ "- remover observações da classe majoritária: `Under-sampling`\n",
+ "\n",
+ "Agora vamos demonstrar como lidar com conjuntos de dados desequilibrados usando uma `receita`. Uma receita pode ser vista como um plano que descreve quais etapas devem ser aplicadas a um conjunto de dados para prepará-lo para análise.\n"
+ ],
+ "metadata": {
+ "id": "soAw6826JKx9"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Load themis package for dealing with imbalanced data\r\n",
+ "library(themis)\r\n",
+ "\r\n",
+ "# Create a recipe for preprocessing data\r\n",
+ "cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
+ " step_smote(cuisine)\r\n",
+ "\r\n",
+ "cuisines_recipe"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "HS41brUIJVJy"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Vamos detalhar nossas etapas de pré-processamento.\n",
+ "\n",
+ "- A chamada para `recipe()` com uma fórmula informa à receita os *papéis* das variáveis usando os dados de `df_select` como referência. Por exemplo, a coluna `cuisine` foi atribuída ao papel de `outcome`, enquanto o restante das colunas foi atribuído ao papel de `predictor`.\n",
+ "\n",
+ "- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) cria uma *especificação* de uma etapa da receita que gera sinteticamente novos exemplos da classe minoritária usando os vizinhos mais próximos desses casos.\n",
+ "\n",
+ "Agora, se quisermos ver os dados pré-processados, precisamos [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) e [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) nossa receita.\n",
+ "\n",
+ "`prep()`: estima os parâmetros necessários a partir de um conjunto de treinamento que podem ser aplicados posteriormente a outros conjuntos de dados.\n",
+ "\n",
+ "`bake()`: aplica uma receita preparada às operações em qualquer conjunto de dados.\n"
+ ],
+ "metadata": {
+ "id": "Yb-7t7XcJaC8"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Prep and bake the recipe\r\n",
+ "preprocessed_df <- cuisines_recipe %>% \r\n",
+ " prep() %>% \r\n",
+ " bake(new_data = NULL) %>% \r\n",
+ " relocate(cuisine)\r\n",
+ "\r\n",
+ "# Display data\r\n",
+ "preprocessed_df %>% \r\n",
+ " slice_head(n = 5)\r\n",
+ "\r\n",
+ "# Quick summary stats\r\n",
+ "preprocessed_df %>% \r\n",
+ " introduce()"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "9QhSgdpxJl44"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Vamos agora verificar a distribuição de nossas culinárias e compará-las com os dados desequilibrados.\n"
+ ],
+ "metadata": {
+ "id": "dmidELh_LdV7"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Distribution of cuisines\r\n",
+ "new_label_count <- preprocessed_df %>% \r\n",
+ " count(cuisine) %>% \r\n",
+ " arrange(desc(n))\r\n",
+ "\r\n",
+ "list(new_label_count = new_label_count,\r\n",
+ " old_label_count = old_label_count)"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "aSh23klBLwDz"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Yum! Os dados estão limpos, balanceados e muito deliciosos 😋!\n",
+ "\n",
+ "> Normalmente, uma receita é usada como um pré-processador para modelagem, onde define quais etapas devem ser aplicadas a um conjunto de dados para prepará-lo para a modelagem. Nesse caso, um `workflow()` é tipicamente usado (como já vimos em nossas aulas anteriores) em vez de estimar manualmente uma receita.\n",
+ ">\n",
+ "> Assim, você geralmente não precisa usar **`prep()`** e **`bake()`** em receitas quando utiliza o tidymodels, mas essas são funções úteis para ter em sua caixa de ferramentas para confirmar que as receitas estão fazendo o que você espera, como no nosso caso.\n",
+ ">\n",
+ "> Quando você usa **`bake()`** em uma receita preparada com **`new_data = NULL`**, você obtém de volta os dados que forneceu ao definir a receita, mas já processados pelas etapas de pré-processamento.\n",
+ "\n",
+ "Agora vamos salvar uma cópia desses dados para uso em aulas futuras:\n"
+ ],
+ "metadata": {
+ "id": "HEu80HZ8L7ae"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "source": [
+ "# Save preprocessed data\r\n",
+ "write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
+ ],
+ "outputs": [],
+ "metadata": {
+ "id": "cBmCbIgrMOI6"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Este novo CSV agora pode ser encontrado na pasta raiz de dados.\n",
+ "\n",
+ "**🚀Desafio**\n",
+ "\n",
+ "Este currículo contém vários conjuntos de dados interessantes. Explore as pastas `data` e veja se alguma contém conjuntos de dados que seriam apropriados para classificação binária ou multi-classes. Que perguntas você faria sobre este conjunto de dados?\n",
+ "\n",
+ "## [**Quiz pós-aula**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
+ "\n",
+ "## **Revisão e Autoestudo**\n",
+ "\n",
+ "- Confira o [pacote themis](https://github.com/tidymodels/themis). Quais outras técnicas poderíamos usar para lidar com dados desbalanceados?\n",
+ "\n",
+ "- Site de referência dos modelos Tidy: [Tidy models](https://www.tidymodels.org/start/).\n",
+ "\n",
+ "- H. Wickham e G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
+ "\n",
+ "#### AGRADECIMENTOS A:\n",
+ "\n",
+ "[`Allison Horst`](https://twitter.com/allison_horst/) por criar as ilustrações incríveis que tornam o R mais acolhedor e envolvente. Encontre mais ilustrações na sua [galeria](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
+ "\n",
+ "[Cassie Breviu](https://www.twitter.com/cassieview) e [Jen Looper](https://www.twitter.com/jenlooper) por criarem a versão original em Python deste módulo ♥️\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Arte por @allison_horst\n"
+ ],
+ "metadata": {
+ "id": "WQs5621pMGwf"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n---\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.\n"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/translations/br/4-Classification/1-Introduction/solution/notebook.ipynb b/translations/br/4-Classification/1-Introduction/solution/notebook.ipynb
new file mode 100644
index 000000000..b568c29bc
--- /dev/null
+++ b/translations/br/4-Classification/1-Introduction/solution/notebook.ipynb
@@ -0,0 +1,707 @@
+{
+ "cells": [
+ {
+ "source": [
+ "# Deliciosas Culinárias Asiáticas e Indianas\n",
+ "\n",
+ "## Introdução\n",
+ "\n",
+ "A culinária asiática e indiana é conhecida por seus sabores ricos, ingredientes frescos e técnicas de preparo únicas. Este guia oferece uma visão geral de alguns pratos populares e dicas para prepará-los em casa.\n",
+ "\n",
+ "## Pratos Asiáticos Populares\n",
+ "\n",
+ "### Sushi\n",
+ "O sushi é um prato japonês que combina arroz temperado com vinagre e uma variedade de ingredientes, como peixe cru, vegetais e algas. É uma arte que exige prática, mas os resultados valem a pena.\n",
+ "\n",
+ "### Pad Thai\n",
+ "Pad Thai é um prato tailandês feito com macarrão de arroz, camarão ou frango, ovos, amendoim e molho de tamarindo. É uma combinação perfeita de sabores doces, azedos e salgados.\n",
+ "\n",
+ "### Dim Sum\n",
+ "Dim Sum é uma seleção de pequenos pratos chineses, geralmente servidos com chá. Inclui opções como bolinhos recheados, pãezinhos no vapor e rolinhos primavera.\n",
+ "\n",
+ "## Pratos Indianos Populares\n",
+ "\n",
+ "### Curry\n",
+ "Os curries indianos são conhecidos por suas misturas de especiarias, como cúrcuma, cominho e coentro. Eles podem ser feitos com vegetais, frango, carne ou frutos do mar.\n",
+ "\n",
+ "### Naan\n",
+ "Naan é um pão indiano macio e levemente tostado, geralmente servido como acompanhamento de curries. Pode ser simples ou recheado com alho, queijo ou outros ingredientes.\n",
+ "\n",
+ "### Biryani\n",
+ "Biryani é um prato de arroz aromático, preparado com especiarias, carne ou vegetais. É um prato único que combina sabores intensos e texturas variadas.\n",
+ "\n",
+ "## Dicas para Cozinhar em Casa\n",
+ "\n",
+ "- **Use ingredientes frescos:** A qualidade dos ingredientes faz toda a diferença no sabor final.\n",
+ "- **Experimente especiarias:** Não tenha medo de ajustar as especiarias ao seu gosto.\n",
+ "- **Pratique técnicas tradicionais:** Algumas receitas exigem métodos específicos, como cozinhar no vapor ou grelhar.\n",
+ "\n",
+ "## Conclusão\n",
+ "\n",
+ "Cozinhar pratos asiáticos e indianos em casa pode ser uma experiência gratificante e deliciosa. Com um pouco de prática e os ingredientes certos, você pode trazer os sabores autênticos dessas culinárias para sua mesa.\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "source": [
+ "Instale o Imblearn, que permitirá o SMOTE. Este é um pacote do Scikit-learn que ajuda a lidar com dados desbalanceados ao realizar classificação. (https://imbalanced-learn.org/stable/)\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Requirement already satisfied: imblearn in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (0.0)\n",
+ "Requirement already satisfied: imbalanced-learn in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imblearn) (0.8.0)\n",
+ "Requirement already satisfied: numpy>=1.13.3 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (1.19.2)\n",
+ "Requirement already satisfied: scipy>=0.19.1 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (1.4.1)\n",
+ "Requirement already satisfied: scikit-learn>=0.24 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (0.24.2)\n",
+ "Requirement already satisfied: joblib>=0.11 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from imbalanced-learn->imblearn) (0.16.0)\n",
+ "Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (from scikit-learn>=0.24->imbalanced-learn->imblearn) (2.1.0)\n",
+ "\u001b[33mWARNING: You are using pip version 20.2.3; however, version 21.1.2 is available.\n",
+ "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 -m pip install --upgrade pip' command.\u001b[0m\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "pip install imblearn"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib as mpl\n",
+ "import numpy as np\n",
+ "from imblearn.over_sampling import SMOTE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.read_csv('../../data/cuisines.csv')"
+ ]
+ },
+ {
+ "source": [
+ "Este conjunto de dados inclui 385 colunas indicando todos os tipos de ingredientes em várias culinárias de um conjunto específico de culinárias.\n"
+ ],
+ "cell_type": "markdown",
+ "metadata": {}
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ " Unnamed: 0 cuisine almond angelica anise anise_seed apple \\\n",
+ "0 65 indian 0 0 0 0 0 \n",
+ "1 66 indian 1 0 0 0 0 \n",
+ "2 67 indian 0 0 0 0 0 \n",
+ "3 68 indian 0 0 0 0 0 \n",
+ "4 69 indian 0 0 0 0 0 \n",
+ "\n",
+ " apple_brandy apricot armagnac ... whiskey white_bread white_wine \\\n",
+ "0 0 0 0 ... 0 0 0 \n",
+ "1 0 0 0 ... 0 0 0 \n",
+ "2 0 0 0 ... 0 0 0 \n",
+ "3 0 0 0 ... 0 0 0 \n",
+ "4 0 0 0 ... 0 0 0 \n",
+ "\n",
+ " whole_grain_wheat_flour wine wood yam yeast yogurt zucchini \n",
+ "0 0 0 0 0 0 0 0 \n",
+ "1 0 0 0 0 0 0 0 \n",
+ "2 0 0 0 0 0 0 0 \n",
+ "3 0 0 0 0 0 0 0 \n",
+ "4 0 0 0 0 0 1 0 \n",
+ "\n",
+ "[5 rows x 385 columns]"
+ ],
+ "text/html": "
\n"
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 535
+ },
+ "id": "w5FWIkEiIjdN",
+ "outputId": "2e195fd9-1a8f-4b91-9573-cce5582242df"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 2. Lidando com dados desbalanceados\n",
+ "\n",
+ "Como você deve ter notado no conjunto de dados original, assim como no nosso conjunto de treinamento, há uma distribuição bastante desigual no número de tipos de culinária. Culinárias coreanas são *quase* 3 vezes mais numerosas que as culinárias tailandesas. Dados desbalanceados frequentemente têm efeitos negativos no desempenho do modelo. Muitos modelos apresentam melhor desempenho quando o número de observações é igual e, por isso, tendem a ter dificuldades com dados desbalanceados.\n",
+ "\n",
+ "Existem basicamente duas maneiras de lidar com conjuntos de dados desbalanceados:\n",
+ "\n",
+ "- adicionar observações à classe minoritária: `Over-sampling`, por exemplo, usando um algoritmo SMOTE, que gera novos exemplos da classe minoritária de forma sintética, utilizando os vizinhos mais próximos desses casos.\n",
+ "\n",
+ "- remover observações da classe majoritária: `Under-sampling`\n",
+ "\n",
+ "Na nossa lição anterior, demonstramos como lidar com conjuntos de dados desbalanceados usando um `recipe`. Um recipe pode ser pensado como um plano que descreve quais etapas devem ser aplicadas a um conjunto de dados para prepará-lo para análise. No nosso caso, queremos ter uma distribuição igual no número de nossas culinárias para o nosso `conjunto de treinamento`. Vamos direto ao ponto.\n"
+ ],
+ "metadata": {
+ "id": "daBi9qJNIwqW"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "source": [
+ "# Load themis package for dealing with imbalanced data\r\n",
+ "library(themis)\r\n",
+ "\r\n",
+ "# Create a recipe for preprocessing training data\r\n",
+ "cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>% \r\n",
+ " step_smote(cuisine)\r\n",
+ "\r\n",
+ "# Print recipe\r\n",
+ "cuisines_recipe"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "Data Recipe\n",
+ "\n",
+ "Inputs:\n",
+ "\n",
+ " role #variables\n",
+ " outcome 1\n",
+ " predictor 380\n",
+ "\n",
+ "Operations:\n",
+ "\n",
+ "SMOTE based on cuisine"
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 200
+ },
+ "id": "Az6LFBGxI1X0",
+ "outputId": "29d71d85-64b0-4e62-871e-bcd5398573b6"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Você pode, é claro, confirmar (usando prep+bake) que a receita funcionará como esperado - todas as etiquetas de culinária terão `559` observações.\n",
+ "\n",
+ "Como usaremos essa receita como um pré-processador para modelagem, um `workflow()` fará todo o preparo e execução para nós, então não precisaremos estimar a receita manualmente.\n",
+ "\n",
+ "Agora estamos prontos para treinar um modelo 👩💻👨💻!\n",
+ "\n",
+ "## 3. Escolhendo seu classificador\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Arte por @allison_horst\n"
+ ],
+ "metadata": {
+ "id": "NBL3PqIWJBBB"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Agora precisamos decidir qual algoritmo usar para a tarefa 🤔.\n",
+ "\n",
+ "No Tidymodels, o [`pacote parsnip`](https://parsnip.tidymodels.org/index.html) fornece uma interface consistente para trabalhar com modelos em diferentes engines (pacotes). Consulte a documentação do parsnip para explorar [tipos de modelos e engines](https://www.tidymodels.org/find/parsnip/#models) e seus correspondentes [argumentos de modelo](https://www.tidymodels.org/find/parsnip/#model-args). A variedade pode parecer bastante confusa à primeira vista. Por exemplo, os seguintes métodos incluem técnicas de classificação:\n",
+ "\n",
+ "- Modelos de Classificação Baseados em Regras C5.0\n",
+ "\n",
+ "- Modelos de Discriminante Flexível\n",
+ "\n",
+ "- Modelos de Discriminante Linear\n",
+ "\n",
+ "- Modelos de Discriminante Regularizado\n",
+ "\n",
+ "- Modelos de Regressão Logística\n",
+ "\n",
+ "- Modelos de Regressão Multinomial\n",
+ "\n",
+ "- Modelos de Naive Bayes\n",
+ "\n",
+ "- Máquinas de Vetores de Suporte (SVM)\n",
+ "\n",
+ "- Vizinhos Mais Próximos\n",
+ "\n",
+ "- Árvores de Decisão\n",
+ "\n",
+ "- Métodos de Ensemble\n",
+ "\n",
+ "- Redes Neurais\n",
+ "\n",
+ "E a lista continua!\n",
+ "\n",
+ "### **Qual classificador escolher?**\n",
+ "\n",
+ "Então, qual classificador você deve escolher? Muitas vezes, testar vários e procurar por um bom resultado é uma forma de experimentar.\n",
+ "\n",
+ "> O AutoML resolve esse problema de forma prática ao executar essas comparações na nuvem, permitindo que você escolha o melhor algoritmo para seus dados. Experimente [aqui](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott)\n",
+ "\n",
+ "Além disso, a escolha do classificador depende do nosso problema. Por exemplo, quando o resultado pode ser categorizado em `mais de duas classes`, como no nosso caso, você deve usar um `algoritmo de classificação multiclasse` em vez de `classificação binária.`\n",
+ "\n",
+ "### **Uma abordagem melhor**\n",
+ "\n",
+ "Uma abordagem melhor do que simplesmente adivinhar é seguir as ideias deste [guia de referência rápida de ML](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott), que pode ser baixado. Aqui, descobrimos que, para o nosso problema de classificação multiclasse, temos algumas opções:\n",
+ "\n",
+ "
\n",
+ " \n",
+ " Uma seção do Guia de Algoritmos da Microsoft, detalhando opções de classificação multiclasse\n"
+ ],
+ "metadata": {
+ "id": "a6DLAZ3vJZ14"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### **Raciocínio**\n",
+ "\n",
+ "Vamos analisar diferentes abordagens dadas as restrições que temos:\n",
+ "\n",
+ "- **Redes neurais profundas são muito pesadas**. Dado nosso conjunto de dados limpo, mas minimalista, e o fato de que estamos executando o treinamento localmente via notebooks, redes neurais profundas são muito pesadas para esta tarefa.\n",
+ "\n",
+ "- **Sem classificador de duas classes**. Não utilizamos um classificador de duas classes, o que elimina a abordagem um-contra-todos.\n",
+ "\n",
+ "- **Árvore de decisão ou regressão logística podem funcionar**. Uma árvore de decisão pode funcionar, ou regressão multinomial/regressão logística multiclasses para dados multiclasses.\n",
+ "\n",
+ "- **Árvores de decisão impulsionadas multiclasses resolvem outro problema**. A árvore de decisão impulsionada multiclasses é mais adequada para tarefas não paramétricas, como tarefas projetadas para construir rankings, então não é útil para nós.\n",
+ "\n",
+ "Além disso, normalmente antes de embarcar em modelos de aprendizado de máquina mais complexos, como métodos de ensemble, é uma boa ideia construir o modelo mais simples possível para ter uma ideia do que está acontecendo. Então, para esta lição, começaremos com um modelo de `regressão multinomial`.\n",
+ "\n",
+ "> Regressão logística é uma técnica usada quando a variável de resultado é categórica (ou nominal). Para regressão logística binária, o número de variáveis de resultado é dois, enquanto o número de variáveis de resultado para regressão logística multinomial é mais de dois. Veja [Métodos Avançados de Regressão](https://bookdown.org/chua/ber642_advanced_regression/multinomial-logistic-regression.html) para leitura adicional.\n",
+ "\n",
+ "## 4. Treinar e avaliar um modelo de regressão logística multinomial.\n",
+ "\n",
+ "No Tidymodels, `parsnip::multinom_reg()`, define um modelo que usa preditores lineares para prever dados multiclasses usando a distribuição multinomial. Veja `?multinom_reg()` para as diferentes formas/motores que você pode usar para ajustar este modelo.\n",
+ "\n",
+ "Neste exemplo, ajustaremos um modelo de regressão multinomial via o motor padrão [nnet](https://cran.r-project.org/web/packages/nnet/nnet.pdf).\n",
+ "\n",
+ "> Escolhi um valor para `penalty` meio que aleatoriamente. Existem maneiras melhores de escolher este valor, como usar `reamostragem` e `ajustar` o modelo, que discutiremos mais tarde.\n",
+ ">\n",
+ "> Veja [Tidymodels: Introdução](https://www.tidymodels.org/start/tuning/) caso queira aprender mais sobre como ajustar os hiperparâmetros do modelo.\n"
+ ],
+ "metadata": {
+ "id": "gWMsVcbBJemu"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "source": [
+ "# Create a multinomial regression model specification\r\n",
+ "mr_spec <- multinom_reg(penalty = 1) %>% \r\n",
+ " set_engine(\"nnet\", MaxNWts = 2086) %>% \r\n",
+ " set_mode(\"classification\")\r\n",
+ "\r\n",
+ "# Print model specification\r\n",
+ "mr_spec"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "Multinomial Regression Model Specification (classification)\n",
+ "\n",
+ "Main Arguments:\n",
+ " penalty = 1\n",
+ "\n",
+ "Engine-Specific Arguments:\n",
+ " MaxNWts = 2086\n",
+ "\n",
+ "Computational engine: nnet \n"
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 166
+ },
+ "id": "Wq_fcyQiJvfG",
+ "outputId": "c30449c7-3864-4be7-f810-72a003743e2d"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Ótimo trabalho 🥳! Agora que temos uma receita e uma especificação de modelo, precisamos encontrar uma maneira de agrupá-los em um objeto que primeiro pré-processará os dados, depois ajustará o modelo nos dados pré-processados e também permitirá atividades de pós-processamento, se necessário. No Tidymodels, esse objeto conveniente é chamado de [`workflow`](https://workflows.tidymodels.org/) e organiza de forma prática os componentes do seu modelo! Isso é o que chamaríamos de *pipelines* em *Python*.\n",
+ "\n",
+ "Então, vamos reunir tudo em um workflow!📦\n"
+ ],
+ "metadata": {
+ "id": "NlSbzDfgJ0zh"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "source": [
+ "# Bundle recipe and model specification\r\n",
+ "mr_wf <- workflow() %>% \r\n",
+ " add_recipe(cuisines_recipe) %>% \r\n",
+ " add_model(mr_spec)\r\n",
+ "\r\n",
+ "# Print out workflow\r\n",
+ "mr_wf"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "══ Workflow ════════════════════════════════════════════════════════════════════\n",
+ "\u001b[3mPreprocessor:\u001b[23m Recipe\n",
+ "\u001b[3mModel:\u001b[23m multinom_reg()\n",
+ "\n",
+ "── Preprocessor ────────────────────────────────────────────────────────────────\n",
+ "1 Recipe Step\n",
+ "\n",
+ "• step_smote()\n",
+ "\n",
+ "── Model ───────────────────────────────────────────────────────────────────────\n",
+ "Multinomial Regression Model Specification (classification)\n",
+ "\n",
+ "Main Arguments:\n",
+ " penalty = 1\n",
+ "\n",
+ "Engine-Specific Arguments:\n",
+ " MaxNWts = 2086\n",
+ "\n",
+ "Computational engine: nnet \n"
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 333
+ },
+ "id": "Sc1TfPA4Ke3_",
+ "outputId": "82c70013-e431-4e7e-cef6-9fcf8aad4a6c"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Workflows 👌👌! Um **`workflow()`** pode ser ajustado de maneira muito semelhante a um modelo. Então, hora de treinar um modelo!\n"
+ ],
+ "metadata": {
+ "id": "TNQ8i85aKf9L"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "source": [
+ "# Train a multinomial regression model\n",
+ "mr_fit <- fit(object = mr_wf, data = cuisines_train)\n",
+ "\n",
+ "mr_fit"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "══ Workflow [trained] ══════════════════════════════════════════════════════════\n",
+ "\u001b[3mPreprocessor:\u001b[23m Recipe\n",
+ "\u001b[3mModel:\u001b[23m multinom_reg()\n",
+ "\n",
+ "── Preprocessor ────────────────────────────────────────────────────────────────\n",
+ "1 Recipe Step\n",
+ "\n",
+ "• step_smote()\n",
+ "\n",
+ "── Model ───────────────────────────────────────────────────────────────────────\n",
+ "Call:\n",
+ "nnet::multinom(formula = ..y ~ ., data = data, decay = ~1, MaxNWts = ~2086, \n",
+ " trace = FALSE)\n",
+ "\n",
+ "Coefficients:\n",
+ " (Intercept) almond angelica anise anise_seed apple\n",
+ "indian 0.19723325 0.2409661 0 -5.004955e-05 -0.1657635 -0.05769734\n",
+ "japanese 0.13961959 -0.6262400 0 -1.169155e-04 -0.4893596 -0.08585717\n",
+ "korean 0.22377347 -0.1833485 0 -5.560395e-05 -0.2489401 -0.15657804\n",
+ "thai -0.04336577 -0.6106258 0 4.903828e-04 -0.5782866 0.63451105\n",
+ " apple_brandy apricot armagnac artemisia artichoke asparagus\n",
+ "indian 0 0.37042636 0 -0.09122797 0 -0.27181970\n",
+ "japanese 0 0.28895643 0 -0.12651100 0 0.14054037\n",
+ "korean 0 -0.07981259 0 0.55756709 0 -0.66979948\n",
+ "thai 0 -0.33160904 0 -0.10725182 0 -0.02602152\n",
+ " avocado bacon baked_potato balm banana barley\n",
+ "indian -0.46624197 0.16008055 0 0 -0.2838796 0.2230625\n",
+ "japanese 0.90341344 0.02932727 0 0 -0.4142787 2.0953906\n",
+ "korean -0.06925382 -0.35804134 0 0 -0.2686963 -0.7233404\n",
+ "thai -0.21473955 -0.75594439 0 0 0.6784880 -0.4363320\n",
+ " bartlett_pear basil bay bean beech\n",
+ "indian 0 -0.7128756 0.1011587 -0.8777275 -0.0004380795\n",
+ "japanese 0 0.1288697 0.9425626 -0.2380748 0.3373437611\n",
+ "korean 0 -0.2445193 -0.4744318 -0.8957870 -0.0048784496\n",
+ "thai 0 1.5365848 0.1333256 0.2196970 -0.0113078024\n",
+ " beef beef_broth beef_liver beer beet\n",
+ "indian -0.7985278 0.2430186 -0.035598065 -0.002173738 0.01005813\n",
+ "japanese 0.2241875 -0.3653020 -0.139551027 0.128905553 0.04923911\n",
+ "korean 0.5366515 -0.6153237 0.213455197 -0.010828645 0.27325423\n",
+ "thai 0.1570012 -0.9364154 -0.008032213 -0.035063746 -0.28279823\n",
+ " bell_pepper bergamot berry bitter_orange black_bean\n",
+ "indian 0.49074330 0 0.58947607 0.191256164 -0.1945233\n",
+ "japanese 0.09074167 0 -0.25917977 -0.118915977 -0.3442400\n",
+ "korean -0.57876763 0 -0.07874180 -0.007729435 -0.5220672\n",
+ "thai 0.92554006 0 -0.07210196 -0.002983296 -0.4614426\n",
+ " black_currant black_mustard_seed_oil black_pepper black_raspberry\n",
+ "indian 0 0.38935801 -0.4453495 0\n",
+ "japanese 0 -0.05452887 -0.5440869 0\n",
+ "korean 0 -0.03929970 0.8025454 0\n",
+ "thai 0 -0.21498372 -0.9854806 0\n",
+ " black_sesame_seed black_tea blackberry blackberry_brandy\n",
+ "indian -0.2759246 0.3079977 0.191256164 0\n",
+ "japanese -0.6101687 -0.1671913 -0.118915977 0\n",
+ "korean 1.5197674 -0.3036261 -0.007729435 0\n",
+ "thai -0.1755656 -0.1487033 -0.002983296 0\n",
+ " blue_cheese blueberry bone_oil bourbon_whiskey brandy\n",
+ "indian 0 0.216164294 -0.2276744 0 0.22427587\n",
+ "japanese 0 -0.119186087 0.3913019 0 -0.15595599\n",
+ "korean 0 -0.007821986 0.2854487 0 -0.02562342\n",
+ "thai 0 -0.004947048 -0.0253658 0 -0.05715244\n",
+ "\n",
+ "...\n",
+ "and 308 more lines."
+ ]
+ },
+ "metadata": {}
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000
+ },
+ "id": "GMbdfVmTKkJI",
+ "outputId": "adf9ebdf-d69d-4a64-e9fd-e06e5322292e"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "Os resultados mostram os coeficientes que o modelo aprendeu durante o treinamento.\n",
+ "\n",
+ "### Avaliar o Modelo Treinado\n",
+ "\n",
+ "É hora de ver como o modelo se saiu 📏 avaliando-o em um conjunto de teste! Vamos começar fazendo previsões no conjunto de teste.\n"
+ ],
+ "metadata": {
+ "id": "tt2BfOxrKmcJ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "source": [
+ "# Make predictions on the test set\n",
+ "results <- cuisines_test %>% select(cuisine) %>% \n",
+ " bind_cols(mr_fit %>% predict(new_data = cuisines_test))\n",
+ "\n",
+ "# Print out results\n",
+ "results %>% \n",
+ " slice_head(n = 5)"
+ ],
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ " cuisine .pred_class\n",
+ "1 indian thai \n",
+ "2 indian indian \n",
+ "3 indian indian \n",
+ "4 indian indian \n",
+ "5 indian indian "
+ ],
+ "text/markdown": [
+ "\n",
+ "A tibble: 5 × 2\n",
+ "\n",
+ "| cuisine <fct> | .pred_class <fct> |\n",
+ "|---|---|\n",
+ "| indian | thai |\n",
+ "| indian | indian |\n",
+ "| indian | indian |\n",
+ "| indian | indian |\n",
+ "| indian | indian |\n",
+ "\n"
+ ],
+ "text/latex": [
+ "A tibble: 5 × 2\n",
+ "\\begin{tabular}{ll}\n",
+ " cuisine & .pred\\_class\\\\\n",
+ " & \\\\\n",
+ "\\hline\n",
+ "\t indian & thai \\\\\n",
+ "\t indian & indian\\\\\n",
+ "\t indian & indian\\\\\n",
+ "\t indian & indian\\\\\n",
+ "\t indian & indian\\\\\n",
+ "\\end{tabular}\n"
+ ],
+ "text/html": [
+ "