چیتشیت
کیفیت دادهها و گیتهای کنترلی دیتاست
Data Quality and Dataset Gates
بارگذاری و تقسیم داده با سید، ترمیم سلولهای CSV، اعتبارسنجی ردیفها با قرارداد، ممیزی نشت داده و تمرین مایگریشن.
فهرست مطالب
آنچه هر گیت کنترلی میسازد
مقایسه| عامل | ترمیم CSV | گیت کنترلی قرارداد | ممیزی تقسیم داده | تمرین مایگریشن |
|---|---|---|---|---|
| خروجی ساختهشده | جدول پاکسازیشده و recipe | ردیفهای تاییدشده و قرنطینه | گزارش نشت داده به ازای هر رکورد | رسید تمرین |
| ورودی | متن csv، نامهای مستعار (aliases)، ستونهای تاریخ (date_columns) | فایل JSONL بههمراه contract.json | {train,test} یا {records} | دیتابیس، مایگریشن، بازگشت به عقب، پایاها |
| خروجی | فایلهای cleaned.csv و recipe.json | فایلهای accepted.jsonl و quarantine.jsonl | فایل split-audit.json | فایلهای rehearsal.json و schema-diff.json |
| سیگنال قبولی | نبود سلول بلاتکلیف | passed برابر true است | usable برابر true است | release_ready برابر true است |
| خروج از گیت | غیرصفر در صورت شکست | خروج با کد 1 برای نقض قاعده، کد 2 برای ورودی نامعتبر | خروج با کد 2 در صورت غیرقابل استفاده بودن | غیرصفر در صورت شکست |
| محدودیت | فقط تاریخهای اسلشدار و ISO | بدون درک صحت معنایی | کپیهای عینی، نه بازنویسیها | سیاست SQLite، نه ایزولاسیون سیستمعامل |
اجرا و نمرهدهی
دستورها| دستور | عملکرد |
|---|---|
python3 scripts/project_test.py <project> --init <workspace> | ایجاد ورکاسپیس؛ اجرای اول ناموفق است |
python3 scripts/project_test.py <project> --all --solution --strict | بررسی راهحل مرجع |
python3 cli.py samples/input.json --output demo-output | اجرای ترمیم CSV یا تمرین مایگریشن |
python3 cli.py sample.csv --question "sum units by region" --output output/report.html | پاسخ به سوال دربارهی CSV بههمراه رسید |
python3 cli.py samples/input.jsonl --contract samples/contract.json --output demo-output | تقسیم ردیفها به تاییدشده و قرنطینه |
python3 cli.py samples/input.json --output split-audit.json --html split-audit.html | ممیزی تقسیم train و test |
python3 cli.py --train train.jsonl --test test.jsonl --check --output split-audit.json | ممیزی پارتیشنهای JSONL در CI |
python code/data_utils.py | بارگذاری، تبدیل، تقسیم و اثرانگشتنگاری دیتاست |
پرسش فقطخواندنی از CSV
معماریتمرین مایگریشن
گامبهگام- اسنپشاتدیتابیس مبدا را فقطخواندنی باز کنید و در حافظه بکاپ بگیرید.
- اسنپشاتاسکیما، تعداد ردیفها، SHA-256 محتوای ردیفها و توالیها را ثبت کنید.
- تمرینمایگریشن را صرفاً روی نسخهی درون حافظه اعمال کنید.
- تمریندستورات ATTACH، DETACH، PRAGMA، جداول مجازی و توابع فایلی را مسدود کنید.
- آزمون بازگشت به عقبمایگریشن و بازگشت به عقب را روی یک بکاپ یکبارمصرف اجرا کنید.
- برگشتپذیریبدون خطا و برابری کامل اسنپشات بازگردانیشده با نسخهی قبلی.
- رسیدبررسی هر پایا. مقدار
release_readyنیازمند تایید همهی آنها و بازگشت به عقب است.
تقسیم داده با سید
کدpython
dataset = load_dataset("stanfordnlp/imdb", split="train")
split = dataset.train_test_split(test_size=0.2, seed=42)
train_val = split["train"].train_test_split(test_size=0.125, seed=42)
train_ds = train_val["train"] # 70 درصد کل ردیفها
val_ds = train_val["test"] # 10 درصد
test_ds = split["test"] # 20 درصد
dataset.to_parquet("imdb_train.parquet") # بهترین فرمت ذخیرهسازی
load_dataset("wikimedia/wikipedia", "20231101.en", split="train", streaming=True)
توابع پروژه
کار و کد| وظیفه | کد |
|---|---|
| پروفایل ستونهای CSV | profile(text) |
| پیشنمایش تغییرات سلولها | preview(table, recipe) |
| اعمال ترمیمهای بازبینیشده | repair(table, recipe, decisions=None) |
| بررسی یک رکورد | row_issues(row, contract) |
| یافتن گروههای تکراری | duplicate_rows(rows, contract) |
| ممیزی دو پارتیشن | audit(train, test) |
| تقسیم بر اساس هش گروه | split_groups(records, test_fraction=0.2, seed='course') |
| اجرای خواندن مقید | run_query(data, sql, max_rows=100, max_steps=100000) |
ورژنبندی فایلهای حجیم
دستورها| دستور | عملکرد |
|---|---|
git lfs track "*.safetensors" | ذخیرهی فایل خارج از git بهکمک پوینتر |
dvc add data/training_set.parquet | ساخت یک فایل پوینتر کوچک .dvc |
dvc remote add -d myremote s3://my-bucket/dvc-store | تنظیم مخزن راهدور DVC |
dvc push | آپلود دادههای ردیابیشده به مخزن راهدور |
snapshot_download("sentence-transformers/all-MiniLM-L6-v2") | کش کردن کامل مخزن مدل |
پیشفرضها و محدودیتها
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
--limit | 100 | ردیفهای نتیجه، حداکثر 1000 |
max_steps | 100000 | بودجهی دستورات SQLite |
`load_csv` rows | 10000 | کمتر از 2 مگابایت، حداکثر 50 ستون |
--seed | course | سید هش گروه برای --split |
Contract rows | 100000 | سقف ورودی API |
SQL deadline | two-second | دستورات را محدود میکند، نه بکاپها را |
`make_splits` seed | 42 | دادهی آموزش 0.8، اعتبارسنجی 0.1 |
Local storage | 10 GB | استفاده از فضای ابری بالاتر از آن |
خطاها و راهحلها
عیبیابی"ragged row"
- علت
- تعداد سلولهای ردیف نادرست است
- راهحل
- ردیف مبدا را اصلاح کنید
بلاتکلیف بودن به علت "ambiguous date"
- علت
- هر دو بخش 12 یا کمترند و با هم تفاوت دارند
- راهحل
- در تصمیمگیریها تاریخ را با فرمت ISO وارد کنید
"stale review"
- علت
- جدول یا recipe پس از بازبینی تغییر کرده است
- راهحل
- پیشنمایش جدید را دوباره بازبینی کنید
"Query rejected: "
- علت
- کوئری SQL از مرز مجاز خواندن خارج شده است
- راهحل
- یک دستور SELECT واحد روی
dataبنویسید
"Aggregate column must contain finite numeric values"
- علت
- نوع ستون TEXT است
- راهحل
- تجمیع روی ستون با نوع REAL انجام شود
خروج گیت قرارداد
--checkبا کد 1- علت
- ردیفها در قرنطینه قرار دارند
- راهحل
- فایل review.html را بخوانید. جداگانه برای ردیفها تصمیم بگیرید
مقدار
usableدر تقسیم برابر false است- علت
- نشت داده در محتوا یا گروه
- راهحل
- تقسیم بر اساس گروه با فلگ
--split
مقدار
release_readyبرابر false است- علت
- بازگشت به عقب دقیق و کامل نیست
- راهحل
- دستورات SQL بازگشت به عقبی بنویسید که ردیفها را دقیقاً بازگرداند
قواعد در کد
مفهومها- ترتیب دستورالعمل (recipe)
- برای هر ستون ابتدا trim، سپس alias و بعد date.
- تغییرات
- ثبت ردیف، ستون، مقدار قبلی و بعدی برای هر تغییر.
- عدم تبدیل اجباری نوع
- فیلدهای عدد صحیح و اعشاری مقدار بولی true را نمیپذیرند.
- تکراریها
- گزارش همهی ردیفهای دارای تداخل، از جمله اولین ردیف.
- گیت کنترلی
- دیتاست بدون ردیفهای قرنطینه و بدون ایرادات ساختاری پاس میشود.
- اثرانگشت
- اعمال NFKC، casefold و ادغام فاصلهها، سپس اجرای SHA-256.
- تقسیم گروهی
- محاسبهی SHA-256 از سید و گروه تقسیم بر
2**256؛ کمتر از کسر مشخصشده test است. - فرمتها
- استفاده از Parquet برای ذخیرهسازی، Arrow در حافظه و CSV و JSON برای تبادل داده.
سوالات متداول
پرسش و پاسخ- آیا نرمالسازی موارد بازنویسیشده را شناسایی میکند؟
- خیر. تنها نسخههای عینی نرمالشده را مییابد.
- آیا تمرین، دیتابیس مبدا را تغییر میدهد؟
- خیر. مبدا هرگز با دسترسی نوشتن باز نمیشود.
- آیا مدل کوئری SQL خود را آزادانه اجرا میکند؟
- خیر. احراز دسترسی در SQLite اجرای آن را کنترل میکند.
- آیا میتوان ردیفهای قرنطینه را بلافاصله حذف کرد؟
- خیر. پارتیشنها شواهد هستند، نه مجوزی برای حذف سریع.
- چرا سید تعیین کنیم؟
- سید یکسان همواره تقسیم دادهی کاملاً مشابهی تولید میکند.
نکات کاربردی
نکتهها- بازپخش recipe روی یک جدول دیگر با دستور
--recipe recipe.json. - خواندن cleaned.csv با
csv.DictReaderبهعنوان مصرفکنندهی نهایی. - پیش از بارگذاری خروجیها، منتظر اتمام اجرای کامل گیت کنترلی بمانید.
- ورودی را در کنار خروجی نگه دارید تا امکان بازتولید آن برای دیگران فراهم باشد.
- وزنهای مدل را با
.gitignoreخارج از git نگه دارید. برای بازتولید اجراها از DVC استفاده کنید.