Python机器学习----第1部分 环境安装及算法介绍

1、环境搭建

  下载Python3.6版本后,双击安装程序,下一步,下一步完成安装。安装路径选择的简单些,直接C盘或D盘下即可。安装完毕后,用pip下载virtualenv后,建立虚拟环境“ScikitLearn”。在虚拟环境目录下,用pip下载NumPy、SciPy、scikit-learn、matplotlib、pandas。

2、样本数据的准备

  我们把数据存放在cvs文件中,使用pandas读取数据,并抽取相应的列出来,做数据转换后,进行训练。

import Pandas as pd
import numpy as np
df = pd.read_cvs("文件路径",hearder=None)
y=df.iloc[0:100, 4].values  #抽取0--100行,第4列数据
y=np.where(y=='Iris-setosa',-1,1) #向量推导
X=df.iloc[0:100, [0,2]].values #抽取0--100行,第0列,第2列数据
#这里已将样本数据及分类结果抽取出来了,下面需要将样本数据分为训练数据和测试数据
from sklearn.cross_validation import train_test_split
X_train,X_test,Y_train,Y_test = train_test_split(X, y, test_size=0.3,random_state=0)
#将样本数据和分类结果拆分为训练数据(70%)和测试数据(30%)
#为了优化性能,很多机器学习算法要求对数据做特征缩放:
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
  在标准化过程中,使用训练数据计算特征缩放参数,而后使用同样的参数处理训练数据和测试数据。

  注意:这里只分了两个类别,scikit-learn算法基本上都支持多类别分类。

3、scikit-learn的感知器算法

  

from sklearn.linear_model import Perceptron
ppn = Perceptron(n_iter=40,eta=0.1,random_state=0)
ppn.fit(X_train_std,Y_train)
Y_pred = ppn.Predict(X_test_std)
(Y_test != Y_pred).sum()#得到错误预测的样本数
from sklearn.metrics import accuracy_score
accuracy_score(Y_test,Y_pred)#得到分类准确性
  感知器算法是机器学习的入门算法,对线性可分的样本有效,但对于非线性可分的样本,则不会收敛,实际项目中很少应用这个算法,而是使用逻辑斯蒂回归和SVM(支持向量机)等算法。

  代码中训练数据为X_train_std,测试数据为X_test_std,后缀std表示样本数据已经被标准化,后续不在做说明。

  上面代码中计算错误预测样本数和分类准确性的代码,可用于其他评估算法性能。对于二维的样本,我们可以使用matplotlib绘制图例查看样本是否为线性可分,并查看分类结果。但对于高维样本,则需降维后在绘制(后续继续深入研究)。

4、scikit-learn的逻辑斯蒂回归算法

from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=1000.0,random_state=0)
lr.fit(X_train_std, Y_train)  #训练模型
Y_pred = lr.predict(X_test_std)  #测试准确性
lr.predict_proba(X_test_std[0,:]) #得到一个样本数据在各个分类的概率的向量 
  如果模型在训练数据集上表现良好,在测试数据集上不佳,则存在过拟合,即高方差。原因是样本中特征(列数)太多,过于复杂。解决方案是进行正则化,过滤噪声。在LogisticsRegression和SVC(支持向量机)类的构造函数中有一个C参数,即为正则化强度参数,C越小,正则化强度约大。如果算法过拟合,可以减小参数C,加强正则化后再次训练和测试。

5、scikit-learn的支持向量机算法

from sklearn.SVM import SVC
svm = SVC(Kernel='linear', C=1.0,random_state=0)
svm.fit(X_train_std, Y_train)
Y_pred = svm.predict(X_test_std)
SVC类的构造函数中也有C参数,即为正则化强度(成反比),另一个参数Kernel指定核函数,值可为'linear'(处理线性可分数据集),或'rbf'(处理非线性可分数据集)

from sklearn.SVM import SVC
svm = SVC(Kernel='rbf', C=10.0, random_state=0, gamma=0.10)
svm.fit(X_train_std, Y_train)
Y_pred = svm.predict(X_test_std)
参数gamma决定了支持向量机分类的边界宽松程度(成反比)

6、 scikit-learn中超大数据量的情况的分类算法

from sklearn.linear_model import SGDClassifier
ppn = SGDClassifier(loss='Perceptron')  # 感知器算法
lr = SGDClassifier(loss='log')          #逻辑斯蒂回归算法
svm = SGDClassifier(loss='hinge')       #支持向量机算法
  如果数据量太大,无法一次加载到内存,则使用SGDClassifier算法进行训练。而且还提供了partial_fit方法进行在线学习(样本分批训练)。

7、scikit-learn中的决策树算法

from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(criterion='entropy',max_depth=3,random_state=0)
tree.fit(X_train,Y_train)
Y_pred = tree.predict(X_test)

决策树和下面说的K近邻算法如过拟合,正则化是无效的(因此构造函数没有提供参数C),需进行特征选择或降维处理。

8、scikit-learn中的随机森林算法

from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(criterion='entropy', 
                                n_estimators=10, #决策树数量
                                random_state=0,
                                n_jobs=2)        #使用几个CPU内核进行计算
forest.fit(X_train,Y_train)
Y_pred = forest.predict(X_test)
随机森林由多个决策树组成,准确性比单个决策树更好,易于扩展,具有更好的泛化误差,不易产生过拟合现象。

9、scikit-learn中的K-近邻算法

from sklearn.neighbors import KNeighborsClassifier
knn = KNerghborsClassifier(n_neighbers=5,
                           p=2,  #计算样本点间距离的算法 1为曼哈顿距离,2为欧几里得距离
                           metric='minkowski')
knn.fit(X_train,Y_train)  #因为要计算距离,所以先进行了标准化,防止某个特征值范围过大,计算出来的距离也过大,无法收敛
Y_pred = knn.predict(X_test)
上面介绍了scikit-learn提供的各种算法,对应类的构造函数参数具体意义与其算法理论相关,不做具体介绍。后续继续讲解如果选择参数的值,提高分类准确性。







猜你喜欢

转载自blog.csdn.net/henreash/article/details/79057465
今日推荐