1.هدف، دامنه و قراردادهای پیادهسازی
این پیوست، بخش نظری فصل CLASSIT را به یک زنجیره اجرایی قابلآزمون تبدیل میکند. هدف، بازگویی مبانی فصل نیست؛ بلکه ارائه یک پیادهسازی روشن، قابلخواندن و بازتولیدپذیر برای دادههای عددی پیوسته است. در این پیادهسازی، acuity یک پارامتر اسکالر و کف انحراف معیار مؤثر است، cutoff بر خود مطلوبیت رده اعمال میشود و معیار مطلوبیت رده بر تعداد فرزندان و تعداد ویژگیها نرمال میشود. بنابراین cutoff بر اختلاف دو امتیاز یا ΔCU اعمال نمیشود.
پیوست سه هدف اجرایی دارد:
- ارائه یک پیادهسازی عددی و قابلخواندن از CLASSIT برای دادههای پیوسته؛
- ثبت پروتکل بازتولید شامل نسخه نرمافزارها، بذرها، آزمونهای واحد و فایلهای خروجی؛
- نشاندادن عملی حساسیت الگوریتم به مقیاس، ترتیب ورود، نویز، داده پرت، نامتوازنی و تنظیم acuity و cutoff.
نسخه کامل کد در بسته همراه قرار دارد. فایل Word حاضر منطق معماری، رابطهای اصلی، زنجیرههای اجرای کامل و نتایج ثبتشده را ارائه میکند؛ فایلهای src/classit.py، run_appendix.py و tests/test_classit.py مراجع اجرایی این پیوست هستند.
قرارداد پیادهسازی
- داده ورودی فقط عددی، دوبعدی و متناهی است.
- مقدار مفقود پیش از ورود به مدل باید برطرف شود؛ نسخه پایه این پیوست مقدار NaN یا بینهایت را رد میکند.
- واریانس جمعیت با مخرج nC محاسبه میشود.
- آمار گره با الگوریتم پایدار Welford بهروزرسانی میشود.
- کف پراکندگی به صورت زیر اعمال میشود:

- معیار اجرایی، صورت نرمالشده فصل اصلی است:

- شرط توقف ساختاری عبارت است از:

در این حالت، آمار تجمعی گره جاری نمونه را حفظ میکند، ولی افراز محلی آن گره حذف میشود و گره به برگ تجمعی تبدیل میگردد. این تصمیم، ناوردای شمارش را حفظ میکند: در هر گره داخلی، مجموع تعداد نمونههای فرزندان با تعداد نمونههای والد برابر است.

