数据分析-机器学习(一)

2018-11-25  本文已影响0人  ZplD

简单来说机器学习就是讲一段已经存有的数据,与数据对应的结果通过机器学习的算法,得到估计函数.然后再将需要预测的函数用估计函数得到预测结果

image.png

机器学习分类

简单来说就是已经给了你数据并且给了数据所产生的结果

在只有数据却没有结果的情况下,寻找影藏的模式或内在结构

在半监督学习方式下,训练数据有部分被标识,部分没有被标识,这种模型首先需要学习数据的内在结构,以便合理的组织数据来进行预测。算法上,包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。

有监督学习

有监督学习机器算法有分类和回归两类

分类主要用于数据分散,且预测结果只分为几类,常用的分类机器算法有以下几种:

K近邻(k-Nearest Neighbor,KNN)分类算法的核心思想是如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别

#导入KNN算法
from sklearn.neighbors import KNeighborsClassfier
knn = KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=1, **kwargs)
# n_neighbors每个类别取多少个点来算距离一般不大于10,weights预测的权函数有uniform与distance两种,p是使用距离度量参数 metric 附属参数,只用于闵可夫斯基距
#离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。默认为2
knn.fit(x_train,y_train)#训练数据,x_train为用来训练的数据,y_train为数据所对应的结果
knn.score(x_train,y_train)#得出训练数据的得分
y_ = knn.predict(x_test) #用测试数据去算出预测结果
knn.score(x_test,y_test)#测试数据的得分
#y_test,是x_test对应的正确结果,而y_是根据knn.fit()训练完后去预测的结果

根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。
Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:
(1)找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程是非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。
(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。
(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有梯度下降法(Gradient Descent)。
损失值简单来说就是(y_-y_test)^2求平均

from sklearn.linear_model import LogisticRegression
logistic = LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
#solver参数的选择:
    #“liblinear”:小数量级的数据集
    #“lbfgs”, “sag” or “newton-cg”:大数量级的数据集以及多分类问题
    #“sag”:极大的数据集
#C惩罚项,用来去除权重交小的参数
logistic.fit(x_train,y_train)
logistic.score(x_train,y_train)
y_ = logistic.predict(x_test)
from sklearn.tree import DecisionTreeClassfier
tree = DecisionTreeClassfier(max_depth)
tree.fit(x_train,y_train)#训练数据,x_train为用来训练的数据,y_train为数据所对应的结果
tree.score(x_train,y_train)#得出训练数据的得分
y_ = tree.predict(x_test) #用测试数据去算出预测结果
tree.score(x_test,y_test)#测试数据的得分
#max_depth为决策深度,需要调节,过高容易过拟合,而过低容易欠拟合

原理:支持向量机,其含义是通过支持向量运算的分类器。其中“机”的意思是机器,可以理解为分类器。 那么什么是支持向量呢?在求解的过程中,会发现只根据部分数据就可以确定分类器,这些数据称为支持向量。且SVM的优点就在于可支持线性与非线性分类,而其中线性分类可以理解为这些有n个属性和一个二分类标志,而这个n个属性是存在于n维的空间中,而线性分类就是要寻找一个能使这个超平面能将n个属性分成两类,且离两类的距离最大的超平面.而非线性的话,简单来说会更灵活.


image.png

如图中,只根据几个点就能得出最适合的分类线

# 比较几种核函数
#导入鸢尾花数据
from sklearn.datasets import load_iris
#svm中的svc是做分类,而svm是做回归
from sklearn.svm import SVC,LinearSVC
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
data = load_iris()['data'][:,0:2]
target = load_iris()['target']
# 取data中的两个特征画点
x_min,x_max = data[:,0].min(),data[:,0].max()
y_min,y_max = data[:,1].min(),data[:,1].max()
# 设置面的范围
x,y = np.linspace(x_min,x_max,1000),np.linspace(y_min,y_max,1000)
# 创建网格
X,Y = np.meshgrid(x,y)
# 创建预测数据
x_test = np.c_[X.ravel(),Y.ravel()]
#将svc核设置为线性
plt.figure(figsize=(5*4,4))
index = 1
for i in ['linear', 'poly', 'rbf']:
    svc = SVC(kernel=i)
    svc.fit(data,target)
    y_ = svc.predict(x_test)
    #设置每个图的位置
    axes = plt.subplot(1,4,index)
    #画出面
    axes.pcolormesh(X,Y,y_.reshape(1000,1000))
    #画出点做对比
    axes.scatter(data[:,0],data[:,1],c=target,cmap='rainbow')
    #设置标题
    axes.set_title(i)
    index += 1
#在加入Linearsvc比较
Linearsvc = LinearSVC()
Linearsvc.fit(data,target)
y_ = svc.predict(x_test)
axes = plt.subplot(1,4,4)
axes.pcolormesh(X,Y,y_.reshape(1000,1000))
axes.scatter(data[:,0],data[:,1],c=target,cmap='rainbow')
axes.set_title('linearsvc')
image.png

而回归则是用在数据是连续的,并且预测结果明显是不同的.例如温度变化或时间变化.包括一元回归和多元回归,线性回归和非线性回归,回归的机器算法有以下几种:

原理:假定输人数据存放在矩阵X中,而回归系数存放在向量W中。那么对于给定的数据X1, 预测结果将会通过
Y=XW
Y=X1
W1+X2W2+X3W3+.......(几个特征就会有几个回归系数,通过算法可以找出这些回归系数)
给出。现在的问题是,手里有一些X和对应的Y,怎样才能找到W呢?
一个常用的方法就是找出使误差最小的W。这里的误差是指预测Y值和真实Y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以我 们采用平方误差。
最小二乘法:

image.png
from sklearn.linear_model import LinearRegression
linear = LinearRegression()
linear.fit(x_train,y_train)
y_  = linear(x_test)
linear.coef_ #回归系数
linear.intercept_ #截距
image.png

当数据的特征比样本点还多的时候,输入的矩阵X就不是满秩矩阵将不可逆所以就引入Ridege岭回归,简单来说就引入一个惩罚项λ使矩阵X成为满秩矩阵可逆,并且去掉一些不重要的参数,适用于一些过拟合或各边存在多重共线性的时候

from sklearn.linear_model import Ridge
ridge= Ridge(alpha)
ridge.fit(x_train,y_train)
y_  = ridge(x_test)
ridge.coef_ #回归系数
ridge.intercept_ #截距
#alpha就是λ惩罚项
#与岭回归相似
from sklearn.linear_model import Lasso
lasso= Lasso(alpha)
lasso.fit(x_train,y_train)
y_  = lasso(x_test)
lasso.coef_ #回归系数
lasso.intercept_ #截距
#alpha就是λ惩罚项
#Lasso效果会比岭回归好
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
上一篇下一篇

猜你喜欢

热点阅读