分類算法:對目標值進行分類的算法
1、sklearn轉換器(特征工程)和預估器(機器學習)
2、KNN算法(根據鄰居確定類別 + 歐氏距離 + k的確定),時間復雜度高,適合小數據
3、模型選擇與調優
4、朴素貝葉斯算法(假定特征互獨立 + 貝葉斯公式(概率計算) + 拉普拉斯平滑系數),假定獨立,對缺失數據不敏感,用於文本分類
5、決策樹(找到最高效的決策順序--信息增益(關鍵特征=信息熵-條件熵) + 可以可視化)
6、隨機森林(bootstarp(又放回的抽取) + 特征隨機(抽取小特征) + 多個決策樹)
sklearn轉換器(transfer)與估計器(estimeter)簡介
1、轉換器 - 特征工程的父類
轉換器 - 特征工程的父類
1、API的實現過程:
1 實例化 (實例化的是一個轉換器類(Transformer))
2 調用fit_transform(對於文檔建立分類詞頻矩陣,不能同時調用)
2、sklearn的標准化:
計算公式:(x - mean) / std
x: 數據
mean: 該列的平均值
std: 標准差
我們調用fit_transform()實際上發生了2個步驟:
fit() 計算 每一列的平均值、標准差
transform() (x - mean) / std進行最終的轉換
# 轉換器的實例講解
import sklearn
# 特征預處理
from sklearn.preprocessing import StandardScaler
def stand_demo():
data = [[1, 2, 3], [4, 5, 6]]
# 1、實例化一個類
std = StandardScaler()
# 2、調用fit_transform()
new_data = std.fit_transform(data)
'''
fit = std.fit(data): # 已經完成了列的平均值和標准差的計算
StandardScaler(copy=True, with_mean=True, with_std=True)
std = std.transform(data): # 根據公式(x - mean) / std進行最終的轉換
[[-1. -1. -1.]
[ 1. 1. 1.]]
new_data = std.fit_transform(data):
[[-1. -1. -1.]
[ 1. 1. 1.]]
'''
print(new_data)
if __name__ == '__main__':
stand_demo()
2、估計器--sklearn機器學習算法的實現
基於估計器的算法API
估計器的工作流程:
估計器(estimator)
1 實例化一個estimator
2 estimator.fit(x_train, y_train) --> 用於計算x_train: 訓練集的特征值, y_train: 訓練集的目標值
—— 調用完畢,模型生成
3 模型評估(有2種方法實現):
1)直接比對真實值和預測值
y_predict = estimator.predict(x_test) # x_test: 測試集的特征值, y_predict: 測試集的預測值y_test == y_predict # 對比測試集的預測值(y_predict)與測試集的目標值(y_test)是否一致
2)計算准確率
accuracy = estimator.score(x_test, y_test) # 傳遞測試集特征值和測試集目標值進行准確率計算
KNN算法(K-近鄰算法)
KNN的核心算法: 通過計算A到鄰居(B、C、D、E、F)的距離可以判斷A屬於哪個類別(區域)。K就是相似特征
距離計算公式:
0、歐式距離
1、曼哈頓距離 (絕對值距離)
2、明可夫斯基距離(基於0和1實現)
K-近鄰算法對目標數據的處理:
無量綱化的處理,即【標准化】(歸一化會受到異常數據影響)
如果取的最近的電影數量不一樣?會是什么結果?
k 值取得過小(即1個樣本點),容易受到異常點的影響
k 值取得過大(即取出多樣本),樣本不均衡的影響
K-近鄰算法API
KNN算法案例1:鳶尾花種類預測
案例分析:
1. 獲取數據(sklearn自帶的數據即可)
2. 數據處理(可省略,數據已經處理的很好了,目的是取出不完整的數據)
3. 特征工程
1. 數據集的划分(訓練數據 + 測試數據)
2. 特征抽取(可省略,4個特征)
3. 特征預處理(標准化) --》 訓練數據和測試數據都需要
4. 降維(可省略,降維的目的是減少特征,這里就4個特征)
4. KNN預估計流程
5. 模型評估
基於KNN實現鳶尾花的分類完整Demo:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def knn_demo():
'''
基於KNN實現鳶尾花的分類
:return:
'''
# 1、獲取數據
iris = load_iris()
print('iris', iris.data.shape)
# 2、數據划分
# 結果跟隨機數種子random_state有關
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
# 3、特征工程: 標准化
stand_transfer = StandardScaler()
'''
原則: 訓練集的數據做的操作,測試集也是需要做同樣的操作
實現:
訓練集:
stand_transfer對訓練集進行了fit()和transfer(),即fit用於計算平均值和標准差,tranfer用於公式計算
測試集:
stand_transfer對訓練集進行了transfer(),即用訓練集求出來的平均值和標准差進行最后的公式計算(標准化)
如果對測試集用了fit_tranform(),即對測試集測試的僅僅是自己的數據內容,與訓練內容無關
'''
x_train = stand_transfer.fit_transform(x_train) # 要對訓練標准化
print('x_train', x_train.shape)
x_test = stand_transfer.transform(x_test) # 用訓練集的平均值和標准差對測試集進行標准化
print('x_test', x_test.shape)
# 4、KNN算法評估器
knn_estimater = KNeighborsClassifier(n_neighbors=3) # 鄰居數量,默認是5
knn_estimater.fit(x_train, y_train) # 訓練完成,產生模型;x_train: 訓練集的特征值, y_train: 訓練集的目標值
# 5、模型評估
# 方法1;直接對比真實值和預測值
y_predict = knn_estimater.predict(x_test)
print('y_predict', y_predict)
print('真實值和預測值:', y_predict == y_test)
# 方法2:計算准確率
score = knn_estimater.score(x_test, y_test) # 傳遞測試集特征值和測試集目標值進行准確率計算
print('准確率:',score)
return None
if __name__ == '__main__':
knn_demo()
KNN算法總結
附: 我們可以利用【模型與調優】進行K的確定
模型選擇與調優
模型選擇與調優的方案:
1、交叉驗證(Cross Validate)
2、超參數搜索 –> 網格搜索(Grid Search)
方案一:交叉驗證(cross validate, 即有限數據多次驗證,被評估的模型更加可信)
方案二:超參數搜索--網格搜索(Grid Search)
模型選擇與調優API
說明:GridSearchCV實際上也是一個評估器,用法與上面相同
基於KNN實現鳶尾花的分類,添加網格搜索和交叉驗證,用於確定最優的K值完整Demo:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def knn_gridSearch_demo():
'''
基於KNN實現鳶尾花的分類,添加網格搜索和交叉驗證,用於確定最優的K值
:return:
'''
# 1、獲取數據
iris = load_iris()
print('iris', iris.data.shape)
# 2、數據划分
# 結果跟隨機數種子random_state有關
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=3)
# 3、特征工程: 標准化
stand_transfer = StandardScaler()
'''
原則: 訓練集的數據做的操作,測試集也是需要做同樣的操作
實現:
訓練集:
stand_transfer對訓練集進行了fit()和transfer(),即fit用於計算平均值和標准差,tranfer用於公式計算
測試集:
stand_transfer對訓練集進行了transfer(),即用訓練集求出來的平均值和標准差進行最后的公式計算(標准化)
如果對測試集用了fit_tranform(),即對測試集測試的僅僅是自己的數據內容,與訓練內容無關
'''
x_train = stand_transfer.fit_transform(x_train) # 要對訓練標准化
print('x_train', x_train.shape)
x_test = stand_transfer.transform(x_test) # 用訓練集的平均值和標准差對測試集進行標准化
print('x_test', x_test.shape)
# 4、KNN算法評估器
knn_estimater = KNeighborsClassifier()
# 5、加入網格搜索與交叉驗證
param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]} # 這里只能是字典
'''
estimator : estimator object.
param_grid : dict or list of dictionaries
'''
knn_estimater = GridSearchCV(estimator=knn_estimater, param_grid=param_dict, cv=10)
knn_estimater.fit(x_train, y_train) # 訓練完成,產生模型;x_train: 訓練集的特征值, y_train: 訓練集的目標值
# 6、模型評估
# 方法1;直接對比真實值和預測值
y_predict = knn_estimater.predict(x_test)
print('y_predict', y_predict)
print('真實值和預測值:', y_predict == y_test)
# 方法2:計算准確率
score = knn_estimater.score(x_test, y_test) # 傳遞測試集特征值和測試集目標值進行准確率計算
print('准確率:', score)
# 最佳參數:best_params
print("最佳參數:\n", knn_estimater.best_params_)
# 最佳結果:best_score_
print("最佳結果:\n", knn_estimater.best_score_)
# 最佳估計器:best_estimator_
print("最佳估計器:\n", knn_estimater.best_estimator_)
# 交叉驗證結果:cv_results_
print("交叉驗證結果:\n", knn_estimater.cv_results_)
return None
if __name__ == '__main__':
knn_gridSearch_demo()
拓展:
Facebook的預測簽到位置案例:
Facebook的預測簽Demo
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def facebook_demo():
# 1、獲取數據
data = pd.read_csv("F:\instacart\\train.csv")
# 2、基本的數據處理
# 1)縮小數據范圍
data = data.query("x < 3 & x > 2 & y < 3 & y > 2")
# 2)處理時間特征
time_value = pd.to_datetime(data["time"], unit="s")
date = pd.DatetimeIndex(time_value)
data["day"] = date.day
data["weekday"] = date.weekday
data["hour"] = date.hour
# 3)過濾簽到次數少的地點
place_count = data.groupby("place_id").count()["row_id"] # 僅僅顯示place_id的簽到次數和row_id信息
# data_final --> pandas.core.frame.DataFrame類型
data_final = data[data["place_id"].isin(place_count[place_count > 3].index.values)] # 過濾出來次數大於3的數據
# 4)篩選特征值和目標值
x = data_final[["x", "y", "accuracy", "day", "weekday", "hour"]]
y = data_final["place_id"]
# 5)數據集划分
x_train, x_test, y_train, y_test = train_test_split(x, y) # 傳入特征值和目標值
# 3、特征工程:標准化
stand_transfer = StandardScaler()
x_train = stand_transfer.fit_transform(x_train) # 要對訓練標准化
print('x_train', x_train.shape)
x_test = stand_transfer.transform(x_test) # 用訓練集的平均值和標准差對測試集進行標准化
print('x_test', x_test.shape)
# 4、KNN算法評估器
knn_estimater = KNeighborsClassifier()
# 5、加入網格搜索與交叉驗證
param_dict = {"n_neighbors": [1, 3, 5]} # 這里只能是字典
'''
estimator : estimator object.
param_grid : dict or list of dictionaries
'''
knn_estimater = GridSearchCV(estimator=knn_estimater, param_grid=param_dict, cv=5)
knn_estimater.fit(x_train, y_train) # 訓練完成,產生模型;x_train: 訓練集的特征值, y_train: 訓練集的目標值
# 6、模型評估
# 方法1;直接對比真實值和預測值
y_predict = knn_estimater.predict(x_test)
print('y_predict', y_predict)
print('真實值和預測值:', y_predict == y_test)
# 方法2:計算准確率
score = knn_estimater.score(x_test, y_test) # 傳遞測試集特征值和測試集目標值進行准確率計算
print('准確率:', score)
# 最佳參數:best_params
print("最佳參數:\n", knn_estimater.best_params_)
# 最佳結果:best_score_
print("最佳結果:\n", knn_estimater.best_score_)
# 最佳估計器:best_estimator_
print("最佳估計器:\n", knn_estimater.best_estimator_)
# 交叉驗證結果:cv_results_
print("交叉驗證結果:\n", knn_estimater.cv_results_)
return None
if __name__ == '__main__':
facebook_demo()
朴素貝葉斯算法
概率(Probability):
聯合概率、條件概率與相互獨立
聯合概率:包含多個條件,且所有條件同時成立的概率
條件概率:就是事件A在另外一個事件B已經發生條件下的發生概率
相互獨立: P(A, B) = P(A)P(B) <=> 事件A與事件B相互獨立
朴素:
假設:特征與特征之間是相互獨立朴素貝葉斯算法: 朴素 + 貝葉斯
應用場景:
文本分類
單詞作為特征
概率
朴素貝葉斯
拉普拉斯平滑系數
朴素貝葉斯API(naive表示朴素的意思)
20類新聞分類DEMO
案例分析:20類新聞分類(sklean會從官網下載數據,約14M)
1)獲取數據
2)划分數據集
3)特征工程 -->文本特征抽取(TF-IDF)
4)朴素貝葉斯預估器流程
5)模型評估
from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB
def nb_news():
"""
用朴素貝葉斯算法對新聞進行分類
:return:
"""
# 1)獲取數據
news = fetch_20newsgroups(subset="all")
# 2)划分數據集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)
# 3)特征工程:文本特征抽取-tfidf
transfer = TfidfVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4)朴素貝葉斯算法預估器流程
estimator = MultinomialNB()
estimator.fit(x_train, y_train)
# 5)模型評估
# 方法1:直接比對真實值和預測值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比對真實值和預測值:\n", y_test == y_predict)
# 方法2:計算准確率
score = estimator.score(x_test, y_test)
print("准確率為:\n", score)
return None
if __name__ == '__main__':
nb_news()
決策樹
簡單講,決策樹就是我們Py語言中的if-elif-else語句,通過對特征的先后順序進行選擇,從而達到高效的決策
決策樹的原理
信息論基礎
1)信息(香農定義) :消除隨機不定性的東西
小明 年齡 “我今年18歲” - 信息
小華 ”小明明年19歲” - 不是信息
2)信息的衡量 –》 信息量 -》 信息熵
信息的單位:比特(bit)
g(D,A) = H(D) - 條件熵H(D|A)
4 決策樹的划分依據之一------信息增益
決策樹的API
案例一: 鳶尾花決策樹demo –> 結果表明KNN算法更好
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz
def decision_iris():
"""
用決策樹對鳶尾花進行分類
:return:
"""
# 1)獲取數據集
iris = load_iris()
# 2)划分數據集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3)決策樹預估器
estimator = DecisionTreeClassifier(criterion="entropy")
estimator.fit(x_train, y_train)
# 4)模型評估
# 方法1:直接比對真實值和預測值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比對真實值和預測值:\n", y_test == y_predict)
# 方法2:計算准確率
score = estimator.score(x_test, y_test)
print("准確率為:\n", score)
# 可視化決策樹
export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)
return None
if __name__ == '__main__':
decision_iris()
可視化:
案例二:泰坦尼克號乘客生存預測
流程分析:獲取特征值&目標值
1)獲取數據
2)數據處理
缺失值處理
特征值 -> 字典類型
3)准備好特征值 目標值
4)划分數據集
5)特征工程:字典特征抽取
6)決策樹預估器流程
7)模型評估
import pandas as pd
def titanic_demo():
# 1、獲取數據
path = "http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt"
# titanic = pd.read_csv("F:\instacart\\titanic_demo.txt") # 小數據,僅部分
titanic = pd.read_csv(path) # 大數據
# 篩選特征值和目標值
x = titanic[["pclass", "age", "sex"]]
y = titanic["survived"]
# 2、數據處理
# 1)缺失值處理
x["age"].fillna(x["age"].mean(), inplace=True) # 填補平均值,inplace表示填補數據到原數據
# 2) 轉換成字典
x = x.to_dict(orient="records") # x代表dataform, orient=”record”代表json格式
from sklearn.model_selection import train_test_split
# 3、數據集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 4、字典特征抽取
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 3)決策樹預估器
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=8)
estimator.fit(x_train, y_train)
# 4)模型評估
# 方法1:直接比對真實值和預測值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比對真實值和預測值:\n", y_test == y_predict)
# 方法2:計算准確率
score = estimator.score(x_test, y_test)
print("准確率為:\n", score)
# 可視化決策樹
export_graphviz(estimator, out_file="titanic_tree.dot", feature_names=transfer.get_feature_names())
if __name__ == '__main__':
titanic_demo()
隨機森林
隨機森林原理過程
訓練集: N個樣本,包含特征值+目標值
特征值: M個特征
隨機 = 兩個隨機(訓練隨機 + 特征隨機)
1、訓練集隨機 --》 從N個樣本中隨機有放回的抽樣N個
bootstrap(隨機有放回抽樣)
假設有原始數據集合:[1, 2, 3, 4, 5],第一次抽取到了2,然后放回原數據集,抽到下一個數字還是2,放回后下個是3,以此類推,產生新的樹的訓練集[2, 2, 3, 1, 5]
2、特征隨機 - 從M個特征中隨機抽取m個特征
M >> m(M遠遠大於m),相當於我們之前的【降維】,特征數量減少了,
隨機森林的API
隨機森林-泰坦尼克號demo
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
def random_tree_titanic_demo():
# 1、獲取數據
path = "http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt"
titanic = pd.read_csv("F:\instacart\\titanic_demo.txt") # 小數據,僅部分
# titanic = pd.read_csv(path) # 大數據
# 篩選特征值和目標值
x = titanic[["pclass", "age", "sex"]]
y = titanic["survived"]
# 2、數據處理
# 1)缺失值處理
x["age"].fillna(x["age"].mean(), inplace=True)
# 2) 轉換成字典
x = x.to_dict(orient="records")
from sklearn.model_selection import train_test_split
# 3、數據集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 4、字典特征抽取
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 3)決策樹預估器
estimator = RandomForestClassifier()
# 加入網格搜索與交叉驗證
# 參數准備
param_dict = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
estimator.fit(x_train, y_train)
# 5)模型評估
# 方法1:直接比對真實值和預測值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比對真實值和預測值:\n", y_test == y_predict)
# 方法2:計算准確率
score = estimator.score(x_test, y_test)
print("准確率為:\n", score)
# 最佳參數:best_params_
print("最佳參數:\n", estimator.best_params_)
# 最佳結果:best_score_
print("最佳結果:\n", estimator.best_score_)
# 最佳估計器:best_estimator_
print("最佳估計器:\n", estimator.best_estimator_)
# 交叉驗證結果:cv_results_
print("交叉驗證結果:\n", estimator.cv_results_)
if __name__ == '__main__':
random_tree_titanic_demo()
其他
資料鏈接:https://pan.baidu.com/s/1apbuwSIfSx7OqcFS9KqVBg
提取碼:lvaq





