.
۲. پیشنیازهای عملی و ساختار داده ورودی
۲.۱ محیط اجرایی
هسته الگوریتم با Python و NumPy نوشته شده و برای مطالعات موردی از ابزارهای استاندارد اکوسیستم علمی استفاده میشود. برای بازتولید دقیق نتایج گزارششده در این پیوست، بسته در محیط مرجع زیر آزمون شده است:
| مؤلفه | نسخه آزمونشده | نقش |
| Python | 3.13.5 | اجرای کد و type hints |
| NumPy | 2.3.5 | آرایهها و آمار عددی |
| pandas | 2.2.3 | ذخیره جدولهای خروجی |
| SciPy | 1.17.0 | نگاشت خوشهها با الگوریتم انتساب |
| scikit-learn | 1.8.0 | داده Wine، پیشپردازش و معیارها |
| Matplotlib | 3.10.8 | تولید نمودارها |
| pytest | 9.0.2 | آزمونهای واحد و ناورداها |
برای اجرای عین نتایج گزارششده، استفاده از requirements-tested.txt توصیه میشود. فایل requirements-current-stable.txt برای آزمون سازگاری با نسخههای جدیدتر کتابخانهها در نظر گرفته شده است؛ در این حالت ممکن است تفاوتهای عددی جزئی در خروجیها مشاهده شود.
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
python -m pip install --upgrade pip
python -m pip install -r requirements-tested.txt
pytest
python run_appendix.py
خروجی موفق آزمونها در محیط مرجع:
.......
[100%]
7 passed
2.2ساختار بسته بازتولید
classit_operational_bundle/
├── README.md
├── pyproject.toml
├── requirements-tested.txt
├── requirements-current-stable.txt
├── run_appendix.py
├── src/
│ └── classit.py
├── tests/
│ └── test_classit.py
└── outputs/
├── environment.json
├── small_example_steps.csv
├── small_example_tree.txt
├── wine_order_sensitivity.csv
├── wine_summary.csv
├── wine_order_sensitivity.png
├── advanced_noise_imbalance.csv
├── advanced_summary.csv
└── advanced_tuning_comparison.png
هشهای SHA-256 نسخه تحویلی:
| فایل | SHA-256 |
| src/classit.py | 8201b2a6a7729337248bb3ad57b03aeee63aa3bb7098b2c931ac2f24994badfe |
| run_appendix.py | 150d9e35229f672fd3508681440fd23540280601e4e503fd9c2ef897430dd4ad |
| tests/test_classit.py | 7c573dace9d3bacc7398c457fea2d1e8f3d7ca8dea8fb1f33d6a57bfcc7bbe55 |
2.3.قرارداد داده ورودی
رابط اصلی یک آرایه float64 با شکل (n_samples, n_features) دریافت میکند. هر سطر یک نمونه و هر ستون یک ویژگی عددی است.
X = np.asarray(X, dtype=np.float64)
assert X.ndim == 2
assert X.shape[0] > 0 and X.shape[1] > 0
assert np.all(np.isfinite(X))
قیود ضروری:
- ستون شناسه، زمان، برچسب یا متن نباید مستقیماً به مدل داده شود.
- ویژگیهای اسمی باید حذف یا با یک توسعه صریح مدل شوند؛ one-hot کردن، CLASSIT پایه را از نظر فرض توزیعی به نسخهای دیگر تبدیل میکند.
- برچسب واقعی فقط برای ارزیابی بیرونی استفاده میشود و وارد آموزش بدون نظارت نمیگردد.
- مقیاسبندی باید فقط از داده آموزش یا آمار گذشته استفاده کند. در جریان برخط، استفاده از میانگین و انحراف معیار آینده نشت اطلاعات است.
- تغییر واحد ویژگی بدون بازتنظیم a میتواند ساختار درخت را تغییر دهد.
۲.۴ پیشپردازش توصیهشده
برای داده دستهای، زنجیره پایه چنین است:
X_train, X_test = train_test_split(...)
scaler = StandardScaler().fit(X_train)
X_train_z = scaler.transform(X_train)
X_test_z = scaler.transform(X_test)
برای داده پرت شدید، یکی از راهبردهای زیر باید در آزمایش کنترلشده بررسی شود:
- RobustScaler با چارکها؛
- winsorization بر اساس کرانهای آموزش؛
- clipping در فضای استانداردشده؛
- افزایش کنترلشده acuity؛
- افزایش cutoff برای جلوگیری از شاخههای کممطلوبیت.
هیچیک از این راهبردها بهطور جهانی برتر نیست. نتیجه باید با چند ترتیب ورود و چند مقدار پارامتر گزارش شود.
.
۳. پیادهسازی پایه
۳.۱ معماری نرمافزار
پیادهسازی به سه جزء تقسیم شده است:
- RunningStats: آمار پایدار هر گره؛
- ClassitNode: آمار، فرزندان و شناسه گره؛
- Classit: رابط آموزش افزایشی، ارزیابی کاندیدها، پیشبینی منجمد و گزارش درخت.
این جداسازی باعث میشود منطق آماری، منطق ساختار درخت و رابط کاربر مستقل آزمون شوند.
.
۳.۲ آمار Welford
برای افزودن بردار x به گرهای با تعداد n، میانگین μ و مجموع مربعات انحراف M2، بهروزرسانی زیر اجرا میشود:

