日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python项目实战-----科比数据集分析

發(fā)布時間:2023/12/10 python 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python项目实战-----科比数据集分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一 案例分析

  • 在給定科比職業(yè)生涯的相關(guān)數(shù)據(jù),比如投籃命中率、投籃出手次數(shù)等特征進行分析,投出一球是否命中。本質(zhì)上也為二分類問題,此次選用隨機森林作為模型訓(xùn)練算法。

數(shù)據(jù)集及完整代碼地址https://github.com/RenDong3/Python_Note

二 特征工程

1 讀取數(shù)據(jù)

  • 1.1基本屬性 如head()、tail()、shape、columns
  • 1.2特征聯(lián)系
  • loc_x、lox_y表示球場的經(jīng)緯度 可以理解為位置,所以選用散點圖可以看出整體表現(xiàn)為球場形狀

2 特征工程

2.1 去除無效特征
  • 一般對于ID、time等這些無關(guān)緊要的特征可以直接丟棄
  • axis的重點在于方向,而不是行和列
    • 當(dāng)axis=1時,數(shù)組的變化是橫向的,而體現(xiàn)出來的是列的增加或者減少
    • 如果是拼接,那么也是左右橫向拼接;如果是drop,那么也是橫向發(fā)生變化,體現(xiàn)為列的減少。
2.2 缺失值處理
  • 丟棄dropna()
    • 對于缺失數(shù)據(jù)較多的特征可以選擇直接丟棄特征,缺失數(shù)據(jù)較少的特征可以只丟棄缺失值
  • 填充fillna()
    • 一般選擇特征的未缺失值的均值進行缺失值的填充
2.3 特征組合
  • 如這里可以將小時和分鐘進行結(jié)合作為新的特征
2.4 相似特征保一
  • 繪制散點圖描述特征相關(guān)性,相關(guān)程度較高的特征保留一個即可
  • 如本例中dist特征和shot_distance特征具有很高的正相關(guān),屬于相似特征
2.5 特征類型轉(zhuǎn)換
  • 字符型轉(zhuǎn)為數(shù)值型
  • one-hot編碼
    • 一個長度為n的數(shù)組,只有一個元素是1.0,其他元素是0.0。
  • 自定義字典調(diào)用replace
  • 去除特定字符
    • 如’ % ‘、’ - '等特殊連接符號

三 模型訓(xùn)練

1 隨機森林

1.1 原理
  • 隨機森林由Leo Breiman(2001)提出的一種分類算法,它通過自助法(bootstrap)重采樣技術(shù),從原始訓(xùn)練樣本集N中有放回地重復(fù)隨機抽取n個樣本生成新的訓(xùn)練樣本集合訓(xùn)練決策樹,然后按以上步驟生成m棵決策樹組成隨機森林,新數(shù)據(jù)的分類結(jié)果按分類樹投票多少形成的分數(shù)而定。其實質(zhì)是對決策樹算法的一種改進,將多個決策樹合并在一起,每棵樹的建立依賴于獨立抽取的樣本。
  • 單棵樹的分類能力可能很小,但在隨機產(chǎn)生大量的決策樹后,一個測試樣本可以通過每一棵樹的分類結(jié)果經(jīng)統(tǒng)計后選擇最可能的分類。
1.2 流程
  • 從樣本集中有放回隨機采樣選出n個樣本
  • 從所有特征中隨機選擇k個特征,對選出的樣本利用這些特征建立決策樹(一般是CART,也可是別的或混合)
  • 重復(fù)以上兩步m次,即生成m棵決策樹,形成隨機森林
  • 對于新數(shù)據(jù),經(jīng)過每棵樹決策,最后投票確認分到哪一類
1.3 優(yōu)點
  • 每棵樹都選擇部分樣本及部分特征,一定程度避免過擬合
  • 每棵樹隨機選擇樣本并隨機選擇特征,使得具有很好的抗噪能力,性能穩(wěn)定
  • 能處理很高維度的數(shù)據(jù),并且不用做特征選擇
  • 適合并行計算
  • 實現(xiàn)比較簡單
1.4 缺點
  • 參數(shù)較復(fù)雜
  • 模型訓(xùn)練和預(yù)測都比較慢

2 參數(shù)調(diào)優(yōu)

