Sklearn
- 基本屬性
- Sklearn算法庫
-
- 1.K近鄰算法kNN
- 2.樸素貝葉斯算法
- 3邏輯回歸
- 4支援向量機
- 5內建方法-随機森林
- 6內建方法——Adaboost
- 7內建方法-梯度提升樹GBDT
基本屬性
Scikit-learn(sklearn)是機器學習中常用的第三方子產品,對常用的機器學習方法進行了封裝,包括回歸(Regression)、降維(Dimensionality Reduction)、分類(Classfication)、聚類(Clustering)等方法。當我們面臨機器學習問題時,便可根據下圖來選擇相應的方法。Sklearn具有以下特點:
1 簡單高效的資料挖掘和資料分析工具
2 讓每個人能夠在複雜環境中重複使用
3 建立NumPy、Scipy、MatPlotLib之上
#Sklearn庫
#Sklearn庫是當今最流行的機器學習算法庫之一 可用來解決分類與回歸問題
from sklearn import datasets
import matplotlib as plt
from sklearn.preprocessing import LabelEncoder
import seaborn as sns
#1下載下傳資料集
iris=sns.load_dataset('iris')
#2資料集檢視
print(type(iris))
print(iris.shape)
print(iris.head())
print(iris.info())
print(iris.describe())
print(iris.species.value_counts())
sns.pairplot(data=iris,hue="species")#圖 檢視各個特征相關性
#3标簽清洗
iris_simple=iris.drop(["sepal_length","sepal_width"],axis=1)
print(iris_simple.head())
#4标簽編碼
encoder=LabelEncoder()
iris_simple["species"]=encoder.fit_transform(iris_simple["species"])
print(iris_simple)
#5
#5資料集的标準化
trans=StandardScaler()
_iris_simple=trans.fit_transform(iris_simple[["petal_length","petal_width"]])
_iris_simple=pd.DataFrame(_iris_simple,columns=["petal_length","petal_width"])
print(_iris_simple.describe())
#6建構訓練集和測試集(暫不考慮驗證集)
from sklearn.model_selection import train_test_split
train_set,test_set=train_test_split(iris_simple,test_size=0.2)
print(test_set.head())
print(test_set.shape)
iris_x_train=train_set[["petal_length","petal_width"]]
print(iris_x_train.head())
iris_y_train=train_set["species"].copy()
print(iris_y_train.head())
iris_x_test=test_set[["petal_length","petal_width"]]
print(iris_x_test.head())
iris_y_test=test_set["species"].copy()
print(iris_y_test.head())
Sklearn算法庫
1.K近鄰算法kNN
代碼如下(示例):
#與待預測點最近的訓練資料集中的k個鄰居 把其中最常見的類别預測為待預測點的類别
from sklearn.neighbors import KNeighborsClassifier
#建構分類器對象
clf=KNeighborsClassifier()
print(clf)
#訓練
clf.fit(iris_x_train,iris_y_train)
#預測
res=clf.predict(iris_x_test)
print(res)
print(iris_y_test.values)
#翻轉
print(encoder.inverse_transform(res))
#評估
accuracy=clf.score(iris_x_test,iris_y_test)
print("預測正确率:{:.0%}".format(accuracy))
#2存儲資料
out=iris_x_test.copy()
out["y"]=iris_y_test
out["pre"]=res
print(out)
out.to_csv("iris_predict.csv")
#3可視化
def draw(clf):
# 網絡化
M,N=500,500
x1_min,x2_min=iris_simple[["petal_length","petal_width"]].min(axis=0)
x1_max,x2_max=iris_simple[["petal_length","petal_width"]].max(axis=0)
t1=np.linspace(x1_min,x1_max,M)
t2=np.linspace(x2_min,x2_max,M)
x1,x2=np.meshgrid(t1,t2)
#預測
x_show=np.stack((x1.flat,x2.flat),axis=1)
y_predict=clf.predict(x_show)
#配色
cm_light=mpl.colors.ListedColormap(["#A0FFA0","#FFA0A0","#A0A0FF"])
cm_dark=mpl.colors.ListedColormap(["g","r","b"])
#繪制預測區域圖
plt.figure(figsize=(10,6))
plt.pcolormesh(t1,t2,y_predict.reshape(x1.shape),cmap=cm_light)
#繪制原始資料點
plt.scatter(iris_simple["petal_length"],iris_simple["petal_width"],label=None,
c=iris_simple["species"],cmap=cm_dark,marker='o',edgecolors='k')
plt.xlabel("petal_length")
plt.ylabel("petal_width")
#繪制圖例
color=["g","r","b"]
species=["setosa","virginica","versicolor"]
for i in range(3):
plt.scatter([],[],c=color[i],s=40,label=species[i])#利用空點繪制圖例
plt.legend(loc="best")
plt.title('iris_classfier')
plt.show()
2.樸素貝葉斯算法
代碼如下(示例):
from sklearn.naive_bayes import GaussianNB
#建構分類器對象
clf=GaussianNB()
print(clf)
#訓練
clf.fit(iris_x_train,iris_y_train)
#預測
res=clf.predict(iris_x_test)
print(res)
print(iris_y_test.values)
#評估
accuracy=clf.score(iris_x_test,iris_y_test)
print("預測正确率:{:.0%}".format(accuracy))
draw(clf)
#樸素貝葉斯
#CATRT算法:每次通過一個特征,将資料盡可能分為純淨的兩類,遞歸的分下去
from sklearn.tree import DecisionTreeClassifier
#建構分類器對象
clf=DecisionTreeClassifier()
print(clf)
#訓練
clf.fit(iris_x_train,iris_y_train)
#預測
res=clf.predict(iris_x_test)
print(res)
print(iris_y_test.values)
#評估
accuracy=clf.score(iris_x_test,iris_y_test)
print("預測正确率:{:.0%}".format(accuracy))
draw(clf)
3邏輯回歸
#訓練:通過一個映射方式,将特征X=(x1,x2)映射成P(y=ck),求使得所有機率之積最大化的映射方式裡的參數
#預測:計算p(y=ck)取機率最大的那個類别作為預測對象的分類
from sklearn.linear_model import LogisticRegression
clf=LogisticRegression(solver='saga',max_iter=1000)
print(clf)
#訓練
clf.fit(iris_x_train,iris_y_train)
#預測
res=clf.predict(iris_x_test)
print(res)
print(iris_y_test.values)
#評估
accuracy=clf.score(iris_x_test,iris_y_test)
print("預測正确率:{:.0%}".format(accuracy))
draw(clf)
4支援向量機
#以二分類為例 假設資料可以完全分開
#用一個超平面将兩類資料完全分開,且最近點到平面距離最大
from sklearn.svm import SVC
clf=SVC()
print(clf)
clf.fit(iris_x_train,iris_y_train)
#預測
res=clf.predict(iris_x_test)
print(res)
print(iris_y_test.values)
#評估
accuracy=clf.score(iris_x_test,iris_y_test)
print("預測正确率:{:.0%}".format(accuracy))
draw(clf)
5內建方法-随機森林
#訓練集m,有放回随機取m個資料,構成一組,共抽取n組采樣集
#n組采樣集訓練得到n個弱分類器 弱分類器一般用決策樹或神經網絡
#将n個弱分類器進行組合得到強分類器
from sklearn.ensemble import RandomForestClassifier
clf=RandomForestClassifier()
print(clf)
clf.fit(iris_x_train,iris_y_train)
#預測
res=clf.predict(iris_x_test)
print(res)
print(iris_y_test.values)
#評估
accuracy=clf.score(iris_x_test,iris_y_test)
print("預測正确率:{:.0%}".format(accuracy))
draw(clf)
6內建方法——Adaboost
#訓練集m,用初始資料權重訓練得到第一個弱分類器,根據誤差率計算弱分類器系數,更新資料的權重
#使用新的權重訓練得到第二個弱分類器,以此類推
#根據各自系數,将是以弱分類器權重求和獲得強分類器
from sklearn.ensemble import AdaBoostClassifier
from sklearn.naive_bayes import GaussianNB
clf=AdaBoostClassifier()
print(clf)
clf.fit(iris_x_train,iris_y_train)
res=clf.predict(iris_x_test)
print(res)
print(iris_y_test.values)
#評估
accuracy=clf.score(iris_x_test,iris_y_test)
print("預測正确率:{:.0%}".format(accuracy))
draw(clf)
7內建方法-梯度提升樹GBDT
#訓練集m,獲得第一個弱分類器 獲得殘差,然後不斷拟合殘差
#所有弱分類器相加得到強分類器
from sklearn.ensemble import GradientBoostingClassifier
clf=GradientBoostingClassifier()
print(clf)
clf.fit(iris_x_train,iris_y_train)
res=clf.predict(iris_x_test)
print(res)
print(iris_y_test.values)
#評估
accuracy=clf.score(iris_x_test,iris_y_test)
print("預測正确率:{:.0%}".format(accuracy))
draw(clf)
sklearn 官方文檔中文版(0.22.1)