و سپس:

بخش کلیدی کد:
@dataclass(frozen=True, slots=True)
class RunningStats:
n: int
mean: NDArray[np.float64]
m2: NDArray[np.float64]
def add(self, x: ArrayLike) -> "RunningStats":
vector = _as_vector(x, expected_features=self.mean.size)
if self.n == 0:
return RunningStats.from_point(vector)
new_n = self.n + 1
delta = vector - self.mean
new_mean = self.mean + delta / new_n
delta2 = vector - new_mean
new_m2 = self.m2 + delta * delta2
return RunningStats(new_n, new_mean, np.maximum(new_m2, 0.0))
برای ادغام دو مفهوم، از فرمول merge دقیق Welford استفاده شده است؛ بنابراین نیازی به بازخوانی نمونههای خام نیست.
۳.۳ محاسبه مطلوبیت رده
def category_utility(self, parent_stats, child_stats):
K = len(child_stats)
d = parent_stats.mean.size
child_term = 0.0
for stats in child_stats:
prior = stats.n / parent_stats.n
child_term += prior * np.sum(
1.0 / stats.effective_sigma(self.acuity)
)
parent_term = np.sum(
1.0 / parent_stats.effective_sigma(self.acuity)
)
return float((child_term - parent_term) / (K * d))
وجود عامل 1برd یک قرارداد اجرایی صریح است. در نتیجه، مقدار cutoff این پیادهسازی را نباید با پیادهسازیای که این عامل را حذف میکند، مستقیماً مقایسه کرد.

۳.۴ چهار عملگر و تساویشکنی
در هر گره، گزینههای زیر ارزیابی میشوند:
- host: افزودن موقت نمونه به هر فرزند موجود؛
- new: ایجاد برگ جدید؛
- merge: ادغام دو میزبانی که بیشترین امتیاز افزودن را دارند؛
- split: ارتقای فرزندان بهترین میزبان و ارزیابی مجدد.
ترتیب تساویشکنی پیشفرض:
(“host”, “new”, “merge”, “split”)
این ترتیب بهصورت پارامتر ذخیره شده است، زیرا منابع تاریخی در اولویت عملگرها کاملاً یکسان نیستند. تغییر آن باید در گزارش آزمایش ثبت شود.