2.1 參數(shù)詳解

對于隨機森林存在很多參數(shù),但是用的比較多的一般為下面幾個:

  • n_estimators:
    • 在利用最大投票數(shù)或平均值來預(yù)測之前,你想要建立子樹的數(shù)量。 較多的子樹可以讓模型有更好的性能,但同時讓你的代碼變慢。 你應(yīng)該選擇盡可能高的值,只要你的處理器能夠承受的住,因為這使你的預(yù)測更好更穩(wěn)定。
  • max_depth:
    • 決策樹最大深度,默認可以不輸入,如果不輸入的話,決策樹在建立子樹的時候不會限制子樹的深度。
    • 一般來說,數(shù)據(jù)少或者特征少的時候可以不管這個值。如果模型樣本量多,特征也多的情況下,推薦限制這個最大深度,具體的取值取決于數(shù)據(jù)的分布。
    • 常用的可以取值10-100之間。
  • min_samples_leaf:
    • 葉子節(jié)點最少樣本數(shù),這個值限制了葉子節(jié)點最少的樣本數(shù),如果某葉子節(jié)點數(shù)目小于樣本數(shù),則會和兄弟節(jié)點一起被剪枝。
    • 默認是1,可以輸入最少的樣本數(shù)的整數(shù),或者最少樣本數(shù)占樣本總數(shù)的百分比。如果樣本量不大,不需要管這個值。如果樣本量數(shù)量級非常大,則推薦增大這個值。
  • min_samples_split:
    • 內(nèi)部節(jié)點再劃分所需最小樣本數(shù), 這個值限制了子樹繼續(xù)劃分的條件,如果某節(jié)點的樣本數(shù)少于min_samples_split,則不會繼續(xù)再嘗試選擇最優(yōu)特征來進行劃分。
    • 默認是2.如果樣本量不大,不需要管這個值。如果樣本量數(shù)量級非常大,則推薦增大這個值。
代碼演示
# find the best n_estimators for RandomForestClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.cross_validation import KFoldprint('Finding best n_estimators for RandomForestClassifier...') min_score = 100000 best_n = 0 scores_n = [] range_n = np.logspace(0,2,num=3).astype(int) for n in range_n:print("the number of trees : {0}".format(n))t1 = time.time()rfc_score = 0.rfc = RandomForestClassifier(n_estimators=n)for train_k, test_k in KFold(len(train_kobe), n_folds=10, shuffle=True):rfc.fit(train_kobe.iloc[train_k], train_label.iloc[train_k])#rfc_score += rfc.score(train.iloc[test_k], train_y.iloc[test_k])/10pred = rfc.predict(train_kobe.iloc[test_k])rfc_score += log_loss(train_label.iloc[test_k], pred) / 10scores_n.append(rfc_score)if rfc_score < min_score:min_score = rfc_scorebest_n = nt2 = time.time()print('Done processing {0} trees ({1:.3f}sec)'.format(n, t2-t1)) print(best_n, min_score)# find best max_depth for RandomForestClassifier print('Finding best max_depth for RandomForestClassifier...') min_score = 100000 best_m = 0 scores_m = [] range_m = np.logspace(0,2,num=3).astype(int) for m in range_m:print("the max depth : {0}".format(m))t1 = time.time()rfc_score = 0.rfc = RandomForestClassifier(max_depth=m, n_estimators=best_n)for train_k, test_k in KFold(len(train_kobe), n_folds=10, shuffle=True):rfc.fit(train_kobe.iloc[train_k], train_label.iloc[train_k])#rfc_score += rfc.score(train.iloc[test_k], train_y.iloc[test_k])/10pred = rfc.predict(train_kobe.iloc[test_k])rfc_score += log_loss(train_label.iloc[test_k], pred) / 10scores_m.append(rfc_score)if rfc_score < min_score:min_score = rfc_scorebest_m = mt2 = time.time()print('Done processing {0} trees ({1:.3f}sec)'.format(m, t2-t1)) print(best_m, min_score)

結(jié)果:

四 總結(jié)

Reference

隨機森林(原理/樣例實現(xiàn)/參數(shù)調(diào)優(yōu))

總結(jié)

以上是生活随笔為你收集整理的Python项目实战-----科比数据集分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。