![image_thumb[1] image_thumb[1]](/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvNTE5NjA4LzIwMTkwMy81MTk2MDgtMjAxOTAzMTAxODA3NTIzMjktMTcwNjEwMTY0MC5wbmc=.png)
![image_thumb[2] image_thumb[2]](/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvNTE5NjA4LzIwMTkwMy81MTk2MDgtMjAxOTAzMTAxODA3NTM2MjgtMTg0OTg1Nzc5Mi5wbmc=.png)
![image_thumb[3] image_thumb[3]](/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvNTE5NjA4LzIwMTkwMy81MTk2MDgtMjAxOTAzMTAxODA3NTQ5MTUtMTk4MTk0MTA2My5wbmc=.png)
![image_thumb[4] image_thumb[4]](/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvNTE5NjA4LzIwMTkwMy81MTk2MDgtMjAxOTAzMTAxODA3NTYzMjYtODg4OTU1NTQ4LnBuZw==.png)
![image_thumb[5] image_thumb[5]](/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvNTE5NjA4LzIwMTkwMy81MTk2MDgtMjAxOTAzMTAxODA3NTgyNDUtNDgzNDk3MzQzLnBuZw==.png)

![image_thumb[8] image_thumb[8]](/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvNTE5NjA4LzIwMTkwMy81MTk2MDgtMjAxOTAzMTAxODA4MDI2MTMtNzgxMTc4MTgyLnBuZw==.png)
