۳.۵ منطق cutoff
candidate = self._choose_candidate(node.children, parent_stats, x)
node.stats = parent_stats
if candidate.score < self.cutoff:
node.children = []
self.n_cutoffs_ += 1
return
پاککردن فرزندان در این مرحله دو پیامد دارد:
- گره، نمونه جدید را در آمار تجمعی خود حفظ میکند؛
- افراز کممطلوبیت حذف میشود و مجموع شمارش فرزندان در گرههای داخلی ناسازگار نمیگردد.
۳.۶ رابط عمومی و شیوه استفاده
model = Classit(acuity=0.25, cutoff=0.02)
model.fit(X_train, order=permutation)
labels = model.predict(X_test, depth=1)
print(model.tree_summary(max_depth=2))
متدهای اصلی:
| متد/ویژگی | کاربرد |
| fit(X, order=…) | آموزش کامل با ترتیب صریح |
| partial_fit(X) | افزودن یک batch به مدل موجود |
| partial_fit_one(x) | درج یک نمونه |
| predict(X, depth=1) | انتساب منجمد به سطح مشخص درخت |
| transform_path(x) | مسیر شناسه گرهها برای یک نمونه |
| tree_summary() | خلاصه متنی آمار و ساختار |
| n_nodes_ | تعداد کل گرهها |
| tree_depth_ | عمق بیشینه |
| n_merges_, n_splits_, n_cutoffs_ | شمارنده تصمیمهای ساختاری |
.
۳.۷ آزمونهای واحد
آزمونها فقط صحت خروجی نهایی را نمیسنجند؛ ناورداهای علمی و ساختاری را نیز کنترل میکنند:
- تطابق Welford با numpy.var(…, ddof=0)؛
- همارزی ادغام دو خلاصه با پردازش یک جریان واحد؛
- تشکیل دو مفهوم سطح بالا برای داده کوچک؛
- تبدیل گره به برگ در cutoff بزرگ؛
- برابری شمارش والد با مجموع فرزندان؛
- عدم تغییر مدل در predict؛
- رد مقادیر مفقود.
def test_every_internal_node_children_counts_sum_to_parent():
rng = np.random.default_rng(5)
X = rng.normal(size=(80, 3))
model = Classit(acuity=0.4, cutoff=0.01).fit(X)
for node in model.root_.iter_nodes():
if node.children:
assert sum(child.stats.n for child in node.children) == node.stats.n
.
4.مثال آموزشی کوچک
4.1.داده و تنظیم
X = np.array([[0.0], [1.0], [9.0], [10.0]])
model = Classit(acuity=0.5, cutoff=0.01)
for x in X:
model.partial_fit_one(x)
داده عمداً یکبعدی و شامل دو گروه فشرده است. acuity=0.5 با پراکندگی درونگروهی سازگار است و cutoff=0.01 مانع نگهداری شاخههای کممطلوبیت در مراحل اولیه میشود.
۴.۲ خروجی گامبهگام
| گام | نمونه واردشده | تعداد گره | عمق | برچسب سطح بالا برای نمونههای دیدهشده | تعداد cutoff |
| ۱ | ۰ | ۱ | ۰ | 0 | ۰ |
| ۲ | ۱ | ۱ | ۰ | 0 0 | ۱ |
| ۳ | ۹ | ۳ | ۱ | 3 3 4 | ۱ |
| ۴ | ۱۰ | ۳ | ۱ | 3 3 4 4 | ۲ |
خلاصه نهایی درخت:
node=0 n=4 children=2 mean=[5.] sigma=[4.528]
node=3 n=2 children=0 mean=[0.5] sigma=[0.5]
node=4 n=2 children=0 mean=[9.5] sigma=[0.5]
۴.۳ تفسیر عملی
پس از ورود 0 و 1، مطلوبیت تفکیک آن دو با توجه به cutoff کافی نیست و ریشه بهصورت برگ تجمعی باقی میماند. ورود 9 اختلاف پراکندگی والد و دو مفهوم کاندید را افزایش میدهد و درخت دو فرزند میسازد. ورود 10 به فرزند دوم افزوده میشود، اما شاخه داخلی تکنمونهای آن به دلیل cutoff حفظ نمیشود. نتیجه، دقیقاً دو مفهوم فشرده با میانگینهای 0.5 و 9.5 است.
این مثال دو نکته اجرایی را نشان میدهد:
- cutoff صرفاً رشد آینده را متوقف نمیکند؛ افراز محلی کممطلوبیت را حذف میکند.
- برگ میتواند بیش از یک نمونه داشته باشد و یک مفهوم تجمعی باشد؛ برگ الزاماً نمونه منفرد نیست.

.
۵. مطالعه موردی اول: خوشهبندی شیمیایی نمونههای Wine
۵.۱ مسئله و داده
مجموعه Wine در UCI شامل ۱۷۸ نمونه، ۱۳ ویژگی عددی حاصل از تحلیل شیمیایی و سه رقم انگور است. برچسب رقم فقط برای ارزیابی بیرونی استفاده میشود. داده فاقد مقدار مفقود است، ولی مقیاس ویژگیها بسیار متفاوت است؛ ازاینرو اجرای بدون استانداردسازی با فرضهای عملی فصل ناسازگار خواهد بود.

