监督学习算法
随机森林(RF)
随机森林算法,是bagging集成学习方式中的一种最具有特色的机器学习方法。它是以决策树为基本分类器,如果为分类问题,则最终采用投票法来决定类别;若为回归问题,则采用平均值的方法决定最终预测值。决策树算法带有剪枝过程,但RF算法没有此步骤。根据回归问题和分类问题,sklearn将RF算法分为:分类RF和回归RF。主要是依据样本特征而确定。可以直接利用RF进行多分类问题。一般情况下,RF做分类用CART决策树中的gini指数来选择最优特征。
利用纸鸢花数据集,进行预测分析,前4列为属性,第五列为类别。共150条数据,三个类别,每个类别50条数据。
def open_file(file_address):
data = pd.read_csv(file_address,encoding='utf-8')
#类别做标签
data.loc[data.species == 'Iris-setosa', 'species'] = 0
data.loc[data.species == 'Iris-versicolor', 'species'] = 1
data.loc[data.species == 'Iris-virginica', 'species'] = 2
dataset = data.loc[:,("sepal_length","sepal_width",\
"petal_length","petal_width")]
label = data.loc[:,("species")]
dataset = np.array(dataset) #转成numpy
label = np.array(label)
Num = len(dataset)
return dataset,label,Num
将数据集按照37分为测试集和训练集,用到的是sklearn数据预处理模块中的函数。
from sklearn.model_selection import train_test_split
def dataset_split(dataset,label) :#将训练集和样本分别代入函数
x_train, x_test, y_train, y_test = train_test_split(dataset,label, \
test_size=0.3,random_state=0)
return x_train, x_test, y_train, y_test #返回训练样本,测试样本,训练标签,测试标签
数据预处理,采用最大值减去最小值的方法,做均一化处理。可以参考下面这篇文章。
https://blog.csdn.net/foneone/article/details/83151906
def data_handle(dataset): #利用最小最大值做处理
scaler = preprocessing.MinMaxScaler\
(feature_range=(0, 1)).fit(dataset)
scaler.transform(dataset)
return dataset
构建模型
from sklearn.ensemble import RandomForestClassifier #做分类
#from sklearn.ensemble import RandomForestRegressor 回归
from sklearn import metrics # 计算模型准确率等函数库
dataset,label,Num = open_file('C:\\Users\\happy\\Desktop\\Iris.csv') #获取数据
dataset = data_handle(dataset) #均一化处理
x_train, x_test, y_train, y_test = dataset_split(dataset,label) #调用预测集合测试集划分函数
def train_RandomForests(x_train, x_test, y_train, y_test):
model_RF = RandomForestClassifier(n_estimators=20,max_features="auto",criterion='gini',\
n_jobs=4,oob_score=True) #建立模型,设置相应模型参数
model_RF.fit(x_train, y_train) #调用fit训练
y_pred = model_RF.predict(x_test) #测试集测试
print(y_pred) #将预测类输出
print("RF准确率为:{0:%}".format(metrics.accuracy_score(y_test, y_pred))) #计算模型准确率
train_RandomForests(x_train, x_test, y_train, y_test) #调用建立好的模型
上面为完整代码,其中n_estimators=20,max_features=“auto”,criterion=‘gini’,
n_jobs=4,oob_score=True,均是RF模型参数,如何设置参数,可以查看下面这篇博客。
https://blog.csdn.net/w952470866/article/details/78987265
提升树 和 梯度提升树(GDBT)
提升树是以分类树或者回归树为基本分类器的提升方法。提升方法实际采用加法模型(基模型的线性组合)与前向分布算法。不同问题的提升学习算法,主要区别在于使用的损失函数不同,用平方损失函数来解决回归问题,用指数损失函数解决分类问题,用一般的损失函数解决一般的决策问题。
对于一般损失函数而言,优化不容易,针对这个问题,Freidman提出了梯度提升算法。利用最速下降的近似方法,作为回归问题提升树算法中的残差的近似值,拟合回归树。
from sklearn.ensemble import GradientBoostingClassifier #梯度提升树
def train_GDBT(x_train,x_test,y_train,y_test):
model_GDBT = GradientBoostingClassifier()
#n_estimators=60,learning_rate=0.1,random_state=10
model_GDBT.fit(x_train,y_train)
#测试集测试
y_pred = model_GDBT.predict(x_test)
#准确率预测
print(y_pred) #将预测类输出
print("GDBT准确率为:{0:%}".format(metrics.accuracy_score(y_test, y_pred))) #计算模型准确率
train_train_GDBT(x_train, x_test, y_train, y_test) #调用建立好的模型
参数问题,可参考下面这篇文章。
https://www.cnblogs.com/pinard/p/6143927.html
逻辑斯谛回归
一种名字里面虽然带有“回归”二字,却实打实的是一个“分类”算法的算法,可以做多分类问题。
from sklearn.linear_model import LogisticRegression #逻辑斯蒂回归
model_Log = LogisticRegression(max_iter = 100,solver='liblinear')
model_Log.fit( x_train,y_train)
y_pred = model_Log.predict(x_test)
print("逻辑斯谛回归准确率为:{0:%}".format(metrics.accuracy_score(y_test, y_pred)))
SVM
SVM的详细讲述不再赘述,依旧使用当前数据,代码如下。
from sklearn.svm import SVC #SVM
def train_SVM(x_train, x_test, y_train, y_test):
model_SVM = SVC() #建立模型,设置相应模型参数
model_SVM.fit(x_train, y_train) #调用fit训练
y_pred = model_SVM.predict(x_test) #测试集测试
print(y_pred) #将预测类输出
print("SVM准确率为:{0:%}".format(metrics.accuracy_score(y_test, y_pred))) #计算模型准确率
train_SVM(x_train, x_test, y_train, y_test) #调用建立好的模型
非监督学习
k-means算法,也成为k均值算法。一种采用贪心策略的局部最优问题的聚类算法。
import pandas as pd
import numpy as np
import random as ran
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d # 绘图
from sklearn.cluster import KMeans #K均值算法
def model_test():
data = open_file("C:\\Users\\happy\\Desktop\\Iris1.csv") #获取数据集
dataset = np.delete(data,-1,axis=1) #去掉最后一列
k_means = KMeans(n_clusters=3) #构建模型
k_means.fit(dataset)
km4_labels = k_means.labels_
ax = plt.subplot(projection='3d')
ax.scatter(dataset[:,0],dataset[:,1],dataset[:,2],\
c=km4_labels.astype(np.float))
ax.set_zlabel('Z') # 绘制坐标轴
ax.set_ylabel('Y')
ax.set_xlabel('X')
plt.show()
依旧是纸鸢花数据集,只不过把标签去掉了,为了能够三维展示,选取了前三维,做一个3个标签的聚类算法。
算法的过程描述为下图,来自《机器学习》(周志华)