內容
轉換器與預估器
KNN算法
模型選擇與調優(yōu)
樸素貝葉斯算法
決策樹與隨機森林
轉換器與預估器
特征工程流程
1.實例化一個轉換器類(transformer)
2.調用transformer.fit_transform()方法
fit():計算挚躯,transform():利用fir()計算的結果進行后續(xù)轉化
預估器是一類實現(xiàn)了算法的API领斥。
將預處理好的數(shù)據(jù)交給預估器,就可以訓練出模型
分類
1.用于分類的預估器
sllwarn.neighbors:K-近鄰算法
sklwarn.naive_baves:樸素貝葉斯算法
sklwarn.linear_model.LogisticRegression:邏輯回歸
sklearn.tree:決策樹與隨機森林
2.用于回歸的預估器
sklearn.linear_model.linearRegression:線性回歸
sklearn.linear_model.Ridge:嶺回歸
3.用于聚類的預估器
sklearn.cluster.KMeans:Kmeans算法
預估器使用流程
1.實例化一個預估器estimator
2.訓練:estimater.fit(x_train, y_train)
3.模型評估:
1)比對真實值(y_test)和預測值(y_predict=estimator.predict(x_test)
2)直接計算準確率:estimator.score(x_test, y_test)
將訓練集交給預估器贱枣,就可以訓練出模型冤馏,然后評估模型
KNN算法
是一種判斷類別(目標值是類別)的算法
根據(jù)我的鄰居來判斷我的類別
距離計算使用歐式距離計算公式
a(a1,b1,a3),b(b1,b2,b3)之間的距離:根號下((a1-b1)2+(a2-b2)2+(a3-b3)^2)
如果一個樣本在特征空間中的K個最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個類別日麸,則該樣本也屬于這個類別
K的值會影響到最終結果
API
sklearn.neighbors.KNeighBorsClassifier(n_neighbors=5,algorithm='auto')
n_neighbors:int,可選(默認5),即K值逮光,設置查詢的鄰居的個數(shù)
algorithm:可選的算法
示例:KNN算法對鳶尾花進行分類
流程
獲取數(shù)據(jù)集
劃分數(shù)據(jù)集
特征工程:標準化
KNN預估器流程
1)實例化預估器類
2)fit數(shù)據(jù)進行訓練
評估模型效果
方法1:比對測試集的預測值和真實值
方法2:直接計算準確率
示例:
"""
用knn算法對鳶尾花進行分類
:return: None
"""
# 1.獲取數(shù)據(jù)集
iris = load_iris()
# 2.劃分數(shù)據(jù)集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3.特征工程代箭,標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4.knn預估器流程
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
# 5.模型評估
# 方法1:比對真實值和預測值
y_predict = estimator.predict(x_test)
print("預測的結果為:\n", y_predict)
print("比對真實值和預測值:\n", y_test == y_predict)
# 方法2:直接計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n", score)
return None
總結
優(yōu)點:簡單,易于理解涕刚,易于實現(xiàn)
缺點:計算量大嗡综,事件復雜度高,內存開銷大
適用場景:小數(shù)據(jù)場景杜漠,幾千到幾萬
模型選擇與調優(yōu)
交叉驗證
為了讓被評估的模型更加準確可信
更好的利用訓練集數(shù)據(jù)
將拿到的訓練集數(shù)據(jù)极景,分為若干組(幾組叫做幾折)再次分為訓練集和驗證集,每一組的訓練集訓練后驾茴,用每一組的驗證集進行驗證盼樟,最后,取各組驗證機的平均值表示模型的訓練結果
超參數(shù):需要手動設置的參數(shù)锈至。如knn算法中的K值
網(wǎng)格搜索
可以自動對超參數(shù)進行交叉驗證晨缴,最后選擇最優(yōu)參數(shù)集
API:sklwarn.model_selection.GridSearchCV(estimator, param_grid=Nnone,cv=None)
對估計器,自動對指定的超參數(shù)集進行享盡的搜索(網(wǎng)格搜索)峡捡;對訓練集數(shù)據(jù)進一步優(yōu)化處理(交叉驗證)
estimator:估計器對象
param_grid:估計器的K參數(shù)(dict){“n_neighbors”:[1,3,5]}
cv:指定幾折交叉驗證(分為幾組)
然后使用fit函數(shù)訓練數(shù)據(jù)
使用score查看訓練的結果
對結果進行分析:
best_score_:在交叉驗證中最好的結果
best_estimator_:最好的參數(shù)模型
cv_results_:每次交叉驗證后的準確率結果
可對用KNN算法對鳶尾花進行分類的例子击碗,加上網(wǎng)格搜索和交叉驗證
"""
用knn算法對鳶尾花進行分類
:return: None
"""
# 1、獲取數(shù)據(jù)集
iris = load_iris()
# 2们拙、劃分數(shù)據(jù)集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3稍途、特征工程:標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# x_test = transfer.fit_transform(x_test)
# 4、KNN預估器流程
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train, y_train)
# 5砚婆、模型評估
# 方法1:比對真實值和預測值
y_predict = estimator.predict(x_test)
print("預測結果為:\n", y_predict)
print("比對真實值和預測值:\n", y_predict == y_test)
# 方法2:直接計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n", score)
return None
def knn_iris_gscv():
"""
用knn算法對鳶尾花進行分類械拍,加入網(wǎng)格搜索和交叉驗證
:return: None
"""
...
# 模型選擇與調優(yōu)
# 網(wǎng)格搜索和交叉驗證
# 構造超參數(shù)的字典
param_dict = {"n_neighbors": [1, 3, 5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
estimator.fit(x_train, y_train)
# 5、模型評估
# 方法1:比對真實值和預測值
y_predict = estimator.predict(x_test)
print("預測結果為:\n", y_predict)
print("比對真實值和預測值:\n", y_predict == y_test)
# 方法2:直接計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n", score)
# 6、交叉驗證和網(wǎng)格搜索的結果
print("在交叉驗證中驗證的最好結果:\n", estimator.best_score_)
print("最好的參數(shù)模型:\n", estimator.best_estimator_)
print("每次交叉驗證后的準確率結果:\n", estimator.cv_results_)
return None
樸素貝葉斯算法
假定特征之間相互獨立的殊者,利用貝葉斯公式的分類算法与境,如文章的分類
樸素:假定特征與特征之間相互獨立
貝葉斯:貝葉斯公式
P(C|W)=P(W|C)*P(C)/P(W)
需要配合拉普拉斯平滑系數(shù)一起作用
API
sklearn.naive_bayes.MultinomialNB(alpha=1.0)
樸素貝葉斯分類
alpha:拉普拉斯平滑系數(shù)
案例:對新聞進行分類
"""
用KNN算法預測Facebook簽到位置
:return: None
"""
# 1、獲取數(shù)據(jù)集
facebook = pd.read_csv("./FBlocation/train.csv")
# 2猖吴、基本的數(shù)據(jù)處理摔刁,拿到特征值和目標值
# 1)縮小數(shù)據(jù)范圍
facebook = facebook.query("x > 1.0 & x <1.25 & y > 2.0 & y < 2.25")
# 2)選取有用的時間特征
time_value = pd.to_datetime(facebook["time"], unit="s")
time_value = pd.DatetimeIndex(time_value)
facebook["day"] = time_value.day
facebook["hour"] = time_value.hour
facebook["weekday"] = time_value.weekday
# 3)去掉簽到較少的地點
place_count = facebook.groupby("place_id").count()
place_count = place_count[place_count["row_id"] > 3]
facebook = facebook[facebook["place_id"].isin(place_count.index)]
# 4)拿到特征值x和目標值y
x = facebook[["x", "y", "accuracy", "day", "hour", "weekday"]]
y = facebook["place_id"]
# 3、數(shù)據(jù)集的劃分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=6)
# 4海蔽、特征工程:標準化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 5共屈、KNN預估器流程
estimator = KNeighborsClassifier()
# 6、模型選擇與調優(yōu)
# 準備好超參數(shù)
param_dict = {"n_neighbors": [5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
estimator.fit(x_train, y_train)
# 7党窜、模型評估
# 方法1:比對真實值和預測值
y_predict = estimator.predict(x_test)
print("預測結果為:\n", y_predict)
print("比對真實值和預測值:\n", y_predict == y_test)
# 方法2:直接計算準確率
score = estimator.score(x_test, y_test)
print("準確率為:\n", score)
# 6拗引、交叉驗證和網(wǎng)格搜索的結果
print("在交叉驗證中驗證的最好結果:\n", estimator.best_score_)
print("最好的參數(shù)模型:\n", estimator.best_estimator_)
print("每次交叉驗證后的準確率結果:\n", estimator.cv_results_)
return None
def nb_news():
"""
用樸素貝葉斯算法對新聞進行分類
:return: None
"""
# 1、獲取數(shù)據(jù)集
news = fetch_20newsgroups(data_home="./news", subset="all")
# print("news數(shù)據(jù)集返回結果:\n", news)
# 2幌衣、劃分數(shù)據(jù)集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, random_state=6)
# 3矾削、特征工程:文本特征抽取TF-IDF
transfer = TfidfVectorizer()
x_train = transfer.fit_transform(x_train)
# x_test一定要用transform
x_test = transfer.transform(x_test)
# x_test = transfer.fit_transform(x_test)
# 4、預估器流程
estimator = MultinomialNB()
estimator.fit(x_train, y_train)
# 5豁护、模型評估
score = estimator.score(x_test, y_test)
print("新聞分類的準確率為:\n", score)
return None
總結
優(yōu)點
對缺失數(shù)據(jù)不敏感
穩(wěn)定哼凯,快
缺點:
因為使用了用本屬性獨立性的假設,所以不適用于關聯(lián)性強的特征的情況
使用場景:
對文本的分類
決策樹與隨機森林
決策樹
基于if-else語句楚里,用最快的選擇順序逐漸確定分類結果
怎么判斷先選擇哪個断部,再選擇哪個?–先選擇信息增益最大的那個
信息增益:表示得知特征x的信息班缎,而使得Y信息的不確定性減少的程度
API:sklearn.tree.DicisionTreeClassfier(criterion=’gini’,max_depth=None)
決策樹分類器
criterion:默認是’gini‘基尼系數(shù)蝴光,也可以選擇信息增益的熵’entropy‘
max_depth:數(shù)的深度大小
可視化決策樹
決策樹的決策流程,可以可視化
步驟:
1.將決策流程導出為dot格式
sklearn.tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
2.安裝graphviz
Ubuntu:ubuntu:sudo apt-get install graphviz;Mac:brew install graphviz
3.運行命令
$ dot -Tpng tree.dot -o tree.png
示例:
"""
用決策樹算法對鳶尾花進行分類
:return: None
"""
# 1达址、獲取數(shù)據(jù)集
iris = load_iris()
# 2蔑祟、劃分數(shù)據(jù)集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3、決策樹預估器流程
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=4)
estimator.fit(x_train, y_train)
# 4苏携、模型評估
# 比對
y_predict = estimator.predict(x_test)
print("預測的結果:\n", y_predict)
print("預測結果和真實值的比對:\n", y_predict == y_test)
# 準確率
score = estimator.score(x_test, y_test)
print("準確率:\n", score)
# 5做瞪、可視化決策樹
export_graphviz(estimator, out_file="tree.dot", feature_names=iris.feature_names)
return None
總結:
優(yōu)點
只需要很少的數(shù)據(jù)準備对粪,不需要標準化
樹木可視化
缺點
容易過擬合右冻,不穩(wěn)定
使用場景
有很好的分析能力,在企業(yè)決策過程中應用較多
隨機森林
包含多個決策樹的分類器
輸出的類別是由個別樹輸出的類別的眾數(shù)而定
集成學習方法
集成學習通過建立幾個模型組合的形式來解決單一預測問題
原理是生成多個分類器/模型著拭,各自獨立的學習和作出判斷纱扭。
這些預測最后結合成單預測
因此集成學習預測的結果優(yōu)于任何一個單分類作出的預測
隨機
訓練集隨機
總共有N個樣本,從這N個樣本中儡遮,隨機有放回的抽取m個樣本作為單個決策樹的訓練集(bootstrap)
特征隨機
總共N個特征乳蛾,從這N個特征中隨機的抽取m個特征作為單個訓練集的特征集
為什么要隨機
1.預測能力不好的樹會相互抵消
2.隨機的方式增強了樹之間的不相關性
每一個決策樹有相同數(shù)量的n個樣本,增強了每棵決策樹的分類能力
API:
sklearn.ensenble.RandomForestClassifier(n_estimators=10, criterrion='gini', max_depth=None), boostrap=True
隨機森林分類器
n_estimator:森林里的樹木數(shù)量
criteria:分割特征的測量方法
max_depth:數(shù)的最大深度
bootstrap:是否在構建樹時放回抽樣
示例:
"""
用隨機森林對泰坦尼克號乘客進行分類
:return:
"""
# 1.獲取數(shù)據(jù)集
titanic = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 2.基本數(shù)據(jù)處理
# 篩選出特征值、目標值
x = titanic[["pclass", "age", "sex"]]
y = titanic["survived"]
# 處理缺失值
x["age"].fillna(value=x["age"].mean(), inplace=True)
# 將特征值轉換成字典類型
x = x.to_dict(orient="records")
# 3.劃分數(shù)據(jù)集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=6)
# 4.特征工程:字典特征抽取
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 5.預估器流程
estimator = RandomForestClassifier()
# 網(wǎng)格搜索與交叉驗證
# 超參數(shù)準備
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)
# 4肃叶、評估模型效果
# 方法a:比對預測結果和真實值
y_predict = estimator.predict(x_test)
print("比對預測結果和真實值:\n", y_predict == y_test)
# 方法b:直接計算準確率
score = estimator.score(x_test, y_test)
print("直接計算準確率:\n", score)
# 6蹂随、交叉驗證和網(wǎng)格搜索的結果
print("在交叉驗證中驗證的最好結果:\n", estimator.best_score_)
print("最好的參數(shù)模型:\n", estimator.best_estimator_)
print("每次交叉驗證后的準確率結果:\n", estimator.cv_results_)
return None
總結:
優(yōu)點
準確率高
適合大數(shù)據(jù)集
不需要降維
使用場景
大數(shù)據(jù)分類場景