色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

NBA比賽結(jié)果預(yù)測(cè):從數(shù)據(jù)獲取到模型調(diào)參的完整Python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)指南

NBA比賽結(jié)果預(yù)測(cè):從數(shù)據(jù)獲取到模型調(diào)參的完整Python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)指南 簡(jiǎn)介面向Python課程設(shè)計(jì)與機(jī)器學(xué)習(xí)實(shí)踐場(chǎng)景這份資源以美職籃NBA比賽數(shù)據(jù)為切入點(diǎn)實(shí)現(xiàn)了從爬蟲(chóng)采集、數(shù)據(jù)清洗到智能預(yù)測(cè)的比賽結(jié)果分析流程。項(xiàng)目取材真實(shí)賽季數(shù)據(jù)涵蓋球隊(duì)場(chǎng)均統(tǒng)計(jì)、對(duì)手?jǐn)?shù)據(jù)、賽程安排與歷史交鋒結(jié)果等多維信息適合高校學(xué)生用于學(xué)期答辯、大作業(yè)或課程設(shè)計(jì)展示也適合希望快速上手?jǐn)?shù)據(jù)采集與建模的初學(xué)者參考。壓縮包共有十一個(gè)文件以六個(gè)數(shù)據(jù)文件、四個(gè)腳本文件和一個(gè)說(shuō)明文檔為主整體大小約三百一十一KB。其中數(shù)據(jù)文件分別存放球隊(duì)常規(guī)賽統(tǒng)計(jì)、對(duì)手常規(guī)賽統(tǒng)計(jì)、歷史賽程與比賽結(jié)果腳本文件覆蓋爬蟲(chóng)抓取與機(jī)器學(xué)習(xí)模型訓(xùn)練及預(yù)測(cè)說(shuō)明文檔則整理了項(xiàng)目背景、設(shè)計(jì)思路、模塊劃分和運(yùn)行步驟。該方案曾獲學(xué)期優(yōu)秀項(xiàng)目評(píng)選代碼結(jié)構(gòu)清晰、數(shù)據(jù)資料齊備可直接運(yùn)行復(fù)現(xiàn)預(yù)測(cè)結(jié)果也便于后續(xù)擴(kuò)展算法或更換數(shù)據(jù)源。目前已有一千四百六十二人學(xué)習(xí)是完成課程設(shè)計(jì)或入門(mén)賽事數(shù)據(jù)分析的實(shí)用資源。1. 把NBA比賽結(jié)果預(yù)測(cè)當(dāng)課程設(shè)計(jì)為什么說(shuō)這是新手最友好的機(jī)器學(xué)習(xí)項(xiàng)目NBA比賽結(jié)果預(yù)測(cè)是Python課程設(shè)計(jì)里少有的數(shù)據(jù)、算法、業(yè)務(wù)三頭都占的實(shí)戰(zhàn)選題。它不需要深度學(xué)習(xí)傳統(tǒng)機(jī)器學(xué)習(xí)模型就能把準(zhǔn)確率做到60%以上但數(shù)據(jù)獲取、特征構(gòu)造、評(píng)估方式到處是坑足夠你學(xué)到東西。在機(jī)器學(xué)習(xí)實(shí)戰(zhàn)項(xiàng)目案例里這個(gè)題目的好處是入門(mén)順滑、天花板也夠高。很多同學(xué)做完后發(fā)現(xiàn)真正決定成績(jī)的不是模型多高級(jí)而是數(shù)據(jù)預(yù)處理和特征工程做沒(méi)做干凈。這個(gè)題目恰好能把Python爬蟲(chóng)、pandas數(shù)據(jù)處理、scikit-learn建模和可視化完整串一遍非常適合剛?cè)腴T(mén)機(jī)器學(xué)習(xí)、想補(bǔ)機(jī)器學(xué)習(xí)基礎(chǔ)、又想做真實(shí)項(xiàng)目的初學(xué)者。NBA比賽數(shù)據(jù)完全公開(kāi)免費(fèi)接口無(wú)需注冊(cè)比申請(qǐng)權(quán)限的數(shù)據(jù)集友好得多。下文方案基于nba_api加pandas加scikit-learn的經(jīng)典組合全程本地跑通不需要GPU每段代碼都附參數(shù)說(shuō)明和踩坑記錄。2. 獲取NBA比賽數(shù)據(jù)nba_api 拉取與本地落地的完整方案2.1 選型理由為什么第一選擇是 nba_api 而不是現(xiàn)成CSV先說(shuō)結(jié)論課程設(shè)計(jì)階段直接用 nba_api 這個(gè)第三方庫(kù)拉數(shù)據(jù)比去 Kaggle 下載現(xiàn)成 CSV 更值得做。原因有三個(gè)。第一現(xiàn)成 CSV 的截止日期是固定的你拿到手的可能是上個(gè)賽季的數(shù)據(jù)沒(méi)法覆蓋最新比賽。課程設(shè)計(jì)答辯時(shí)老師大概率會(huì)問(wèn)你這套流程能不能預(yù)測(cè)明天的比賽如果你用的是一份去年的靜態(tài)數(shù)據(jù)這個(gè)問(wèn)題會(huì)非常尷尬。用接口拉數(shù)據(jù)代碼一跑就是最新賽程。第二拉數(shù)據(jù)的過(guò)程本身就是評(píng)分點(diǎn)。Python課程設(shè)計(jì)的評(píng)分標(biāo)準(zhǔn)里通常有工作量這一項(xiàng)能展示一個(gè)從網(wǎng)絡(luò)獲取數(shù)據(jù)的完整環(huán)節(jié)比單純讀CSV文件的工作量要扎實(shí)得多。你可以順帶在文檔里寫(xiě)清楚請(qǐng)求流程、解析邏輯和異常處理體現(xiàn)的是從爬取到存儲(chǔ)的完整閉環(huán)。第三nba_api 封裝的是 NBA 官網(wǎng) stats.nba.com 的公開(kāi)接口免費(fèi)、無(wú)需注冊(cè)、無(wú)需API key對(duì)校園網(wǎng)絡(luò)環(huán)境也比較友好。相比去爬第三方統(tǒng)計(jì)網(wǎng)站官方接口的可靠性要高不少也不會(huì)遇到網(wǎng)站改版導(dǎo)致解析規(guī)則失效的問(wèn)題。當(dāng)然nba_api 有個(gè)前提你得先把Python環(huán)境裝好。給新手的建議是直接用 Anaconda 裝 Python 3.x然后把 conda 和 pip 的默認(rèn)源都切成國(guó)內(nèi)鏡像裝包速度會(huì)快很多。裝完在終端里跑 python --version 確認(rèn)版本再 pip install nba_api pandas scikit-learn xgboost matplotlib機(jī)器學(xué)習(xí)常用包就這么齊了。如果你用 vscode 寫(xiě)代碼記得在右下角把解釋器切成 conda 環(huán)境不然容易遇到終端里能 import、vscode 里 import 報(bào)錯(cuò)的經(jīng)典問(wèn)題。2.2 最小可用代碼拉取近五個(gè)賽季的常規(guī)賽日程與比分nba_api 的核心用法是先構(gòu)造一個(gè)端點(diǎn)對(duì)象再調(diào)它的 get_data_frames() 方法拿回 DataFrame。最常見(jiàn)的入口是 leaguegamefinder它返回每一支球隊(duì)在指定范圍內(nèi)的所有歷史比賽記錄每條記錄是一行包含球隊(duì)、對(duì)手、比分、主客場(chǎng)、賽季、比賽日期等幾十個(gè)字段。下面這段代碼拉取近五個(gè)賽季所有常規(guī)賽的比賽日程和最終比分import pandas as pd from nba_api.stats.endpoints import leaguegamefinder def fetch_games(season_start2020, season_end2024): frames [] for season in range(season_start, season_end 1): # 每個(gè)賽季單獨(dú)拉取避免單次請(qǐng)求數(shù)據(jù)量過(guò)大被接口限流 season_str f{season}-{str(season 1)[-2:]} finder leaguegamefinder.LeagueGameFinder( season_nullableseason_str, season_type_nullableRegular Season ) df finder.get_data_frames()[0] frames.append(df) print(f賽季 {season_str} 拉取完成{df.shape[0]} 行) result pd.concat(frames, ignore_indexTrue) return result games fetch_games() games.to_csv(nba_games_raw.csv, indexFalse) print(games.shape)這段代碼的邏輯很直接循環(huán)遍歷每一個(gè)賽季構(gòu)造 LeagueGameFinder 請(qǐng)求對(duì)象用 get_data_frames() 把響應(yīng)解析成 DataFrame最后合并保存為CSV。幾個(gè)參數(shù)要說(shuō)明參數(shù)取值示例含義season_nullable2020-21賽季字符串格式必須是帶橫杠的2020-21season_type_nullableRegular Season賽事類型常規(guī)賽季后賽填 Playoffsleague_id_nullable00默認(rèn)就是NBA一般不用動(dòng)timeout30單個(gè)請(qǐng)求的最大等待秒數(shù)防卡死注意一個(gè)重要細(xì)節(jié)leaguegamefinder 返回的是球隊(duì)視角的數(shù)據(jù)也就是說(shuō)一場(chǎng)比賽會(huì)出現(xiàn)兩行——主隊(duì)一行、客隊(duì)一行。字段里 matchup 列能看出是 ATL vs BOS 還是 BOS ATL 表示客場(chǎng)。做特征工程之前必須先按 GAME_ID 去重或配對(duì)這個(gè)后面特征章節(jié)會(huì)細(xì)說(shuō)。接口返回的字段里GAME_ID 是比賽唯一標(biāo)識(shí)GAME_DATE 是比賽日期字符串TEAM_ID 是球隊(duì)IDPTS 是這支球隊(duì)本場(chǎng)得分PLUS_MINUS 是凈勝分FG_PCT 是投籃命中率REB、AST、TOV 分別是籃板、助攻、失誤。一次拉五個(gè)賽季的數(shù)據(jù)量在一萬(wàn)行上下完整跑完大約一到兩分鐘速度完全可以接受。2.3 數(shù)據(jù)落地CSV 與 SQLite 怎么選數(shù)據(jù)落地方式我一般分兩種情況。如果只是課程設(shè)計(jì)數(shù)據(jù)量在幾萬(wàn)行以內(nèi)直接存CSV就夠了老師拷貝你的代碼和CSV文件就能復(fù)現(xiàn)。如果你打算長(zhǎng)期維護(hù)、每周更新數(shù)據(jù)或者想在文檔里體現(xiàn)一點(diǎn)數(shù)據(jù)庫(kù)能力用 SQLite 更合適零配置、單文件、Python 內(nèi)置 sqlite3 即可讀寫(xiě)不用額外裝 MySQL。存CSV時(shí)有一個(gè)坑nba_api 返回的某些列含有特殊字符直接用默認(rèn) to_csv 沒(méi)問(wèn)題但用 Excel 打開(kāi)中文列名可能出現(xiàn)亂碼。保存時(shí)我習(xí)慣把編碼指定為 utf-8-sig這樣 Excel 雙擊打開(kāi)也不會(huì)亂碼讀取時(shí)如果遇到解析錯(cuò)誤大概率是某行數(shù)據(jù)里有多余的逗號(hào)或引號(hào)用 on_bad_linesskip 就能兜底。如果你選 SQLite建表時(shí)不要照搬所有列挑實(shí)際會(huì)用到的字段建表就行。下面這段代碼把數(shù)據(jù)寫(xiě)入 SQLite并給 game_id 和 team_id 建了聯(lián)合唯一索引import sqlite3 conn sqlite3.connect(nba_games.db) cur conn.cursor() # 建表只保留特征工程會(huì)用到的核心字段 cur.execute( CREATE TABLE IF NOT EXISTS games ( game_id TEXT, team_id INTEGER, team_abbreviation TEXT, matchup TEXT, game_date TEXT, pts INTEGER, plus_minus INTEGER, home_away TEXT, season TEXT, PRIMARY KEY (game_id, team_id) ) ) # 寫(xiě)入前先重命名列為干凈的小寫(xiě)格式 columns [GAME_ID, TEAM_ID, TEAM_ABBREVIATION, MATCHUP, GAME_DATE, PTS, PLUS_MINUS, HOME_AWAY, SEASON] games[columns].to_sql( games, conn, if_existsreplace, indexFalse) conn.commit() conn.close() print(SQLite 寫(xiě)入完成)這里用 PRIMARY KEY (game_id, team_id) 做聯(lián)合主鍵能防止重復(fù)拉取時(shí)插入重復(fù)數(shù)據(jù)。后續(xù)做增量更新時(shí)可以先查詢當(dāng)前庫(kù)里最大的 game_date只拉那之后的比賽再把新數(shù)據(jù)以 if_existsappend 追加進(jìn)去不用每次全量重跑。to_sql 是 pandas 自帶的數(shù)據(jù)庫(kù)寫(xiě)入方法很適合新手需要注意 DataFrame 列名如果有空格或特殊符號(hào)建表時(shí)會(huì)很麻煩所以寫(xiě)入前先重命名成干凈的小寫(xiě)列名最省事。2.4 請(qǐng)求頻率與異常處理限速、超時(shí)和重試nba_api 雖然封裝得不錯(cuò)但底層還是去請(qǐng)求 stats.nba.com 的 HTTP 接口。如果把它當(dāng)成隨便調(diào)的接口連續(xù)快速請(qǐng)求幾十次就會(huì)收到 429 狀態(tài)碼也就是請(qǐng)求過(guò)于頻繁被限流。這不是封IP但會(huì)讓循環(huán)中斷。我的經(jīng)驗(yàn)是兩個(gè)約束同時(shí)加一是每次請(qǐng)求之間 sleep 至少 0.5 到 1 秒二是設(shè)置超時(shí)和重試機(jī)制遇到 429 或 5xx 錯(cuò)誤就等幾秒再重試。下面是一段加了重試邏輯的拉取函數(shù)import time import requests from nba_api.stats.endpoints import leaguegamefinder def fetch_with_retry(season_str, max_retries4): for attempt in range(max_retries): try: finder leaguegamefinder.LeagueGameFinder( season_nullableseason_str, season_type_nullableRegular Season, timeout30 ) return finder.get_data_frames()[0] except requests.exceptions.HTTPError as e: # 429是限流5xx是接口臨時(shí)出錯(cuò)都值得重試 wait 2 ** attempt 1 print(f請(qǐng)求失敗({e}){wait}秒后重試) time.sleep(wait) raise RuntimeError(f賽季 {season_str} 拉取失敗) for season in range(2020, 2025): season_str f{season}-{str(season 1)[-2:]} df fetch_with_retry(season_str) time.sleep(1.0)幾個(gè)細(xì)節(jié)說(shuō)明。timeout30 表示單個(gè)請(qǐng)求最多等30秒防止網(wǎng)絡(luò)卡死導(dǎo)致程序掛在那里。重試的等待時(shí)間用 2^n 1 這種指數(shù)退避第一次失敗等3秒第二次等5秒第三次等9秒給服務(wù)端留出恢復(fù)的時(shí)間。還有一個(gè)容易被忽略的問(wèn)題有的校園網(wǎng)出口會(huì)攔截帶特定 UAUser-Agent的請(qǐng)求。如果發(fā)現(xiàn) nba_api 一直在報(bào)連接錯(cuò)誤或 SSL 錯(cuò)誤先別急著懷疑代碼檢查一下系統(tǒng)網(wǎng)絡(luò)設(shè)置或者換個(gè)網(wǎng)絡(luò)環(huán)境再試一次。遇到存疑的報(bào)錯(cuò)把完整異常棧貼到搜索引擎里按報(bào)錯(cuò)關(guān)鍵詞搜通常比盲改代碼高效得多——這是這個(gè)項(xiàng)目里最典型的不確定是代碼問(wèn)題還是網(wǎng)絡(luò)問(wèn)題的場(chǎng)景。3. 特征工程決定準(zhǔn)確率的不是模型而是這四步數(shù)據(jù)加工3.1 先定預(yù)測(cè)目標(biāo)預(yù)測(cè)勝負(fù)還是預(yù)測(cè)分差動(dòng)手寫(xiě)模型之前第一件事是把預(yù)測(cè)目標(biāo)定死。NBA比賽結(jié)果預(yù)測(cè)一般有兩種定義方式一是二分類預(yù)測(cè)主隊(duì)贏還是客隊(duì)贏二是回歸預(yù)測(cè)分差。課程設(shè)計(jì)我建議選二分類理由很實(shí)際二分類的評(píng)估指標(biāo)準(zhǔn)確率、AUC對(duì)新手來(lái)說(shuō)好解釋答辯時(shí)一句模型對(duì)未知比賽預(yù)測(cè)準(zhǔn)確率達(dá)到62%就夠直觀回歸任務(wù)要考慮分差預(yù)測(cè)誤差解釋起來(lái)繞而且分差分布離散模型很難學(xué)出有效規(guī)律。如果你非要做回歸也可以把回歸預(yù)測(cè)的分差轉(zhuǎn)成勝負(fù)標(biāo)簽比如預(yù)測(cè)分差大于0就判主隊(duì)勝。這樣做的好處是多一個(gè)中間量壞處是誤差會(huì)疊加。建議主線做二分類把回歸當(dāng)作補(bǔ)充實(shí)驗(yàn)寫(xiě)進(jìn)文檔對(duì)比兩種建模方式的結(jié)果這反而是加分項(xiàng)。目標(biāo)變量生成時(shí)有一個(gè)新手常犯的錯(cuò)誤直接把原始數(shù)據(jù)里的 WL勝負(fù)字段當(dāng)標(biāo)簽。還記得前面說(shuō)過(guò) leaguegamefinder 返回的是球隊(duì)視角的數(shù)據(jù)嗎同一場(chǎng)比賽有兩行客隊(duì)那行的 WL 是客隊(duì)的勝負(fù)。如果不做配對(duì)直接喂給模型模型就學(xué)到看自己球隊(duì)的勝負(fù)去預(yù)測(cè)自己球隊(duì)的勝負(fù)這種作弊邏輯。正確的做法是按 GAME_ID 把一場(chǎng)比賽的兩行合并成一行主隊(duì)一列、客隊(duì)一列標(biāo)簽是主隊(duì)是否獲勝。3.2 滾動(dòng)均值特征近五場(chǎng)和近十場(chǎng)統(tǒng)計(jì)怎么算才不算錯(cuò)特征工程里最有價(jià)值的特征組是兩支球隊(duì)各自最近N場(chǎng)比賽的表現(xiàn)統(tǒng)計(jì)業(yè)界叫滾動(dòng)均值rolling average。它背后的假設(shè)很樸素一支球隊(duì)近期的進(jìn)攻效率和防守效率最能反映它下一場(chǎng)可能的發(fā)揮。計(jì)算滾動(dòng)均值最核心的一點(diǎn)只能用比賽日之前的數(shù)據(jù)絕不能用之后的數(shù)據(jù)。舉個(gè)例子預(yù)測(cè)1月15日的比賽只能用截至1月14日的比賽統(tǒng)計(jì)如果1月15日當(dāng)天或之后的比賽混進(jìn)滾動(dòng)窗口就造成數(shù)據(jù)泄漏訓(xùn)練準(zhǔn)確率虛高好幾個(gè)點(diǎn)實(shí)戰(zhàn)預(yù)測(cè)卻崩盤(pán)。實(shí)現(xiàn)時(shí)先按 TEAM_ID 和 GAME_DATE 排序再對(duì)每支球隊(duì)單獨(dú)算最近5場(chǎng)和最近10場(chǎng)的滾動(dòng)均值。下面這段代碼是完整實(shí)現(xiàn)# 先按球隊(duì)和日期排序保證滾動(dòng)窗口的順序正確 games pd.read_csv(nba_games_raw.csv) games[GAME_DATE] pd.to_datetime(games[GAME_DATE]) games games.sort_values([TEAM_ID, GAME_DATE]).reset_index(dropTrue) # 要計(jì)算滾動(dòng)均值的統(tǒng)計(jì)列 stat_cols [PTS, PLUS_MINUS, FG_PCT, REB, AST, TOV] for col in stat_cols: for window in [5, 10]: # 先按球隊(duì)分組計(jì)算滾動(dòng)均值 roll ( games.groupby(TEAM_ID)[col] .rolling(window, min_periods1) .mean() .reset_index(level0, dropTrue) ) # shift(1) 把均值整體下移一行 # 讓第k行不再包含第k場(chǎng)自己的數(shù)據(jù)這是防泄漏的關(guān)鍵 games[f{col}_roll{window}] roll.groupby(games[TEAM_ID]).shift(1) print(games[[TEAM_ID, GAME_DATE, PTS, PTS_roll5, PTS_roll10]].head(20))注意沒(méi)有 shift(1) 的滾動(dòng)均值等于把本場(chǎng)比賽的數(shù)據(jù)喂給了本場(chǎng)比賽這是整個(gè)項(xiàng)目最隱蔽的數(shù)據(jù)泄漏點(diǎn)務(wù)必檢查。這段代碼有兩個(gè)關(guān)鍵點(diǎn)。第一groupby(TEAM_ID).rolling(window).mean() 在分組內(nèi)部計(jì)算滾動(dòng)均值窗口是5場(chǎng)或10場(chǎng)互不干擾。第二shift(1) 是防止數(shù)據(jù)泄漏的心臟它把計(jì)算結(jié)果整體下移一行這樣第k行存的是第k-1場(chǎng)及之前窗口內(nèi)的均值當(dāng)前場(chǎng)比賽本身不參與自己的特征計(jì)算。為什么 min_periods1 而不是默認(rèn)的 window因?yàn)橘惣境醯那皫讏?chǎng)比賽不夠湊滿窗口。設(shè)成 window 的話賽季前4場(chǎng)的特征全是空值要么刪樣本要么手工填充設(shè)成1表示至少有一場(chǎng)比賽就開(kāi)始算均值缺點(diǎn)是賽季初期特征偏小、波動(dòng)大但至少模型有特征可用。認(rèn)真一點(diǎn)的做法是用上一賽季的均值回填賽季前幾場(chǎng)課程設(shè)計(jì)階段不必做這么細(xì)。3.3 賽程特征休息天數(shù)、背靠背和主場(chǎng)優(yōu)勢(shì)怎么編碼滾動(dòng)均值之外還有三類特征在NBA預(yù)測(cè)里被反復(fù)驗(yàn)證有效休息天數(shù)、背靠背標(biāo)記、主場(chǎng)優(yōu)勢(shì)。休息天數(shù)指距離上一場(chǎng)比賽隔了多少天。NBA常規(guī)賽幾乎每天都有比賽強(qiáng)隊(duì)一個(gè)賽季要打多次背靠背連續(xù)兩天比賽球員體能差異會(huì)直接影響比賽結(jié)果。計(jì)算方式是把同一支球隊(duì)的比賽按日期排序然后算相鄰兩場(chǎng)比賽的日期差。背靠背是個(gè)0/1標(biāo)記表示該隊(duì)這場(chǎng)比賽的前一天是否也有比賽。注意背靠背還要區(qū)分主客場(chǎng)如果是客場(chǎng)打完再趕去下一個(gè)客場(chǎng)影響更大如果是連續(xù)兩個(gè)主場(chǎng)影響相對(duì)小。課程設(shè)計(jì)階段做一版簡(jiǎn)化的0/1標(biāo)記就夠了想認(rèn)真雕琢可以拆成背靠背且客場(chǎng)和背靠背且主場(chǎng)兩個(gè)特征。主場(chǎng)優(yōu)勢(shì)是從 matchup 字段里解析出來(lái)的包含 表示客場(chǎng)否則是主場(chǎng)。這個(gè)特征在模型里通常系數(shù)顯著為正說(shuō)明主場(chǎng)優(yōu)勢(shì)對(duì)NBA比賽結(jié)果有真實(shí)影響。下面這段代碼把這三類賽程特征一次性生成# 從 matchup 解析主客場(chǎng)包含 表示客場(chǎng) games[is_home] games[MATCHUP].apply(lambda x: not in x) # 每支球隊(duì)的上一場(chǎng)比賽日期用于推算休息天數(shù)和背靠背 games games.sort_values([TEAM_ID, GAME_DATE]) games[prev_game_date] games.groupby(TEAM_ID)[GAME_DATE].shift(1) games[rest_days] (games[GAME_DATE] - games[prev_game_date]).dt.days # 背靠背距離上一場(chǎng)正好1天 games[back_to_back] (games[rest_days] 1).astype(int) # 主隊(duì)表和客隊(duì)表按 GAME_ID 合并回到比賽視角 home games[games[is_home]].copy() away games[~games[is_home]].copy() merged home.merge( away, onGAME_ID, suffixes(_home, _away) ) print(merged.shape) merged.to_csv(nba_games_features.csv, indexFalse)整體思路是把球隊(duì)視角數(shù)據(jù)拆成主隊(duì)表和客隊(duì)表再按 GAME_ID 合回比賽視角。合并之后每一行就是一場(chǎng)比賽左邊是主隊(duì)近期統(tǒng)計(jì)右邊是客隊(duì)近期統(tǒng)計(jì)中間夾著賽程特征。至此特征工程的骨架就搭完了。合并后行數(shù)會(huì)變成原來(lái)的一半因?yàn)槊繄?chǎng)比賽從兩行合為一行這是正常的。合并完記得檢查有沒(méi)有 GAME_ID 重復(fù)——如果接口在某個(gè)賽季返回了全明星賽或其他非正式比賽可能出現(xiàn)一對(duì)多的匹配需要提前按賽事類型過(guò)濾只保留常規(guī)賽記錄。3.4 時(shí)間切分為什么隨機(jī)打亂訓(xùn)練集相當(dāng)于讓模型作弊這個(gè)問(wèn)題幾乎每個(gè)做時(shí)序預(yù)測(cè)的人都會(huì)踩一次用 train_test_split 默認(rèn)隨機(jī)切分訓(xùn)練集里混著后面的比賽測(cè)試集里混著前面的比賽。對(duì)NBA這種強(qiáng)時(shí)序依賴的數(shù)據(jù)隨機(jī)切分意味著模型的訓(xùn)練數(shù)據(jù)里包含了未來(lái)特征和標(biāo)簽產(chǎn)生隱性的時(shí)間交叉準(zhǔn)確率虛高。正確的做法是按時(shí)序切分比如用2020到2023賽季的數(shù)據(jù)訓(xùn)練用2024賽季的數(shù)據(jù)測(cè)試。train_test_split 不支持直接按時(shí)間切但把 shuffleFalse 配合已排序的數(shù)據(jù)即可實(shí)現(xiàn)或者干脆手動(dòng)切片games pd.read_csv(nba_games_features.csv, parse_dates[GAME_DATE_home]) games games.sort_values(GAME_DATE_home).reset_index(dropTrue) split_date 2023-10-24 # 以2023-24賽季揭幕戰(zhàn)為界 train games[games[GAME_DATE_home] split_date] test games[games[GAME_DATE_home] split_date] print(f訓(xùn)練集 {train.shape[0]} 場(chǎng) f{train[GAME_DATE_home].min().date()} ~ {train[GAME_DATE_home].max().date()}) print(f測(cè)試集 {test.shape[0]} 場(chǎng) f{test[GAME_DATE_home].min().date()} ~ {test[GAME_DATE_home].max().date()})這么切完會(huì)發(fā)現(xiàn)測(cè)試集在時(shí)間上完全晚于訓(xùn)練集模型在測(cè)試集上的準(zhǔn)確率通常比隨機(jī)切分低2到4個(gè)百分點(diǎn)這才是真實(shí)水平。答辯時(shí)主動(dòng)提一句我沒(méi)有用隨機(jī)切分而是用了時(shí)間切分以避免數(shù)據(jù)泄漏這一句話就能讓評(píng)委知道你理解機(jī)器學(xué)習(xí)應(yīng)用流程里最關(guān)鍵的細(xì)節(jié)。4. 機(jī)器學(xué)習(xí)模型選型與調(diào)參從邏輯回歸到XGBoost的三個(gè)階梯4.1 基線模型先跑邏輯回歸立住能跑通的版本模型部分我強(qiáng)烈建議先跑邏輯回歸當(dāng)基線不要一上來(lái)就上XGBoost。原因有兩個(gè)一是邏輯回歸訓(xùn)練快幾秒出結(jié)果適合用來(lái)驗(yàn)證特征管道有沒(méi)有問(wèn)題二是邏輯回歸的系數(shù)可以解釋你能看到哪些特征對(duì)預(yù)測(cè)結(jié)果影響最大這對(duì)寫(xiě)課程設(shè)計(jì)文檔非常有幫助。特征列的準(zhǔn)備和標(biāo)簽列的定義是這一步的關(guān)鍵。以 nba_games_features.csv 為例特征列包括主隊(duì)和客隊(duì)的滾動(dòng)均值、休息天數(shù)、背靠背標(biāo)記。標(biāo)簽列定義為 home_win表示主隊(duì)是否獲勝。import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler from sklearn.metrics import accuracy_score, log_loss games pd.read_csv(nba_games_features.csv, parse_dates[GAME_DATE_home]) games games.sort_values(GAME_DATE_home).reset_index(dropTrue) # 標(biāo)簽主隊(duì)得分大于客隊(duì)得分則主勝 games[home_win] (games[PTS_home] games[PTS_away]).astype(int) # 特征列滾動(dòng)均值 賽程特征 feature_cols [ PTS_roll5_home, PLUS_MINUS_roll5_home, FG_PCT_roll5_home, PTS_roll5_away, PLUS_MINUS_roll5_away, FG_PCT_roll5_away, rest_days_home, rest_days_away, back_to_back_home, back_to_back_away, ] X games[feature_cols] y games[home_win] # 邏輯回歸對(duì)特征尺度敏感先標(biāo)準(zhǔn)化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 時(shí)間切分2023-24賽季之前訓(xùn)練之后測(cè)試 split_date pd.Timestamp(2023-10-24) train_idx games[GAME_DATE_home] split_date test_idx games[GAME_DATE_home] split_date model LogisticRegression(max_iter1000) model.fit(X_scaled[train_idx], y[train_idx]) y_prob model.predict_proba(X_scaled[test_idx])[:, 1] y_pred (y_prob 0.5).astype(int) print(f邏輯回歸準(zhǔn)確率{accuracy_score(y[test_idx], y_pred):.4f}) print(f對(duì)數(shù)損失{log_loss(y[test_idx], y_prob):.4f}) # 打印系數(shù)看特征影響方向 coef_df pd.DataFrame({feature: feature_cols, coef: model.coef_[0]}) print(coef_df.sort_values(coef, ascendingFalse))這段代碼里max_iter1000 是因?yàn)闃?biāo)準(zhǔn)化之后特征數(shù)量不算少默認(rèn)100次迭代偶爾不收斂調(diào)大一點(diǎn)更穩(wěn)妥。predict_proba 返回二維數(shù)組取第二列就是主勝概率。log_loss 是概率預(yù)測(cè)的對(duì)數(shù)損失越小說(shuō)明概率校準(zhǔn)越好后面比較模型時(shí)比準(zhǔn)確率更細(xì)膩。跑完你會(huì)看到PLUS_MINUS_roll5_home 這類凈勝分滾動(dòng)均值的系數(shù)通常顯著高于其他特征說(shuō)明近期凈勝分是預(yù)測(cè)比賽結(jié)果最強(qiáng)的單一信號(hào)。把基于系數(shù)分析特征重要性寫(xiě)進(jìn)課程設(shè)計(jì)報(bào)告就是一塊拿得出手的內(nèi)容。4.2 樹(shù)模型上場(chǎng)隨機(jī)森林和XGBoost的參數(shù)怎么設(shè)基線跑通之后下一步換更強(qiáng)的模型。比賽預(yù)測(cè)場(chǎng)景里隨機(jī)森林和XGBoost是主流選擇。兩者都是樹(shù)模型能自動(dòng)處理特征之間的非線性關(guān)系不需要像邏輯回歸那樣做標(biāo)準(zhǔn)化。代價(jià)是模型本身像個(gè)黑匣子你很難直接說(shuō)出每個(gè)特征的作用方向。隨機(jī)森林的優(yōu)勢(shì)是參數(shù)少、不容易過(guò)擬合、訓(xùn)練速度快適合作為第一個(gè)升級(jí)版模型。XGBoost 的準(zhǔn)確率通常比隨機(jī)森林高零點(diǎn)幾到一兩個(gè)百分點(diǎn)但參數(shù)非常多調(diào)起來(lái)耗時(shí)對(duì)新手不友好。建議課程設(shè)計(jì)用隨機(jī)森林做主線XGBoost 作為進(jìn)階對(duì)比實(shí)驗(yàn)時(shí)間緊的話只做隨機(jī)森林也完全夠。下面這段代碼同時(shí)跑隨機(jī)森林和 XGBoostfrom sklearn.ensemble import RandomForestClassifier from xgboost import XGBClassifier # 樹(shù)模型不需要標(biāo)準(zhǔn)化直接用原始特征 X_train, X_test X.iloc[train_idx], X.iloc[test_idx] y_train, y_test y[train_idx], y[test_idx] rf RandomForestClassifier( n_estimators300, max_depth6, min_samples_leaf5, random_state42, n_jobs-1 ) rf.fit(X_train, y_train) rf_prob rf.predict_proba(X_test)[:, 1] print(f隨機(jī)森林準(zhǔn)確率{accuracy_score(y_test, (rf_prob 0.5).astype(int)):.4f}) xgb XGBClassifier( n_estimators300, max_depth4, learning_rate0.05, subsample0.8, colsample_bytree0.8, random_state42, eval_metriclogloss ) xgb.fit(X_train, y_train) xgb_prob xgb.predict_proba(X_test)[:, 1] print(fXGBoost準(zhǔn)確率{accuracy_score(y_test, (xgb_prob 0.5).astype(int)):.4f})關(guān)鍵參數(shù)說(shuō)明如下表模型參數(shù)作用課程設(shè)計(jì)推薦值隨機(jī)森林n_estimators樹(shù)的數(shù)量200~500隨機(jī)森林max_depth樹(shù)的最大深度防過(guò)擬合6~8隨機(jī)森林min_samples_leaf葉子節(jié)點(diǎn)最少樣本數(shù)5~10XGBoostlearning_rate學(xué)習(xí)率越小步長(zhǎng)越細(xì)0.03~0.1XGBoostn_estimators迭代輪數(shù)與學(xué)習(xí)率配合200~500XGBoostsubsample每輪抽樣比例0.7~0.9XGBoostcolsample_bytree每棵樹(shù)使用特征比例0.7~0.9隨機(jī)森林的 max_depth6 和 min_samples_leaf5 是防過(guò)擬合的核心參數(shù)如果訓(xùn)練集只有幾千場(chǎng)樹(shù)的深度超過(guò)8就很容易把訓(xùn)練集背下來(lái)。XGBoost 的 learning_rate0.05 配合 n_estimators300表示以較小步長(zhǎng)迭代300輪subsample0.8 每輪抽80%樣本colsample_bytree0.8 每棵樹(shù)抽80%特征這兩個(gè)參數(shù)能明顯提升泛化能力。另外樹(shù)模型的超參數(shù)設(shè)置在一定程度上有玄學(xué)成分不用追求全局最優(yōu)關(guān)鍵是先設(shè)一組合理的默認(rèn)值跑通再圍繞防過(guò)擬合調(diào)深度和樣本量。eval_metriclogloss 是告訴 XGBoost 用對(duì)數(shù)損失作為內(nèi)部評(píng)估標(biāo)準(zhǔn)。如果你裝的是很老的 XGBoost 版本可能遇到 deprecation 警告不影響運(yùn)行新版直接不用管。4.3 評(píng)估指標(biāo)怎么選準(zhǔn)確率、對(duì)數(shù)損失與AUC的分工課程設(shè)計(jì)報(bào)告里只寫(xiě)一個(gè)準(zhǔn)確率數(shù)字很單薄。建議至少同時(shí)報(bào)告三個(gè)指標(biāo)準(zhǔn)確率、對(duì)數(shù)損失和AUC它們各自回答不同的問(wèn)題。準(zhǔn)確率最直觀預(yù)測(cè)錯(cuò)誤的場(chǎng)次占比多少但缺點(diǎn)是無(wú)法反映概率的可信度。比如模型對(duì)某場(chǎng)比賽給出51%的勝率贏了算對(duì)、輸了算錯(cuò)但51%和95%的置信度顯然不一樣。對(duì)數(shù)損失就能懲罰這種低置信度錯(cuò)誤模型在錯(cuò)誤方向上給出的概率越高懲罰越重。AUC 則是排序能力的度量回答模型給出的概率排序是否合理和具體閾值無(wú)關(guān)對(duì)樣本不平衡也不太敏感。三者的組合能幫你判斷改進(jìn)方向。如果準(zhǔn)確率還行但 log loss 偏高說(shuō)明模型對(duì)某些比賽過(guò)度自信可以降低樹(shù)模型深度如果 AUC 明顯高于0.5說(shuō)明特征和標(biāo)簽的關(guān)聯(lián)真實(shí)存在問(wèn)題出在閾值設(shè)置可以微調(diào)判定閾值。from sklearn.metrics import roc_auc_score, brier_score_loss for name, prob in [(邏輯回歸, y_prob), (隨機(jī)森林, rf_prob), (XGBoost, xgb_prob)]: auc roc_auc_score(y_test, prob) brier brier_score_loss(y_test, prob) acc accuracy_score(y_test, (prob 0.5).astype(int)) print(f{name}: 準(zhǔn)確率{acc:.4f}, AUC{auc:.4f}, Brier{brier:.4f})Brier 分?jǐn)?shù)是概率預(yù)測(cè)和真實(shí)結(jié)果之間的均方誤差越小越好。答辯時(shí)一張表格列出三個(gè)模型的準(zhǔn)確率、AUC、log loss、Brier就構(gòu)成了一個(gè)完整的評(píng)估體系。如果想把 Python數(shù)據(jù)分析與可視化 也加進(jìn)去用 matplotlib 畫(huà)一條 ROC 曲線放到報(bào)告里能直觀展示三個(gè)模型在不同閾值下的表現(xiàn)差異。4.4 分組交叉驗(yàn)證防止同賽季的比賽同時(shí)出現(xiàn)在訓(xùn)練集和驗(yàn)證集講完評(píng)估指標(biāo)必須講交叉驗(yàn)證的正確姿勢(shì)。很多同學(xué)用 GridSearchCV 調(diào)參時(shí)發(fā)現(xiàn)驗(yàn)證集表現(xiàn)很好一到時(shí)間切分的測(cè)試集就掉點(diǎn)。原因在于默認(rèn)的 KFold 是隨機(jī)切分的前面也說(shuō)過(guò)隨機(jī)切分在時(shí)序數(shù)據(jù)上等于讓模型瞥見(jiàn)了未來(lái)。正確的做法是 TimeSeriesSplit 或 GroupKFold 按賽季分組。TimeSeriesSplit 每次都拿時(shí)間靠前的數(shù)據(jù)做訓(xùn)練、時(shí)間靠后的做驗(yàn)證模擬真實(shí)預(yù)測(cè)場(chǎng)景。GroupKFold 則保證整個(gè)賽季的數(shù)據(jù)在同一折里面避免同賽季比賽被切到訓(xùn)練和驗(yàn)證兩側(cè)。from sklearn.model_selection import TimeSeriesSplit, cross_val_score from sklearn.ensemble import RandomForestClassifier # 數(shù)據(jù)必須先按時(shí)間升序排序TimeSeriesSplit 才有效 games_sorted games.sort_values(GAME_DATE_home).reset_index(dropTrue) X_sorted games_sorted[feature_cols] y_sorted games_sorted[home_win] tscv TimeSeriesSplit(n_splits5) rf RandomForestClassifier(n_estimators200, max_depth6, random_state42, n_jobs-1) scores cross_val_score(rf, X_sorted, y_sorted, cvtscv, scoringaccuracy) print(fTimeSeriesSplit 交叉驗(yàn)證準(zhǔn)確率{scores.mean():.4f} ± {scores.std():.4f})關(guān)鍵點(diǎn)cross_val_score 用 TimeSeriesSplit 時(shí)不會(huì)自動(dòng)打亂數(shù)據(jù)你必須確保傳入的 X_sorted 本身按時(shí)間升序排好否則切分失去意義。scoringaccuracy 可以換成 scoringroc_auc 評(píng)估排序能力。如果想用默認(rèn)切分快速看一眼指標(biāo)可以先用 KFold 跑一遍但報(bào)告里一定要寫(xiě)明隨機(jī)切分在時(shí)序數(shù)據(jù)上的局限。把隨機(jī)切分和時(shí)間切分的對(duì)比寫(xiě)進(jìn)課程設(shè)計(jì)文檔本身就是很漂亮的實(shí)驗(yàn)設(shè)計(jì)。5. 避坑指南NBA預(yù)測(cè)項(xiàng)目里最常翻車的五個(gè)地方這幾個(gè)坑是我自己反復(fù)踩、也幫同學(xué)改這個(gè)題目時(shí)見(jiàn)得最多的按出現(xiàn)頻率排序照著排查基本能解決大部分問(wèn)題。5.1 現(xiàn)象拉取數(shù)據(jù)時(shí)頻繁報(bào)429或連接超時(shí)現(xiàn)象循環(huán)拉五個(gè)賽季的數(shù)據(jù)拉到第二個(gè)賽季就拋 requests.exceptions.HTTPError: 429 Too Many Requests或者程序直接卡住不動(dòng)。原因nba_api 底層請(qǐng)求的是 NBA 官網(wǎng)接口官網(wǎng)對(duì)單IP的請(qǐng)求頻率有限制。課程設(shè)計(jì)階段大家常在機(jī)房或宿舍網(wǎng)絡(luò)下跑一個(gè)出口IP可能有多臺(tái)設(shè)備同時(shí)請(qǐng)求更容易觸發(fā)限流。另一個(gè)隱藏原因是某些版本的 nba_api 默認(rèn)沒(méi)有設(shè)置 User-Agent被官網(wǎng)的防火墻識(shí)別成爬蟲(chóng)直接拒絕。解決一是在每次請(qǐng)求之間加 time.sleep(1)把請(qǐng)求間隔控制在一秒以上二是給請(qǐng)求設(shè)置瀏覽器 UA 和完整的請(qǐng)求頭三是給單次請(qǐng)求設(shè)置 timeout 參數(shù)避免卡死。前面2.4節(jié)的重試代碼可以直接復(fù)用。如果學(xué)校網(wǎng)絡(luò)反復(fù)出問(wèn)題換手機(jī)熱點(diǎn)試一次很多時(shí)候是網(wǎng)絡(luò)鏈路的問(wèn)題而不是代碼的問(wèn)題。5.2 現(xiàn)象訓(xùn)練準(zhǔn)確率高達(dá)80%以上一上真實(shí)預(yù)測(cè)就崩現(xiàn)象訓(xùn)練集準(zhǔn)確率能到85%時(shí)間切分的測(cè)試集也能到65%左右但拿模型去預(yù)測(cè)下一周的真實(shí)比賽準(zhǔn)確率只有50%上下跟猜差不多。原因根子上幾乎全是數(shù)據(jù)泄漏。常見(jiàn)泄漏點(diǎn)有三個(gè)滾動(dòng)均值沒(méi)有 shift(1)當(dāng)天的比賽數(shù)據(jù)參與了當(dāng)天特征計(jì)算切分沒(méi)有按時(shí)間隨機(jī)切分讓模型在訓(xùn)練時(shí)看到了未來(lái)第三個(gè)最隱蔽——標(biāo)簽構(gòu)造錯(cuò)誤或者把比賽結(jié)束后的全場(chǎng)累計(jì)統(tǒng)計(jì)比如球隊(duì)單場(chǎng)籃板、助攻總數(shù)當(dāng)成了特征數(shù)據(jù)和標(biāo)簽同時(shí)來(lái)自同一個(gè)結(jié)果準(zhǔn)確率自然虛高。解決逐一排查。滾動(dòng)均值必須 shift(1)切分必須用時(shí)間切分標(biāo)簽必須按 GAME_ID 配對(duì)后生成主隊(duì)勝負(fù)特征列里不能出現(xiàn)和比賽同一天生成的統(tǒng)計(jì)。排查方法很樸素隨機(jī)挑一場(chǎng)已知結(jié)果的比賽手工算它的滾動(dòng)均值特征和代碼計(jì)算值對(duì)比看是否嚴(yán)格排除了當(dāng)天比賽。在報(bào)告里寫(xiě)一句已人工校驗(yàn)特征無(wú)泄漏很顯專業(yè)。5.3 現(xiàn)象做滾動(dòng)均值或合并時(shí)報(bào)索引不對(duì)齊現(xiàn)象跑特征工程時(shí)報(bào) ValueError: cannot reindex on an axis with duplicate labels或者合并出來(lái)的結(jié)果是全 NaN。原因通常是因?yàn)?GAME_ID 有重復(fù)或者 rolling 之后 reset_index 的方式不對(duì)。一個(gè) GAME_ID 在主客兩行里如果格式不一致一個(gè)純數(shù)字一個(gè)字符串merge 時(shí)會(huì)變成笛卡爾積。另外groupby().rolling() 返回的是分組級(jí)索引沒(méi)有正確 reset 的話會(huì)把原始 DataFrame 索引打亂后續(xù)一切按索引對(duì)齊的操作都會(huì)錯(cuò)位。解決拿到原始數(shù)據(jù)后先做三件事GAME_ID 統(tǒng)一轉(zhuǎn)成 str檢查并去除重復(fù)行確保 GAME_DATE 已轉(zhuǎn)成 datetime。rolling 計(jì)算完統(tǒng)一 reset_index(dropTrue)再做 merge。標(biāo)準(zhǔn)的預(yù)處理開(kāi)頭長(zhǎng)這樣games[GAME_ID] games[GAME_ID].astype(str) games games.drop_duplicates(subset[GAME_ID, TEAM_ID]) games games.sort_values([TEAM_ID, GAME_DATE]).reset_index(dropTrue) assert games.duplicated(subset[GAME_ID, TEAM_ID]).sum() 0 print(數(shù)據(jù)檢查通過(guò)無(wú)重復(fù)記錄索引已重置)5.4 現(xiàn)象同樣的代碼換臺(tái)電腦跑結(jié)果完全不一樣現(xiàn)象自己電腦上準(zhǔn)確率62%換到舍友電腦或者答辯電腦上跑變成58%甚至更低或者直接報(bào)錯(cuò)。原因最常見(jiàn)的原因是庫(kù)版本不一致。pandas 不同版本的 rolling 行為、sklearn 不同版本的隨機(jī)數(shù)、nba_api 不同版本的字段名都會(huì)導(dǎo)致差異。特別是 nba_api 更新頻繁字段名或構(gòu)造函數(shù)參數(shù)名可能變化老代碼在新版本下可能直接報(bào)錯(cuò)。另一個(gè)原因是數(shù)據(jù)不同——兩次拉取時(shí)間不同數(shù)據(jù)里包含的場(chǎng)次數(shù)不一樣特征統(tǒng)計(jì)自然有差異。解決寫(xiě)一個(gè) requirements.txt 把核心依賴版本鎖死文檔里寫(xiě)明測(cè)試環(huán)境。答辯前提前去答辯電腦上把環(huán)境和依賴裝好不要臨場(chǎng)拉數(shù)據(jù)。數(shù)據(jù)方面固定下載日期把原始CSV隨代碼一起提交任何環(huán)境跑的都是同一份數(shù)據(jù)。如果 nba_api 版本過(guò)新導(dǎo)致參數(shù)報(bào)錯(cuò)快速定位的方式是打印 dir(leaguegamefinder) 看當(dāng)前支持的參數(shù)名別拿老教程硬套。5.5 現(xiàn)象預(yù)測(cè)概率總往0.5收縮看不出觀點(diǎn)現(xiàn)象模型輸出的概率絕大多數(shù)落在0.4到0.6之間很少出現(xiàn)70%以上的判斷看著不夠有觀點(diǎn)。原因這在NBA預(yù)測(cè)里是正?,F(xiàn)象不是bug?;@球比賽本身隨機(jī)性很強(qiáng)主場(chǎng)優(yōu)勢(shì)、近期狀態(tài)這些信號(hào)只能解釋比賽結(jié)果的一部分方差模型天然學(xué)不到特別強(qiáng)的區(qū)分度。NBA單場(chǎng)兩隊(duì)合計(jì)得分動(dòng)輒230分以上一個(gè)球員手感爆發(fā)就能改變走勢(shì)概率往0.5收縮是信息量的真實(shí)反映不是模型壞了。解決不要為了模型有觀點(diǎn)去強(qiáng)行調(diào)閾值或改損失函數(shù)。正確做法是接受這個(gè)現(xiàn)實(shí)從特征側(cè)找增量——加入球員輪休、傷病名單、球隊(duì)連勝連敗狀態(tài)都能小幅拉開(kāi)概率。還可以建模分差而不是勝負(fù)因?yàn)檫B續(xù)量比分立標(biāo)簽包含更多信息。說(shuō)到底60%到63%的準(zhǔn)確率對(duì)這個(gè)任務(wù)已經(jīng)是很不錯(cuò)的水平對(duì)比隨機(jī)猜測(cè)的50%基準(zhǔn)這個(gè)結(jié)論本身就立得住。6. 進(jìn)階驗(yàn)證用滾動(dòng)回測(cè)與概率校準(zhǔn)檢驗(yàn)?zāi)P驼鎸?shí)水平模型訓(xùn)練完還差最后一環(huán)用一套能反復(fù)執(zhí)行的驗(yàn)證流程證明模型不是碰運(yùn)氣。課程設(shè)計(jì)里最常說(shuō)的一句話是模型準(zhǔn)確率62%但這個(gè)數(shù)字怎么來(lái)的、在不同時(shí)間段是否穩(wěn)定很多人說(shuō)不清楚。這一章講兩個(gè)進(jìn)階動(dòng)作滾動(dòng)回測(cè)和概率校準(zhǔn)。滾動(dòng)回測(cè)的思路是模擬真實(shí)的預(yù)測(cè)節(jié)奏。假設(shè)現(xiàn)在是某個(gè)比賽日你有截至前一天的所有數(shù)據(jù)要預(yù)測(cè)今天所有比賽的勝負(fù)等比賽結(jié)束把預(yù)測(cè)和結(jié)果對(duì)比記錄命中。把時(shí)間軸往前推每周做一次這樣的預(yù)測(cè)累積一整個(gè)賽季就得到一條真實(shí)的準(zhǔn)確率曲線。實(shí)現(xiàn)上不需要復(fù)雜框架一個(gè) for 循環(huán)就能完成。# 把測(cè)試期按周切塊逐周回測(cè) test_games games[games[GAME_DATE_home] split_date].copy() test_games[week] test_games[GAME_DATE_home].dt.isocalendar().week results [] for week, group in test_games.groupby(week): # 截止到本周之前的全部數(shù)據(jù)作為訓(xùn)練集 train_data games[games[GAME_DATE_home] group[GAME_DATE_home].min()] if len(train_data) 200: continue X_tr train_data[feature_cols] y_tr train_data[home_win] # 每周重新訓(xùn)練一次模擬真實(shí)部署節(jié)奏 rf RandomForestClassifier(n_estimators200, max_depth6, random_state42) rf.fit(X_tr, y_tr) prob rf.predict_proba(group[feature_cols])[:, 1] acc ((prob 0.5).astype(int) group[home_win].values).mean() results.append({week: week, games: len(group), accuracy: acc}) result_df pd.DataFrame(results) print(result_df) print(f整體回測(cè)準(zhǔn)確率{result_df[accuracy].mean():.4f})這段代碼的核心是每周重訓(xùn)一次而不是訓(xùn)一次模型測(cè)一整年。因?yàn)镹BA賽季中有交易、傷病、陣容變化固定模型會(huì)隨時(shí)間推移慢慢失效?;販y(cè)結(jié)果里命中率的波動(dòng)范圍值得關(guān)注——如果某幾周準(zhǔn)確率突然跌到40%以下去查那幾周發(fā)生了什么往往能對(duì)應(yīng)上全明星周末、交易截止日這類特殊賽程事件。概率校準(zhǔn)是第二個(gè)值得做的動(dòng)作。模型輸出0.55的概率到底接近真實(shí)命中率還是虛標(biāo)需要用校準(zhǔn)曲線驗(yàn)證。sklearn 的 calibration_curve 可以直接畫(huà)from sklearn.calibration import calibration_curve import matplotlib.pyplot as plt # 把測(cè)試集概率分桶對(duì)比每個(gè)桶內(nèi)的實(shí)際命中率 prob_true, prob_pred calibration_curve(y_test, xgb_prob, n_bins10) plt.figure(figsize(6, 6)) plt.plot(prob_pred, prob_true, markero, labelXGBoost) plt.plot([0, 1], [0, 1], linestyle--, label理想校準(zhǔn)) plt.xlabel(預(yù)測(cè)概率) plt.ylabel(實(shí)際命中率) plt.legend() plt.savefig(calibration_curve.png, dpi150)如果校準(zhǔn)曲線明顯偏離對(duì)角線說(shuō)明概率系統(tǒng)性偏高或偏低這時(shí)可以用 CalibratedClassifierCV 做一次事后校準(zhǔn)。對(duì)課程設(shè)計(jì)來(lái)說(shuō)畫(huà)一張校準(zhǔn)曲線并解釋它的含義比多調(diào)幾個(gè)百分點(diǎn)的準(zhǔn)確率更能體現(xiàn)你對(duì)機(jī)器學(xué)習(xí)模型的理解深度。我自己做這個(gè)項(xiàng)目時(shí)養(yǎng)成的習(xí)慣是每個(gè)比賽日結(jié)束后把前一天的真實(shí)結(jié)果回填到數(shù)據(jù)表重算滾動(dòng)均值重新訓(xùn)練模型再把當(dāng)日比賽的預(yù)測(cè)輸出到一個(gè)CSV。堅(jiān)持一個(gè)月累積下來(lái)就能畫(huà)出一條真實(shí)的準(zhǔn)確率曲線??吹角€連續(xù)下滑就知道該更新特征或者查查是不是有核心球員傷停了——這種從數(shù)據(jù)里發(fā)現(xiàn)問(wèn)題的感覺(jué)比調(diào)參更有成就感。這個(gè)項(xiàng)目做完你帶走的不只是代碼而是一套從需求到可驗(yàn)證結(jié)果的完整套路先跑通最小流程再逐層加特征、換模型、補(bǔ)評(píng)估每一步都有可驗(yàn)證的輸出。以后做別的數(shù)據(jù)類項(xiàng)目這條骨架都能直接復(fù)用。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
熟妇女伦乱视频视频| 99精品综合久久久久五月天| 亚洲国产一级黄色视频| av大香蕉网站| 96AV精品| 一个人在线看的黄色电影网站| 后入式视频国产自| 夜夜骑夜夜操| 欧美日韩夜夜| 91在线丝袜视频| 97频视在线| 91狠狠| 91久久久亚洲| 偷拍新久久| 国产黄色小视频网站| 在线观看免费视频国产| 欧日韩在线观看| 91亚州| 国产av波波国产精品| 国产精品免费美女视频| 97久久精品亚洲| 蜜臀精品1区2区| 日本免费不卡二区| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 91黑丝露脚| 五月天伊人| 亚洲图片91| 人人操人人操人人操人人操人人操人人人11.CM | 伊人97色天使| 亚洲在线A| 国产精品一区午夜福利| 久久极品一区二区| 久久久999国产精品| 一区二区影院| juliaann丝袜大战黑鬼| 超碰2017| 亚洲精品蜜桃久久久一区二区三区| 欧美成人综合| 欧美日韩大黄片| 国产精品熟女AV中文字幕在线播放| 精国久久一区二区三区98| 性无码专区2020| 99热亚洲| 97AV在线观看| 999久久久久久久精| 男人综合网| 天天综合精品| aa片毛片| 7777奇米影视久久| 97日韩欧美| 中日亚韩免费视频| 伊人97色天使| 91色人| 东京热亚洲一区二区| 亚洲精品97| 欧美曰韩国产精品| 飘花国产午夜精品不卡| ,国产乱人伦精品一区二区三区| 9超碰免费| 涩爱AV在线| xxx0国产在线播放| 麻豆视频test| 校园春色欧美| 国产高清精品一区二区三区毛片| 成片免费播放| 97网址97| 天天摸夜夜添无码小视频| 五月婷婷啪啪| 熟妇一区二区三区| 嗯嗯啊啊操我| 97人人干| 亚洲男人天堂视频| 少妇一区二区三区| 夜间福利片1000无码| 中文字幕在线免费观看视频| 无码一区二区三区四区五区六区七区八区九区十区视频 | 久久精品国产亚洲av水密被窝| 国产亚洲精品久久久久小| 操狠狠| 亚洲第一页色网| 一级人妻性爱视频| 91粉嫩萝控精品福利网站_精品影音先锋国| 日本九九久久99播| 啊啊啊草死我| 老熟女熟妇| 91精品国产91熟女| 免费观看欧美日韩操逼视频| 亚洲国产精品无码AV久久久| 91麻豆天美国产| 岛国黄片网站| 成人片视频| 日本孕妇一区二区视频操逼免费看 | 欧美一区二区男人天堂| 97色伦97色伦国产欧美| 一级AV性爱| 久久精品国产亚洲AV片多多 | 校园春色制服丝袜中文字亚洲 | 国产AV高清AV无码| 美女天天干| 婷婷中文字幕| 激情文学88| 色大师网站www永久网站视频| 欧美激情专区| 精品人妻一二三四区视频| 国产欧美精选激情视频| 国产亚洲福利第一页丝袜| 亚洲欧美日韩电影网站一区| 一区二区你上我| 中文字幕高清精品一区| 欧美日韩中文视频播放| 亚洲情色 自拍| 玖玖97综合| 爱射综合| 国产 三级自拍| 91精品丝袜久久久久久| 欧美黑人168页欧美黑人167| 熟女久久久| 97久久精品不卡| caorenqi shipin| 国产精品老师| 91黑丝少妇| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 性天堂| 国产精品久久久久9999小说| 欧美偷拍| 亚州一区二区| 9118禁| 久久久久久久久久久久色网| 成人九九| 深喉吞精| 久久久久少妇| 中文字幕高清精品一区| 亚洲欧美不卡线| 易易A毛视频| 欧美黑人91| 97视频www| 欧美高潮| 久久免费少妇| 自拍偷拍亚洲熟女妇人精品| 日本性交操一区二区不卡系列| 蜜桃久久一区二区| 五月天我淫我色av| 亚洲欧美自拍偷拍| 曰韩av中文字幕专区| 色婷婷久久| 无码免费一区二区三区啪啪| 国产原创精品| 久久精品国产精品亚洲艾通辽熟妇 | 久热精品在线国产| 欧美老妇综合网| 欧美丰满少妇xx高潮| 亚洲熟妇A V黑人| 亚洲AV无码国产成人| 超碰久在线天天做| 双插性欧美一二三区| 亚洲综合色图欧美| 亚洲AV操| 91操熟女视频 | 九九热九九| 天天综合精品| 精品国产乱码久久| 精品91摸| 国产大陆天天艹| 亚洲情色一区二区三区| 芊芊操逼视频无码| 亚洲在线观看| 性欧美另类高清| 偷拍 欧美 日韩| 91丝袜美腿网站| 波多野结衣先锋影音| 亚洲情色综合网| www.狠狠干.coom| 26uuu成人影片| 啊啊啊啊啊啊啊啊要喷了| 亚洲国产麻豆一区二区三区| 蜜臀网 一区| 久久久久久久久久久久久9999| 色哟哟综合| 国产精品一区在线播放| 亚洲一区二区三区麻豆传媒| 国产亚洲精品玖玖玖在线观看| 熟妇一区,二区,三区。| 丝袜夫妻自拍| 国产成人+综合亚洲+天堂| 亚洲国产精品久久AV| 一区二区三区四区在线不卡| 99热免费| 久久,精品一二三| 久久宗合亚洲| 丝袜美腿制服人妻二区中文字幕| 国产夫妻性生活视频| 亚洲第2页| 欧美亚洲另类在线蜜桃| 五月丁香综合激情| 99热| 射丝袜高跟鞋99| 亚洲日本韩国在线| 亚洲欧洲日韩天堂av| 99精品视频在线观看免费| 欧美97| 国产日韩无码一区二区三区久久区| 欧美日韩不卡a片| 老熟女搡BBBB搡BBBB视频| 五月天人妻综合| 加勒比无码一区二区三区| 亚洲九九九| 青青草国产亚洲精品久久| 日本最新1区2区3区| 麻豆这里只有精品| 久久精品国产亚洲AV高级北京| 夜夜精品视频| 欧洲亚洲天堂精品| 中文字幕在线观看AV| av午夜影院在线播放| 丝袜美腿亚洲| 欧美亚洲特P| 试看福利| 骚货人妻偷情自拍在线视频| 国产亚州精品美女久久久免费| 天天激清| 欧美性高潮| 亚洲国产中文字幕| 色天堂在线观看| 亚洲视频二区 | 96久久久精品| 99日免费视频中文字幕| 日日日大屁股骚女人精品| 综合亚洲情色| 亚洲男人的天堂AV| 青青草五月天| 色悠久久久av| 九99久久| 在线不欧美| 色图综合| 日产操逼| 国产精品免费久久久久久久久久| 91精品人妻一区二区三区蜜桃| 欧美在线电影| 一本色道综合久久欧美日韩精品| 中文字幕一区二区无码成人| 精品免费成人久久| 中文字幕一区二区三区人妻不卡 | 久久一区二区高清免费| 最新av中文字幕高清| 韩国免费播放一级毛片| 亚洲人妻中文在线视频| 大香蕉强奸乱伦| 多乙久久久久久| 一区在线观看中文字幕| 色综合一区二区三巨| 国产不卡精品91| 顶级丝袜熟女一区二区三区| 久久高清欧美国产| 久久做97| 亚洲精品欧洲色| 日韩精品亚洲一二三| 亚洲激情视频| 欧美国产婷婷久久| 婷婷爽人人婷婷爽视频| 大香蕉黄色一区| 天天日日本| 四虎免费在线播放| 激情抓乳插进去啪啪啪日韩| 在线v中文字幕一区二区三区| 久久精彩免费视频| 久久夜夜夜夜| 色97干| 性影在线视频| 蜜臀亚洲中文| 日少妇视频| 亚洲欧洲日韩国产自在线| 成年女人一区| 怡春院久久| 两性色网| 熟女网站最新| 欧美 日韩 亚洲 春色| 男人天堂2019亚洲| 九热久| 日韩一性一交一A片俄罗斯| 亚洲日韩av一区二区三区百合| 欧美综合狠| 亚洲国产奇米影视久久| 亚州中文字幕超碰97| 亚洲一区二区在线观看91| 青青操狠狠撩| 一二区在线观看视频| 黄色AAAAA欧美| 超碰97首页| 91在线一起| 国人欧美精品一区二区| 久久国产乱子伦精品免费女,网站| 日本天天色| 97色欧洲| www.狠狠干.coom| 欧美综合网| 在线视频一区二区传媒| 妇女性内射冈站HDWWWCOM| 97亚洲综合电影| 亚洲一区二区三区不卡国产欧美| 91久久精品国产| 亚洲女毛多水多21P| 国产多人在线观看视频| 91成人精品| 亚洲欧美啪啪| 欧美极品色| 久久6热精品99视频| 91日日| 旡码电影特区| 人妻嗯啊啊在线播放| 日韩黄色一区二区三区| 嫩呦国产一区二区三区AV| 人人操人人干xxx| 老熟妇乱轮| 精品无码久久久久久久久果冻糖心| 日韩精品 欧美激情| 综合网亚洲在线| 欧美午夜熟妇黑人精品91| 亚洲综合色在线| 亚洲日韩狠狠撸视频| 欧洲精品欧洲精品| 中文字幕国产| 欧亚日韩中文在线| 亚洲另类欧美精品| 手机在线视频国内精品| 啪啪啪综合网| 91路www| 欧美成人免费在线观看| 亚洲人天堂| 9I1性色影院| 老熟女中文字幕高清| 日韩紧密久久| 韩日男人的天堂| 中文精品少妇天堂| 97se综合网| 91美女在线观看| 又大又大又大又粗爽高潮观看| 激情文学88| 欧美αv.com| 久久久国产三级黄色片| 久久99国产综合精品女同| 欧美亚洲综合999| 国产91美女视频| 中国少妇XXXX做受| 婷婷丁香五月综合| 久久久九九九九| 亚洲图片第一页| 粉嫩不卡一区二区性爱| 大奶啊啊好爽 | 99精品国产户外露出| 内射小黄片| 国产少妇肉丝在线观看| 九九九九九九九九九五码| 97超碰9| xxx0国产在线播放| 久久久中文版| 思思视频免费看网站| 激情五月综合| 欧美 日韩第一性色| 91在线视频免费播放| 免费超碰97久久| 日韩在线观看三级电影| 无码久久亚洲高清,| 四虎影视永久在线免费| ai欧美亚洲小说| 好舒服视频| 永久免费观看的毛片的网站| 国产白丝在线| 丁香五月综合| 久久东京伊人一本到鬼色| 天天看天天日天天操| 欧美亚洲AN| 久草综合京东| 天天视频网站黄| 日韩欧美字幕亚洲一区二区| 日本黄大片在线观看视频| 亚洲天堂东京热| 美女写真| 午夜男女爽爽爽影院视频| 日本 欧美 国产一区| 欧美激情亚洲| 超碰久久精品| 欧美黑人性猛交91| 男人的天堂欧美| 亚洲97综| 超碰在线免费一区二区三区| 一区二区影视| 有码专区最新中文字幕有码| 国产无码精品无码| 久久久久久久国产| 大香蕉免费3| 丰满少妇一区二区三区免费看| 99色热| 狠狠躁AV| 久久e6只有精品| 久湿久久| 亚洲欧洲视频小说在线观看| 午夜欧美女人操逼| 色哟哟av| 日韩欧无码一区二区三区免费不卡| 夜夜操一区二区| 精人妻无码一区二区三区伊人直播| 国产欧美伊人| 9九九国产| 丁香六月激情综合| 青草综合| 欧美夜夜草视频| 亚洲激情视频| av网站在线观看了| 性色av网站| 男人的天堂2019AV| 久久国产对白激情浪潮| 综合欧美日韩在线| 韩国毛片一区二区三区| 日日嗨AV一区二区夜夜| 超碰超碰95| 免費黃色視頻觀看一| 亚洲国产成人福利在线观看| 免费A片三p视频| 夜色综合| 亚洲人天堂| 综合久久9| 日韩精品-原创伙伴| 九九热精品视频六| 国产成人精品网站| 欧美色图亚洲色| 国产精品久久久久久久久久久久久久吹 | 午夜美女福利视频| 91殴美| 黄片免费日韩| 精品国产91内射久久| av网站在线观看了| 精品一二三区久久AAA片| 亚洲少妇中文字幕网址| 色色色热| 免费看污网站| 日本中文字幕一区| 久久中文字幕在线观看| 99久久99久久免费精品蜜臀| 婷婷色综合欧美日韩| 一级岛国大片| 美女被艹尤物视频| 亚州成人A√| 久久熟女久| 无码人妻一区二区三区四区老鸭窝| 国产9区| 亚洲欧美国产成人综合不卡| 能看的av| 综合天天。| 国产精品久久久 | 校园激情狠狠四射| 亚洲密乳AV| 亚洲欧美在线综合| 九九久久久久久爱| 欧美毛片在线网| av中文在线| 无码逼| 黄片免费日韩| 狠狠 91| 亚洲欧洲激情卡通另类文学四射小说网站 | 91色情黑丝搞鸡在线观看一区二区三区三州| 日韩在线性爱免费视频| 日韩精品亚洲一二三| 用力操死我| 午夜高清成人在线视频| 国产AV久久野战精品| 男人久久天堂| 色男人色天堂东京热| 动漫av中文| 欧美专区第一页| 亚洲无码国产精品久久| 天操天操夜操夜月月年年操操| 激情六月婷婷| 成片免费播放| 九九干| 亚洲九九九九| 91色综合激情| 欧美天天搞| 五月丁香啪| 在线观看综合精品亚洲| 中文字幕精品一区欧美| AV99热18这里只有精品| 另类欧美| 成熟熟女国产精品一区二区| 色狠狠综合| site:sinbotex.com| 91综合在线| 超碰在线91| 色哟哟-国产专区| 成人无码在线视频网站| 97操97干| 999熟女精品| 色综合20p| 欧色性第一页| 伊人网一本| 性爱网站一区二区| 看全色黄大色大片免费视频| 中国一区二区亚洲人妻| 91岛国动作片| 欧美丝袜美女电影一二三四区| 日韩亚洲Av人人夜夜澡人人爽| 天天操人人操狠狠插| 国产精品点击进入在线影院| 天天操人人操狠狠插| 天天弄天天操| 亚洲欧美综合| 日本精品免费一区二区三区四区| 中文乱码字字幕在线第5页| 九九免费影片| www欧美91| 免费看片黄| 国产精品视频自拍在线| 人人干人人搞人人摸| 欧美日韩国产色图在线| 国产精品久久久久久久毛片1| juliaann丝袜| 亚洲91网站| 久久这里只精品| av亚欧| 欧美黑人精品一区二区| 国产路线专区| 91视频在线观看18| 影音综合网| 97精品综合久久| 亚洲国产无码精品首页久久久| 亚洲日本激情| 无码高清少妇久久| 国产精品成久久久久午夜午夜| 久久三区四区| 欧美综合网在线| 九九久久玖玖| 国产精品人妻无码久久久老鸭窝| 国产精品夜夜| 欧美一区二区男人天堂| 自拍偷拍第26| 又粗又长又爽在线观看| 91精品微拍福利| 一类av片在线看| 家庭乱伦国产| 无码精品人妻一区二区三区妖精 | 97人人干人人操| 国产无码一二三区| 九九av| 99热精品在线| 亚洲欧美另类少妇精品| 欧美91丝袜| 欧美色干| 亚洲日韩美国人妻| 人妻少妇久久久| 一区二区不卡| 国产精品久久久午夜夜伦鲁鲁| 中日韩久久久免费看| 亚洲欧美综合| 日本色色的视频| 日本一区二区三区精品| 亚洲激情欧美色图| 国产欧美日本亚洲精品| 午夜欧美女人操逼| 超碰97网址| 99精品九九九九九九| 不卡中文字幕aⅴ在线| 久久欧美性爱视频| 东京热av男人的天堂| 亚洲双插| 久久久久亚洲Aⅴ无码| 欲色影视综合吧| 一本久道久久综合狠狠爱一密臀精| 亚洲老熟妇xxx| 51国产午夜精品视频| 日产精品久久久一区二区| 欧美性Fer办公室秘书| 91男人综合| 97超级久久| 97亚洲自在精品在线观看| 五月天综合| 一类av片在线看| 亚洲熟女一区二区| 欧美91网站| 人妻一区二区三区| 色综合久久av| AV色天香在线| 高潮毛片无遮挡高清免费| 粉嫩少妇自慰在线| 欧美激情 日韩精品| 久久久久久亚洲精品中文字幕人妻| 视频黄色国产一级| 日本人妻中文字幕| 人妻第一页| 夜夜操一区二区| 91激情网| 丝袜高跟澳门91视频| 91亚洲黑人| 婷婷丁香五月激情啪啪| av绯色| 97人人爱人人乐| 久久一二三四不卡 | 大香蕉国产中文自拍| 热热色91| 国产99 中文字幕日韩小视频| 国产亚洲精品美女| 午夜天堂精品久久久久91| 日韩中文字幕视频在线观看| 丝袜AV一二三区| 五月激情在线| 久操视频免费观看| 精品无码少妇| 啪啪综合网| 中文字幕,人妻,日韩| 69XX一中文字幕人妻91| 国产精品999aaa| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 99免费在线视频| 久久久久久久性爱| 亚州综合图片| 精品视频日日夜夜| 97香蕉碰碰人妻国产欧美| 亚洲 欧美 日韩 国产一区二区 | 国产农村妇女精品一| 九九色影院| 国产操偷| 国产精品久久久久无码A√| 久久精品操| 亚洲色图综合网| 国产一级久久久| 久久精品人体| 婷婷尹人大香蕉免费| 黄色性爱网网| 隔壁邻居波多野结衣中文字幕 | 91粉芽高清在线一区二区| 蜜乳AV一区| 久久国产乱子伦精品免费女人| 大色综合| 视频一区二区三区精品| 亚洲加勒比| 曰韩人妻中文字幕在线| 天天噜| 91国模| 久久久久久久9| 97资源久久| 久久只有精品| 18禁无码永久免费无限制| 波多野结衣之双飞调教在线播放| 国产中出内射一区二区| 一本色道无码DVD中文字幕| 激情黄色片在线观看| 成 人 A V免费视频在线观看| 玖玖爱在线视频免费观看| 成人自拍三级在线观看| 亚洲AV无码翔田千里网站| 亚洲av淫乱| 五月天婷婷基地| n1038 一二三区| 亚洲熟女乱熟乱熟妇综合网二区| 精品国产乱码久久久兰草影视| 玖玖超碰熟| 欧美激情区| 在线无码网站| 婷婷久久五月天| 天天综合欧美综合| 中文字幕一区av| 久久中日麻豆| 人人扣人人操| 精品无码不卡视频| 亚洲国产97| 九一综合网| 欧洲亚洲人妻无码中字久久三区四区| 自拍偷拍草一草| 色性荡荡荡荡视频| 久久久久久久国产视频| 屁股久久久久久久久| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 黄片www视频免费| 9Ⅰ老熟女| 91亚州欧美| 久久久久久裸体| 综合欧美日本三级| 久久久久13| 亚洲男人天堂Av| 日韩视频啪啪| 色99999| 久久精品国产亚洲AV清纯| 日本不卡三级网在线播放| 久久草在线综合视频| 欧美 亚洲 综合 制服| 日本天天人人狠狠在线日美女| 北约熟女超碰| 免费观看啪视频| 精品日韩中文在线| 人人干人人操人人..com| 中国大陆国产高清AⅤ毛片| 欧美97色| 乱伦熟女论坛| 色视频蜜乳| 国产激情视频一区区三区| 国产精品青草综合久久| 日本精品无码三级网站| 日本淫乱女一区二区三区视频| 超碰97最新人妻| 97久久资源| 911粉嫩人妻| 欧洲与亚洲欧美精品中文字幕| 东京热一区二区中文字幕| 台欧久久精品视频| 在线有码中文字幕| 久久精品人妻一区二区三区| 五月丁香激情综合网| 青青色在线观看| 激情四射五月天| 日韩婷婷| 日韩乱伦AⅤ| 久久有码视频| 色五月天AV| 久久九九网| 伊人精品久久网站| 日韩精品人妻中文字幕不卡乱码| 激情综合五月| 国产精品久久99日日| 96精品久久| 偷拍五区| 97色欧州| 久久精品亚洲婷婷| 色狠狠综合| 国语av最新自产拍在线观看| 亚洲天堂男人天堂网| 日本黄色天堂| 国产精品。| 91爽啪| 久久精品99| 欧美强奸乱能| 秋霞网—男女啪啪亚洲免费体验区 | 国产精品亚洲一区二区三区四区| 七月婷婷综合| 日夜伊人网| 四方色播| 91女日逼| 欧美性夜| 好爽视频在线观看视频 | 狠狠综合| 色色99| 天天综合,91综合永久| 国产呦精品一区二区三区下载| 噜噜噜在线视频| 福利视频一区二区微拍| 成 人片 黄色大片| 天天干人人干天天日97| 蜜乳AV一区| 亚洲人妻中文高清| 欧美日韩第一页| 久久精品性| 亚洲熟妇极品| 91美女视频在线| 亚洲国内精品成人不卡| 超碰97首页| 久区视频| 成人精品无码| 高清无码在线播放网站| 91网站视频在线观看| 操淫穴亚洲五月丁香| 日本亚洲熟女视频| 亚洲欧美电影| 日本精品一区二区三| 99久久综合网| 女人与公拘交酡2020视频| 97视频www| 激情 欧美 亚洲 小说| 一区二区三区精品黑丝白丝酒店对鸡 | 蜜乳av首页| 天天干一区二区| 超碰在线欧美性爱激情| 色综合91| 性色avv| 中文字幕在线观看AV| 日本在线伊人啪啪| 啊啊啊免费视频| 欧美少妇熟女| 韩美日操逼| 国产2.3.4区| 欧美天天综合站| 九色 人妻 大香蕉| 加勒比海色香蕉婷婷| 二三四区精品| 嗯嗯啊在线视频| 欧美少妇大量自拍视频在线观看| 精品一二三区四视频| 美女黄网| 国产97色在线| 91成人高清在线观看| 特级特黄一级毛片免费| 亚洲综合另类小说色区亚洲成av人片在www| 中文字幕青青草| 亚洲欧美天| 热的中文 热的有码 热的国产| 亚洲一本色码中文字幕| 无码视频一区二区| 欧美 日韩 国产传媒| 青青草福利视频| 激情深爱五月天| 久久久久久久唑| 丝袜熟女2P| 内射夫妻三片| 女生自91网站| 亚洲成人久久一区二区| 久久精品99久久久久久| www黄片免费看com| 欧美色九九| 国内精品999| 午夜亚洲国产理论秋霞| 插入粉嫩少妇视频| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 久夜操| 99热这里是精品| 青娱乐休闲视频在线观看| 91丝袜美腿网站| 日本视频在线观看污污污| 99久在线精品99re8| 91亚洲黑人| 亚洲高清无毛一区二区| 中文字幕av一区二区三区人妻少妇 | 色网在线视频观看免费| 国产久9| 日韩精品熟妇| www.色婷婷色综合| 懂色中文一区二区三区| 亚洲色婷婷综合久久一区二区三区| 九九精品美女高溯喷水 | 欧美一区二区三区成人性生活| 婷婷大香蕉| 嗯啊抽插大香蕉网页| 亚洲综合第一页| 密臀国产在线| 999综合色| 北京专精特新企业招聘信息| 黄色性爱网网| 亚洲国产一区二区入口| J?P?NESEHD熟女熟妇伦| 欧美色乱| 精品人妻一区二区三区四区| 亚洲情色一区二区三区| 中文字幕久久精视频久久大全| 婷婷五月色| 亚洲成人免费电影| 99熟女| 久久久国产三级黄色片| 久久一区二区三区入口| 免费中文在线| 在线人人人人人人精品超| xxxx网站亚洲精品| 中文字幕精品一区二区精| 69XX一中文字幕人妻91| 在线视频97| 激情五月天中文字幕色| 国产强奸无码乱伦| 欧美五十路熟| 亚洲男人bt天堂| 98精品国产乱码久久久久久| 欧美激情视频在线一区| 日韩一级二级在线| 日韩精品.久久精品.AV女优.天美传媒| 中文字幕一区二区三区50路| 校园春色综合| 日韩极品无码B| 国产亚洲 中文欧美久久| 日韩精品一区二区三区四虎影视| 国产人妻精品久久久一区二区三区 | 亚洲精品1区| 亚洲人妻五月丁香婷婷| 美女被艹尤物视频| 久九九九九九九九热| 色欲日韩欧美在线一区| 操逼日韩无码 | 亚洲日韩在线a不卡99精品 | 亚洲男人bt天堂| 亚洲天堂AV在线播放| 97这里有精品| 五月丁香六月激情| 农村女一级毛卡片| 97精品熟女少妇一区| 探花激情视频| 伊人国产视频| 97精品免费视频网站| 中文字幕123| 91在线美女| 中日韓欧美高清| 操逼逼福利视频| 欧美激情 日韩精品| 东北老熟女| 国产成人bd在线观看| 国产精品亚洲四五区在线观看| 大香蕉懂9| 日本网色| 久久久精品视频欧州站| 日韩欧美tv一区二区在线观看| 91黑丝少妇| 日韩欧美加勒比| 99色色网| 天美传媒婬乱在| 亚洲色吧网| 97在线免费看视频| 激情六月天| 91爱| 岛国AV一区二区电影| 九九热三级片| 91亚洲精品青草| 国产强奸无码乱伦| 色呦呦、国产精品| 成人一二| 久久人妻少妇| 日本岛国黄色网址| 超碰碰97资源站| 色91综合网| 偷拍自拍在线视频观看| 骚日日av| 丝袜制服字幕在线| 日本视频在线观看污污污| 久久久少妇诱惑精品视频| 99操| 人人操人人操人人人操| 青草影院内射高潮| 亚洲天堂久久| 天天干天天舔| 超碰在线日韩一区| 亚洲精品一二三四区| 国产av波波国产精品| 青青青青青手机视频| 天天α片| 色色色网站| 草草网站影院白丝内射| 91人人操| 肉丝无码中文高清| 18一区二区三区| 色婷婷成人| 天天视频黄网站| 人人操人人色人人摸| 99热在线只有精品| 日韩亚洲97| 日韩中文字幕av在线播放| 亚洲欧洲综合视频在线| 手机在线A片| 26uuu最新| 欧美日韩国产成人高清| 大逼色网站| 亚洲脚交| 亚洲极品| 劲爆欧美人妖三区91| 国产美女精品| 亚洲天堂日本| 亚洲资源网| 任你干在线视频| 加勒比海成人视频网| 日日夜夜国产综合| 91丝袜激情在线| 亚州色国| 人妻熟女一区二区三区视频| 欧美激情在线观看视频| 大香蕉一级黄色片久久| 国产精品久久久久久片| 亚洲揄拍网| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 疯操AV| 欧美色图91p| 熟妇国产免费一区| 蜜臀99久久国产| 啊啊啊网站| 欧美超碰97| 国产视频一区二区三区在线免费观看| 伊人久久88国产女| 一区三区啪啪| 久久久999网站| 熟女久久| 亚洲超碰在线| 嗯嗯啊啊啊啊轻点视频| 婷婷丁香六月天| 久久亚洲AV无码专区国产精品| 蜜臀久久99精品久久久久久无删减 | 成人a级高清视频在线观看| 看日韩黄片| 99久久精品无码一区二区毛片免费| 两女互慰AV高潮喷水在线观看| α√在线| 人妻激情另类| 超碰天天操| 一级AAA片一区二区三区| 激情黄色五月天| 99热9| 亚洲欧洲精品视频发布| 久久久久国产精品喷潮免费观看臀 | 国产精品懂色tv影视免费观看| 日韩三A大片在线观看| 日韩性爱网址| 久九干| AV天黑人| 日韩综合97P| 我要看免费韩日黄片| 中文字幕精品丝袜| 欧美亚洲清纯| 国产无码三级视频在线观看| hd成人一区二区在线| 成 人 影视 一区 二区 三区 四区 | 欧美亚洲综合色| 射丝袜大香蕉| 69XX一中文字幕人妻91| 中日高清无码操逼视频| 97精品国产手机| 啪啪综合网| 丁香五月天堂网| 久久亚码| 亚洲āv网址在线观看| 免费观看啪视频| 九七毛片九九毛片| 边做饭边操逼逼| 啊啊啊不要好疼视频| 99re6在线视频精品免费完整版安卓版| 欧美成人一级麻豆| 五月色综合| 久久风骚城市| 91强热人妻| 欧美 亚洲 91| 日韩性爱视频在线免费观看| 啊啊啊啊啊啊啊国| 久久综合97| 无套内射性感少妇视频| 骚人妻少妇视频| 国产精品人妻熟女aⅴ| 粘花网06av视频| 999久久久| 蜜桃久久综合视频| 久久女人| 日韩啪啪啪啪啪| 日韩精品 欧美激情| 国产又色又爽又舒服的三级视频| 97视频在线免费播放| 欧美日产国产在线成人第一区| 欧美亚男人的天堂| 日韩在线国产字幕| 亚洲性综合9| 亚洲欧洲激情卡通另类文学四射小说网站 | 青女偷拍网| 无套内射性感少妇视频| 欧美色图片欧美色图| 欧美日本一区二区a人| 亚洲性少妇| 99久久精品无码一区二区| 亚州日韩97| 国产91精品福利在线| 97就爱干| 日韩性爱网址| 久久在肏| 99久久com免费视频′| 大香蕉伊人网| 欧美日本久久精品一区| 综合影院永久入口国产| 操香逼| 久久久久久亚洲中文| 伦理弟一页| 5月婷婷6月六月丁香| 五月天AV资源| 91精品综合久久久久久五月丁香| 男同专区一区二区三区在线| 东京热男人的天堂网| 国内毛片欧美香蕉精品| 神马午夜久久久| 亚洲最新中文字幕免费| 欧美综合自拍亚洲综合图| 久久婷婷伊人| 91 欧美| 国产丰满少妇久久久精品影院| 在线免费观看日韩一区| 男人天堂免费| 六月色婷婷| 亚洲av国产av综合av卡| 超碰午夜| 狠狠操狠狠| 人人人摸人人| 91美女国产在线| 日本高清电影欧美色图| 成人五级久久| 97欧美色综合| 久久久久13| 成人七区| 亚欧成人一级片在线播放| 色情亚洲日本成人| 91精品丝袜在线观看| 婷婷超| 色综合1991| 婷婷综合在线观看| 欧美极度丰满熟妇hd| 久久久精品网站| 国产精品九九| juliaann精品熟女一区| 最新日产中文在线麻豆| 日韩无限资源| 天天天操天天天爱| 91老司机在线视频免费观看| 亚洲αv一区二区三区| 好爽免费视频| 亚洲图片在线| 亚洲熟妇乱女区二区三区| 另类 日韩 熟女| av影片在线观看不卡| 久久机热| 国产美女精品| 超碰79人人乐| 视频分类 国内精品| 欧美性爱综合,免费| 欧美—性—交—色| 亚洲一区亚洲天堂| 校园春色亚洲欧洲| 婷婷六月色| 思思在线免费视频| 欧美探花网| 起碰97| 三四中文字幕| AV在线播放网址| 中文字幕精品乱码| 亚洲AV乱码专区国产噜噜亚洲| 国产无马av| 黄片无码在线制服| 亚洲h片在线免费观看| 欧美一区二区三区不卡高清视频| 欧美日韩人妻精品一区二区三区| 日本东京热大香蕉a片| 久久久久久久 九九九九九九九| 强免费黄色网址| 盗摄女人妻在线| 大香蕉黄色一级片免费看| 91处女在线观看| 亚洲色电影在线| 精品人妻一区二区三区四区| 加勒比综合a∨| 青青草字幕AV| 久久日本熟女精品一区| 99啪啪| 99操| 台湾大香蕉99热| 国产精品2020| av在线人气| 欧美最婬乱婬爆婬性视频 | 18禁超污无遮挡无码免费网| 天天草夜夜草高潮片| 涩综合导航| 精品日韩人妻视频| 亚洲码在线中文在线观看| 亚洲色综合| 人人搞人人插人人操| 日韩成年人性爱视频| 女人天堂av在线播放| 色香AV| 国产精品爆乳懂色蜜乳| 亚洲欧美色图| 日韩av在线精品观看| 欧美AAAA黄片| 免费看黄片现成| 熟妇的味道HD中文字幕| 岛国视频一二三区| 少妇xx精品| 1769精品一区二区三区| 特级毛片特黄久久免费看| 9热9热综合网| 色情亚洲日本成人| 青青草成人视频在线观看二区| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 |