机器学习算法库scikit-learn库–解决分类与回归问题
- 以鸢尾花数据集为例
下载数据集:import seaborn as sns
iris = sns.load_dataset("iris")
数据集查看:type(iris)
iris.shape
iris.head()
iris.info()
iris.describe()
iris.species.value_counts #统计字符串元素种类及数量
sns.pairplot(data=iris, hue="species"
数据清洗:iris_simple = iris.drop(["sepal_length", "sepal_width"], axis=1)
标签编码:from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
iris_simple["species"] = encoder.fit_transform(iris_simple["species"])
数据标准化:
from sklearn.preprocessing import ScandardScaler
from pandas as pd
trans = StandardScaler()
_iris_simple = trans.fit_transform(iris_simple[["petal_length", "petal_width"]])
_iris_simple = pd.DataFrame(_iris_simple, columns=["petal_length", "petal_width")
构建训练集和测试集:
from sklearn.model_selection import train_test_split
train_set, test_set = train_test_split(iris_simple, test_size=scale)
iris_x_train = train_set[["petal_length", "petal_width"]]
iris_y_train = train_set["species"].copy()
iris_x_text = test_set[["petal_length", "petal_width"]]
iris_y_test = test_set["species"].copy()
- 八大传统机器学习分类算法
2.1 k临近算法:待测点最近的k个邻居中最常见的类别
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier #构建分类器对象
clf.fit(iris_x_train, iris_y_train) #训练
res = clf.predict(iris_x_text)#预测
encoder.inverse_transform(res)#翻转
accuracy = clf.score(iris_x_test, iris_y_test)#评估
out = iris_x_text.copy()#存储数据
out["y"] = iris_y_test
out["pre"] = res
put.to_csy("iris_predict.csv")
#可视化
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
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, N)
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))
mpl.pcolormesh(t1, t2, y_predict.reshape(x1.shape), cmap=cm_light)
#绘制散点
plt.scatter(iris_simple["petal_length"], iris_simple["petal_width"], c=iris_simple["species"], label=None, cmap=cm_dark, marker="o", edgecolors="k")
plt.xlabel("petal_length")
plt.ylabel("petal_width")
plt.title("iris_classfier")
#绘制图例
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")
draw(clf)
2.2 朴素贝叶斯算法:当特征值X=(x1, x2)发生的时候,哪一个类yk发生的概率最大。from sklearn.naive.bayes import GaussianNB
2.3 决策树算法:每次通过一个特征,将数据尽可能的氛围纯净的两类,递归的分下去。from sklearn.tree import DecisionTreeClassifier
2.4 逻辑回归算法:from sklearn.linear_model import LogisticRegression
训练:通过一个映射方式,将特征X=(x1, x2)映射称P(y=ck),求使得所有概率之积最大化的映射方式里的参数。
预测:计算p(y=ck)取概率最大的那个类别作为预测对象的分类。
2.5 支持向量机算法:如二分类,用一个超平面将两类数据完全分开,且最近点到平面的距离最大。from sklearn.svm from SVC
2.6 集成方法–随机森林:训练集m,有放回的随机抽取m个数据,构成一组,共抽取n组采样;n组采样集训练得到n个弱分类器,弱分类器一般用决策树或神经网络;将n个弱分类器进行组合得到强分类器。from sklearn.ensemble import RandomForestClassifier
2.7 集成方法–Adaboost:训练集m,用初始数据权重训练得到第一个弱分类器,根据误差率计算弱分类器系数,更新数据的权重;使用新的权重训练得到第二个弱分类器,以此类推;根据各自系数,将所有弱分类器加权求和获得强分类器。from sklearn.ensemble import AdaBoostClassifier
2.8 集成方法–梯度提升数GBDT:训练集m,获得第一个弱分类器,获得残差,然后不断地拟合残差;所有弱分类器相加得到强分类器。from sklearn.ensemble import GradientBoostingClassifier
- 其他有效方法
3.1 xgboost:GBDT的损失函数只对误差部分做负梯度(一阶泰勒)展开,XGBoost损失函数对误差部分做二阶泰勒展开,更加准确,更快收敛。
3.2 lightgbm:快速、分布式、高性能的基于决策树算法的梯度提升框架,速度更快
3.3 stacking:堆叠,又称模型融合,先建立几个简单的模型进行训练,第二级学习器会基于前级模型的预测结果进行再训练。
3.4 神经网络