زنجیره کامل:
X, y = load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.30,
random_state=42,
stratify=y,
)
scaler = StandardScaler().fit(X_train)
X_train_z = scaler.transform(X_train)
X_test_z = scaler.transform(X_test)
برچسبها در fit استفاده نمیشوند. stratify فقط برای تشکیل یک مجموعه آزمون پایدار و قابلمقایسه بهکار رفته است.
۵.۲ آموزش و ارزیابی چندترتیبی
records = []
for seed in range(10):
order = np.random.default_rng(seed).permutation(len(X_train_z))
model = Classit(acuity=0.25, cutoff=0.02).fit(
X_train_z,
order=order,
)
labels = model.predict(X_test_z, depth=1)
records.append({
"seed": seed,
"ARI": adjusted_rand_score(y_test, labels),
"NMI": normalized_mutual_info_score(y_test, labels),
"silhouette": silhouette_score(X_test_z, labels),
"nodes": model.n_nodes_,
"depth": model.tree_depth_,
})
depth=1 برای استخراج یک افراز تخت از سه فرزند سطح اول استفاده شده است. ارزیابی یک سطح خاص باید همواره گزارش شود؛ مقایسه برچسب برگهای عمیق با سه کلاس واقعی میتواند تعداد خوشههای بسیار بیشتری ایجاد کند و تفسیر معیارها را مخدوش سازد.
۵.۳ نتایج ثبتشده در محیط مرجع
| شاخص در ۱۰ ترتیب | میانگین | انحراف معیار | کمینه | بیشینه |
| ARI | ۰٫۷۸۲ | ۰٫۰۸۵ | ۰٫۶۳۹ | ۰٫۹۴۰ |
| NMI | ۰٫۷۹۵ | ۰٫۰۷۸ | ۰٫۶۵۳ | ۰٫۹۳۳ |
| Silhouette | ۰٫۲۳۶ | ۰٫۰۲۱ | ۰٫۲۱۷ | ۰٫۲۶۹ |
| تعداد خوشه سطح اول | ۳٫۰ | ۰ | ۳ | ۳ |
| تعداد کل گرهها | ۱۹۰٫۹ | ۲٫۳ | ۱۸۸ | ۱۹۴ |
| عمق درخت | ۶٫۳ | ۰٫۷ | ۶ | ۸ |

