本系列文章md筆記(已分享)主要討論機器學習算法相關知識。機器學習算法文章筆記以算法、案例為驅動的學習,伴隨淺顯易懂的數(shù)學知識,讓大家掌握機器學習常見算法原理,應用Scikit-learn實現(xiàn)機器學習算法的應用,結合場景解決實際問題。包括K-近鄰算法,線性回歸,邏輯回歸,決策樹算法,集成學習,聚類算法。K-近鄰算法的距離公式,應用LinearRegression或SGDRegressor實現(xiàn)回歸預測,應用LogisticRegression實現(xiàn)邏輯回歸預測,應用DecisionTreeClassifier實現(xiàn)決策樹分類,應用RandomForestClassifie實現(xiàn)隨機森林算法,應用Kmeans實現(xiàn)聚類任務。
全套筆記和代碼自取移步: 個人博客
感興趣的小伙伴可以自取哦,歡迎大家點贊轉發(fā)~
共 7 章,44 子模塊
K-近鄰算法
學習目標
- 掌握K-近鄰算法實現(xiàn)過程
- 知道K-近鄰算法的距離公式
- 知道K-近鄰算法的超參數(shù)K值以及取值問題
- 知道kd樹實現(xiàn)搜索的過程
- 應用KNeighborsClassifier實現(xiàn)分類
- 知道K-近鄰算法的優(yōu)缺點
- 知道交叉驗證實現(xiàn)過程
- 知道超參數(shù)搜索過程
- 應用GridSearchCV實現(xiàn)算法參數(shù)的調優(yōu)
1.6 案例:鳶尾花種類預測--數(shù)據(jù)集介紹
本實驗介紹了使用Python進行機器學習的一些基本概念。 在本案例中,將使用K-Nearest Neighbor(KNN)算法對鳶尾花的種類進行分類,并測量花的特征。
本案例目的:
- 遵循并理解完整的機器學習過程
- 對機器學習原理和相關術語有基本的了解。
- 了解評估機器學習模型的基本過程。
1 案例:鳶尾花種類預測
Iris數(shù)據(jù)集是常用的分類實驗數(shù)據(jù)集,由Fisher, 1936收集整理。Iris也稱鳶尾花卉數(shù)據(jù)集,是一類多重變量分析的數(shù)據(jù)集。關于數(shù)據(jù)集的具體介紹:
2 scikit-learn中數(shù)據(jù)集介紹
2.1 scikit-learn數(shù)據(jù)集API介紹
-
sklearn.datasets
-
加載獲取流行數(shù)據(jù)集
-
datasets.load_*()
- 獲取小規(guī)模數(shù)據(jù)集,數(shù)據(jù)包含在datasets里
-
datasets.fetch_*(data_home=None)
- 獲取大規(guī)模數(shù)據(jù)集,需要從網(wǎng)絡上下載,函數(shù)的第一個參數(shù)是data_home,表示數(shù)據(jù)集下載的目錄,默認是 ~/scikit_learn_data/
-
2.1.1 sklearn小數(shù)據(jù)集
- sklearn.datasets.load_iris()
加載并返回鳶尾花數(shù)據(jù)集
2.1.2 sklearn大數(shù)據(jù)集
-
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
- subset:'train'或者'test','all',可選,選擇要加載的數(shù)據(jù)集。
- 訓練集的“訓練”,測試集的“測試”,兩者的“全部”
2.2 sklearn數(shù)據(jù)集返回值介紹
-
load和fetch返回的數(shù)據(jù)類型datasets.base.Bunch(字典格式)
- data:特征數(shù)據(jù)數(shù)組,是 [n_samples * n_features] 的二維 numpy.ndarray 數(shù)組
- target:標簽數(shù)組,是 n_samples 的一維 numpy.ndarray 數(shù)組
- DESCR:數(shù)據(jù)描述
- feature_names:特征名,新聞數(shù)據(jù),手寫數(shù)字、回歸數(shù)據(jù)集沒有
- target_names:標簽名
from sklearn.datasets import load_iris
# 獲取鳶尾花數(shù)據(jù)集
iris = load_iris()
print("鳶尾花數(shù)據(jù)集的返回值:\n", iris)
# 返回值是一個繼承自字典的Bench
print("鳶尾花的特征值:\n", iris["data"])
print("鳶尾花的目標值:\n", iris.target)
print("鳶尾花特征的名字:\n", iris.feature_names)
print("鳶尾花目標值的名字:\n", iris.target_names)
print("鳶尾花的描述:\n", iris.DESCR)
2.3 查看數(shù)據(jù)分布
通過創(chuàng)建一些圖,以查看不同類別是如何通過特征來區(qū)分的。 在理想情況下,標簽類將由一個或多個特征對完美分隔。 在現(xiàn)實世界中,這種理想情況很少會發(fā)生。
-
seaborn介紹
-
Seaborn 是基于 Matplotlib 核心庫進行了更高級的 API 封裝,可以讓你輕松地畫出更漂亮的圖形。而 Seaborn 的漂亮主要體現(xiàn)在配色更加舒服、以及圖形元素的樣式更加細膩。
-
安裝 pip3 install seaborn
-
seaborn.lmplot() 是一個非常有用的方法,它會在繪制二維散點圖時,自動完成回歸擬合
- sns.lmplot() 里的 x, y 分別代表橫縱坐標的列名,
- data= 是關聯(lián)到數(shù)據(jù)集,
- hue=*代表按照 species即花的類別分類顯示,
- fit_reg=是否進行線性擬合。
-
參考鏈接: api鏈接
-
%matplotlib inline
# 內嵌繪圖
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 把數(shù)據(jù)轉換成dataframe的格式
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_d['Species'] = iris.target
def plot_iris(iris, col1, col2):
sns.lmplot(x = col1, y = col2, data = iris, hue = "Species", fit_reg = False)
plt.xlabel(col1)
plt.ylabel(col2)
plt.title('鳶尾花種類分布圖')
plt.show()
plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')
2.4 數(shù)據(jù)集的劃分
機器學習一般的數(shù)據(jù)集會劃分為兩個部分:
- 訓練數(shù)據(jù):用于訓練,構建模型
- 測試數(shù)據(jù):在模型檢驗時使用,用于評估模型是否有效
劃分比例:
- 訓練集:70% 80% 75%
- 測試集:30% 20% 25%
數(shù)據(jù)集劃分api
-
sklearn.model_selection.train_test_split(arrays, *options)
- x 數(shù)據(jù)集的特征值
- y 數(shù)據(jù)集的標簽值
- test_size 測試集的大小,一般為float
- random_state 隨機數(shù)種子,不同的種子會造成不同的隨機采樣結果。相同的種子采樣結果相同。
- return 測試集特征訓練集特征值值,訓練標簽,測試標簽(默認隨機取)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 1、獲取鳶尾花數(shù)據(jù)集
iris = load_iris()
# 對鳶尾花數(shù)據(jù)集進行分割
# 訓練集的特征值x_train 測試集的特征值x_test 訓練集的目標值y_train 測試集的目標值y_test
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
print("x_train:\n", x_train.shape)
# 隨機數(shù)種子
x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=6)
x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6)
print("如果隨機數(shù)種子不一致:\n", x_train == x_train1)
print("如果隨機數(shù)種子一致:\n", x_train1 == x_train2)
1.7 特征工程-特征預處理
1 什么是特征預處理
1.1 特征預處理定義
scikit-learn的解釋
provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.
翻譯過來:通過一些轉換函數(shù)將特征數(shù)據(jù)轉換成更加適合算法模型的特征數(shù)據(jù)過程
為什么我們要進行歸一化/標準化?
- 特征的單位或者大小相差較大,或者某特征的方差相比其他的特征要大出幾個數(shù)量級,容易影響(支配)目標結果,使得一些算法無法學習到其它的特征
舉例:約會對象數(shù)據(jù)
我們需要用到一些方法進行無量綱化,使不同規(guī)格的數(shù)據(jù)轉換到同一規(guī)格
1.2 包含內容(數(shù)值型數(shù)據(jù)的無量綱化)
- 歸一化
- 標準化
1.3 特征預處理API
sklearn.preprocessing
2 歸一化
2.1 定義
通過對原始數(shù)據(jù)進行變換把數(shù)據(jù)映射到(默認為[0,1])之間
2.2 公式
作用于每一列,max為一列的最大值,min為一列的最小值,那么X’’為最終結果,mx,mi分別為指定區(qū)間值默認mx為1,mi為0
那么怎么理解這個過程呢?我們通過一個例子
2.3 API
-
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
-
MinMaxScalar.fit_transform(X)
- X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
-
返回值:轉換后的形狀相同的array
-
2.4 數(shù)據(jù)計算
我們對以下數(shù)據(jù)進行運算,在dating.txt中。保存的就是之前的約會對象數(shù)據(jù)
milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1
- 分析
1、實例化MinMaxScalar
2、通過fit_transform轉換
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
"""
歸一化演示
:return: None
"""
data = pd.read_csv("dating.txt")
print(data)
# 1、實例化一個轉換器類
transfer = MinMaxScaler(feature_range=(2, 3))
# 2、調用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("最小值最大值歸一化處理的結果:\n", data)
return None
返回結果:
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
3 75136 13.147394 0.428964 1
.. ... ... ... ...
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
最小值最大值歸一化處理的結果:
[[ 2.44832535 2.39805139 2.56233353]
[ 2.15873259 2.34195467 2.98724416]
[ 2.28542943 2.06892523 2.47449629]
...,
[ 2.29115949 2.50910294 2.51079493]
[ 2.52711097 2.43665451 2.4290048 ]
[ 2.47940793 2.3768091 2.78571804]]
問題:如果數(shù)據(jù)中異常點較多,會有什么影響?
2.5 歸一化總結
注意最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統(tǒng)精確小數(shù)據(jù)場景。
怎么辦?
3 標準化
3.1 定義
通過對原始數(shù)據(jù)進行變換把數(shù)據(jù)變換到均值為0,標準差為1范圍內
3.2 公式
作用于每一列,mean為平均值,σ為標準差
所以回到剛才異常點的地方,我們再來看看標準化
- 對于歸一化來說:如果出現(xiàn)異常點,影響了最大值和最小值,那么結果顯然會發(fā)生改變
- 對于標準化來說:如果出現(xiàn)異常點,由于具有一定數(shù)據(jù)量,少量的異常點對于平均值的影響并不大,從而方差改變較小。
3.3 API
-
sklearn.preprocessing.StandardScaler( )
-
處理之后每列來說所有數(shù)據(jù)都聚集在均值0附近標準差差為1
-
StandardScaler.fit_transform(X)
- X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
-
返回值:轉換后的形狀相同的array
-
3.4 數(shù)據(jù)計算
同樣對上面的數(shù)據(jù)進行處理
- 分析
1、實例化StandardScaler
2、通過fit_transform轉換
import pandas as pd
from sklearn.preprocessing import StandardScaler
def stand_demo():
"""
標準化演示
:return: None
"""
data = pd.read_csv("dating.txt")
print(data)
# 1、實例化一個轉換器類
transfer = StandardScaler()
# 2、調用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("標準化的結果:\n", data)
print("每一列特征的平均值:\n", transfer.mean_)
print("每一列特征的方差:\n", transfer.var_)
return None
返回結果:文章來源:http://www.zghlxwxcb.cn/news/detail-827471.html
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
.. ... ... ... ...
997 26575 10.650102 0.866627 3
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
標準化的結果:
[[ 0.33193158 0.41660188 0.24523407]
[-0.87247784 0.13992897 1.69385734]
[-0.34554872 -1.20667094 -0.05422437]
...,
[-0.32171752 0.96431572 0.06952649]
[ 0.65959911 0.60699509 -0.20931587]
[ 0.46120328 0.31183342 1.00680598]]
每一列特征的平均值:
[ 3.36354210e+04 6.55996083e+00 8.32072997e-01]
每一列特征的方差:
[ 4.81628039e+08 1.79902874e+01 2.46999554e-01]
3.5 標準化總結
在已有樣本足夠多的情況下比較穩(wěn)定,適合現(xiàn)代嘈雜大數(shù)據(jù)場景。文章來源地址http://www.zghlxwxcb.cn/news/detail-827471.html
未完待續(xù), 同學們請等待下一期
全套筆記和代碼自取移步gitee倉庫: gitee倉庫獲取完整文檔和代碼
感興趣的小伙伴可以自取哦,歡迎大家點贊轉發(fā)~
到了這里,關于【機器學習算法】KNN鳶尾花種類預測案例和特征預處理。全md文檔筆記(已分享,附代碼)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!