نتایج نشان میدهند تعداد مفهومهای سطح اول در این تنظیم پایدار است، اما انطباق با رقمهای واقعی به ترتیب ورود حساس باقی میماند. این امر با ماهیت حریصانه و بازسازماندهی محلی CLASSIT سازگار است. گزارش فقط بهترین بذر، تصویری بیشازحد خوشبینانه ایجاد میکند؛ به همین دلیل میانگین، انحراف معیار و دامنه کامل ثبت شدهاند.
۵.۴ عیبیابی مطالعه Wine
مشکل: همه نمونهها در یک خوشه قرار میگیرند
علتهای محتمل:
- acuity بسیار بزرگ است؛
- cutoff بسیار بزرگ است؛
- استانداردسازی انجام نشده و یک یا چند ویژگی معیار را کنترل میکنند.
اقدام:
- پس از استانداردسازی، acuity را در شبکهای مانند 0.10, 0.25, 0.50, 0.75 بررسی کنید.
- cutoff را بهترتیب 0, 0.005, 0.01, 0.02, 0.05 آزمایش کنید.
- تعداد گره، عمق و تعداد خوشه سطح انتخابشده را همزمان گزارش کنید.
- مشکل: تعداد گرهها تقریباً با تعداد نمونهها برابر است
علت محتمل: acuity یا cutoff کوچک است و برگهای باریک حفظ میشوند.
اقدام: افزایش تدریجی cutoff معمولاً ساختار عمیق را بدون تغییر فوری سطح اول کوچک میکند؛ سپس افزایش acuity بررسی شود.
- مشکل: نتیجه یک بذر بسیار خوب و بذر دیگر ضعیف است
این رفتار خطای برنامه نیست. حداقل ۱۰ جایگشت اجرا و میانگین/پراکندگی گزارش شود. برای کاربرد حساس، میتوان یک ensemble از چند درخت یا انتخاب مدل بر اساس معیار داخلی آموزش را بررسی کرد، ولی این توسعه بخشی از CLASSIT پایه نیست.
- مشکل: Silhouette کم ولی ARI بالا است
Silhouette فقط هندسه فاصلهای در فضای استانداردشده را میسنجد، در حالی که CLASSIT با معیار توزیعی و سلسلهمراتبی کار میکند. اختلاف دو معیار باید گزارش شود، نه اینکه یکی برای حذف دیگری استفاده گردد.
.
۶. مطالعه موردی دوم: نویز، داده پرت و نامتوازنی
۶.۱ سناریو
سه خوشه دوبعدی با نسبت نمونه 280:90:30 ساخته شدهاند. به ۲۰ درصد دادهها نویز گاوسی افزوده و ۲۰ داده پرت یکنواخت نیز وارد آموزش شده است. مجموعه آزمون پاک و جداگانه، نسبت 140:60:30 دارد. این طراحی سه محدودیت فصل اصلی را همزمان فعال میکند:
- برآورد میانگین و واریانس در برابر داده پرت مقاوم نیست؛
- خوشه اقلیت ممکن است زیر ساختار مفهوم غالب پنهان شود؛
- acuity و cutoff نامناسب میتوانند به بیشجزئیشدن یا فروپاشی درخت منجر شوند.
centers = np.array([[-3.0, -2.0], [2.5, 2.2], [3.0, -2.5]])
X_clean, _ = make_blobs(
n_samples=[280, 90, 30],
centers=centers,
cluster_std=[0.55, 0.85, 0.35],
random_state=13,
)
rng = np.random.default_rng(13)
X_noisy = X_clean.copy()
noisy_idx = rng.choice(len(X_noisy), size=80, replace=False)
X_noisy[noisy_idx] += rng.normal(0.0, 1.0, size=(80, 2))
outliers = rng.uniform(-8.0, 8.0, size=(20, 2))
X_train = np.vstack([X_noisy, outliers])
استانداردساز فقط روی داده آموزش برازش شده است. معیارها روی مجموعه آزمون پاک محاسبه شدهاند.
۶.۲ تنظیمهای مقایسهشده
| نام تنظیم | acuity | cutoff | انتظار رفتاری |
| حساس/بیشجزئی | ۰٫۱۵ | ۰٫۰۰۱ | شاخههای باریک، اثر نویز و ترتیب بالا |
| تنظیمشده | ۰٫۵۰ | ۰٫۰۲۰ | تعادل میان تفکیک و pruning |
| بیشمنظمشده | ۰٫۷۵ | ۰٫۰۵۰ | خطر حذف ساختار واقعی و فروپاشی |
برای آشکارشدن خوشه اقلیت، افراز در عمق ۲ ارزیابی شده است. سطح اول در بسیاری از ترتیبها ابتدا دو ابرمفهوم تشکیل میدهد و خوشه سوم در سطح بعد ظاهر میشود. این نکته اهمیت گزارش صریح عمق برش درخت را نشان میدهد.
۶.۳ کد کامل ارزیابی
configs = {
"sensitive": {"acuity": 0.15, "cutoff": 0.001},
"tuned": {"acuity": 0.50, "cutoff": 0.020},
"over_regularized": {"acuity": 0.75, "cutoff": 0.050},
}
for name, params in configs.items():
for seed in range(10):
order = np.random.default_rng(seed).permutation(len(X_train_z))
model = Classit(**params).fit(X_train_z, order=order)
clusters = model.predict(X_test_z, depth=2)
ari = adjusted_rand_score(y_test, clusters)
nmi = normalized_mutual_info_score(y_test, clusters)
mapped = map_clusters_to_classes(y_test, clusters)
bacc = balanced_accuracy_score(y_test, mapped)
نگاشت خوشه به کلاس فقط برای محاسبه balanced_accuracy و با مسئله انتساب مجارستانی انجام میشود. این نگاشت بخشی از آموزش نیست و از آن برای تنظیم مستقیم مدل روی آزمون نباید استفاده شود.
۶.۴ نتایج
| تنظیم | ARI میانگین ± انحراف معیار | NMI میانگین | Balanced Accuracy | خوشه در عمق ۲ | گره | عمق |
| حساس/بیشجزئی | ۰٫۴۱۳ ± ۰٫۰۶۳ | ۰٫۶۱۵ | ۰٫۸۸۲ | ۵٫۱ | ۱۰۰٫۸ | ۷٫۵ |
| تنظیمشده | ۰٫۹۷۸ ± ۰٫۰۴۱ | ۰٫۹۶۱ | ۰٫۹۸۲ | ۳٫۱ | ۱۳٫۱ | ۴٫۳ |
| بیشمنظمشده | ۰٫۵۲۷ ± ۰٫۳۱۵ | ۰٫۵۳۷ | ۰٫۶۲۱ | ۲٫۰ | ۳٫۰ | ۱٫۰ |

تنظیم حساس، نویز و داده پرت را به ساختارهای متعدد تبدیل میکند؛ تعداد خوشههای عمق ۲ از تعداد واقعی بیشتر و ARI پایین است. سپس تنظیم میانی هم تعداد گره را حدود یک مرتبه کاهش داده و هم انطباق خوشهها را بهبود داده است. تنظیم بیشمنظمشده در برخی ترتیبها تمام داده را به یک مفهوم تقلیل میدهد؛ انحراف معیار زیاد ARI نشانه ناپایداری مرزی آن است.
۶.۵ عیبیابی پیشرفته
- نشانه: تعداد گره بسیار زیاد، عمق بالا و ARI پایین
تفسیر: بیشجزئیشدن. نویز بهعنوان مفهوم مستقل پذیرفته شده است.
ترتیب اقدام:
- cutoff را افزایش دهید تا افرازهای کممطلوبیت حذف شوند.
- acuity را افزایش دهید تا تفاوتهای زیر مقیاس نویز، مفهوم مستقل نسازند.
- در کنار معیار بیرونی، n_nodes_ و tree_depth_ را کنترل کنید.
- خروجی چند بذر را بررسی کنید؛ یک اجرای منفرد برای تشخیص کافی نیست.
- نشانه: تنها یک خوشه یا یک ریشه بدون فرزند
تفسیر: بیشمنظمشدن یا مقیاس نامناسب.
اقدام:
- ابتدا cutoff را کاهش دهید؛
- سپس acuity را کاهش دهید؛
- کنترل کنید معیار پیادهسازی بر d تقسیم شده است؛ cutoff پیادهسازی دیگر ممکن است مقیاس متفاوتی داشته باشد.
- نشانه: خوشه اقلیت در سطح اول دیده نمیشود
درخت را در عمق ۲ یا ۳ بررسی کنید. CLASSIT الزاماً تمام ساختار واقعی را در سطح اول نشان نمیدهد. عمق ارزیابی نباید پس از مشاهده برچسب آزمون بهطور دلخواه انتخاب شود؛ بهتر است با معیار داخلی یا مجموعه اعتبارسنجی تعیین گردد.
- نشانه: داده پرت برگهای تکنمونهای میسازد
راهکارهای مجاز:
- افزایش acuity یا cutoff؛
- clipping بر اساس کرانهای آموزش؛
- RobustScaler؛
- حذف داده پرت فقط با قاعده دامنهای و مستند؛
- گزارش جداگانه مدل با و بدون سیاست مقاوم.
حذف خودکار هر برگ کوچک توصیه نمیشود؛ خوشه واقعی اقلیت نیز ممکن است کوچک باشد.
- نشانه: ترتیب ورود اثر بسیار زیاد دارد
- جریان را با چند بذر شبیهسازی کنید؛
- در داده دستهای، چند جایگشت مستقل اجرا شود؛
- از انتخاب بهترین بذر با برچسب آزمون خودداری شود؛
- برای سامانه واقعی، drift monitoring و بازآموزی دورهای در نظر گرفته شود. CLASSIT پایه مکانیسم فراموشی ندارد.
- نشانه: NaN یا overflow در آمار
این پیادهسازی داده غیرمتناهی را در ورودی رد میکند. اگر overflow پس از تبدیل رخ داد:
- نوع داده را float64 نگه دارید؛
- مقادیر بسیار بزرگ را پیش از استانداردسازی بررسی کنید؛
- از فرمول sum(x^2)-sum(x)^2/n در کد استفاده نکنید؛ Welford را حفظ کنید؛
- هرگز acuity=0 نگذارید.
.
۷. جمعبندی اجرایی
پیادهسازی عملی CLASSIT بیش از تبدیل شبهکد به چند حلقه است. چهار قرارداد باید در تمام اجراها ثابت بمانند:
- acuity اسکالر و مثبت است و کف σ را تعیین میکند؛
- cutoff بر خود CU اعمال میشود؛
- تعریف دقیق نرمالسازی CU ثبت میشود؛
- ترتیب عملگرها و تساویشکنی مستند است.
برای استفاده واقعی، حداقل گزارش اجرایی باید شامل موارد زیر باشد:
- نسخه بستهها و سیستمعامل؛
- بذر و ترتیب ورود؛
- روش استانداردسازی و محل برازش آن؛
- مقادیر a و τ؛
- عمق برش درخت برای استخراج افراز تخت؛
- تعداد گره، عمق، merge، split و cutoff؛
- میانگین و انحراف معیار معیارها در چند ترتیب؛
- سیاست مقادیر مفقود و داده پرت.
هشدارهای اصلی:
- افزودن قابلیت داده مختلط، فراموشی زمانی، وزندهی نمونه یا acuity ویژگیویژه، توسعه الگوریتم پایه است و باید صریحاً نامگذاری شود.
- StandardScaler.fit_transform روی کل داده پیش از train/test split نشت اطلاعات ایجاد میکند.
- بهترین نتیجه یک بذر نباید بهعنوان عملکرد الگوریتم گزارش شود.
- افزایش cutoff و acuity همیشه بهبود نیست؛ مقادیر زیاد میتوانند کل سلسلهمراتب را فروبپاشند.
- ارزیابی برگها بدون ثبت عمق یا سیاست برش، قابل بازتولید و قابل مقایسه نیست.
توسعههای عملیاتی بعدی که ارزش پژوهشی دارند:
- پشتیبانی از داده مفقود با مجموعه ویژگی مشاهدهشده و نرمالسازی صریح؛
- استانداردساز برخط بدون نشت، با دوره warm-up؛
- forgetting factor یا پنجره لغزان برای رانش مفهوم؛
- آمار مقاوم یا مدل Student-t برای داده پرت؛
- ensemble چندترتیبی و سنجش پایداری گرهها؛
- pruning مبتنی بر اعتبارسنجی و حداقل اندازه مفهوم؛
- serialization نسخهدار و API سازگار با estimatorهای scikit-learn؛
- benchmark با WEKA برای ثبت تفاوت ناشی از ترتیب عملگرها.
8. منابع
Python Software Foundation. (2026). Python 3.14.6 release documentation.
NumPy Developers. (2026). NumPy 2.5 release documentation.
SciPy Developers. (2026). SciPy 1.18 release notes.
scikit-learn Developers. (2026). scikit-learn 1.9 release history and API reference.
pandas Development Team. (2026). pandas 3.0 release notes.
Matplotlib Development Team. (2026). Matplotlib 3.11 release notes.
pytest Development Team. (2026). pytest 9.1 changelog.
Aeberhard, S., & Forina, M. (1992). Wine [Data set]. UCI Machine Learning Repository. https://doi.org/10.24432/C5PC7J University of Waikato. (n.d.). WEKA Cobweb/Classit API documentation.



