机器学习从入门到创业手记-构造数据集

 

PPT页15

      

旁白:对于机器学习而言合适的数据一直都是稀缺资源,尤其是对于初学者根本无法找到适合自己模型算法的数据,所幸sklearn提供了制造训练数据的方法,请试着创造出样本数为10000特征数为3,共分4个类别的数据集,并显示出来。

 

安逸提交的代码:

 

import matplotlib.pyplot as plt

 

from sklearn.datasets import make_classification

 

扫描二维码关注公众号,回复: 5529401 查看本文章

plt.figure(figsize=(8, 8))

plt.title("Datasets")

 

# X为样本特征,Y为样本类别输出, 共10000个样本,每个样本3个特征,输出有4个类别,没有冗余特征,每个类别一个簇

X, Y = make_classification(n_samples=10000, n_features=3, n_redundant=0, n_clusters_per_class=1, n_classes=4)

plt.scatter(X[:, 0], X[:, 1] ,marker='o', c=Y, s=25, edgecolor='k')

plt.show()

系统运行结果如图3.4.1.1,可以看到明显四个分类。

图3.4.1.1

 

旁白:尝试多运行几次,你会发现每次产生的数据都不一样,充满了随机性,这样非常不利于进行算法模拟,故我们需要将产生的数据进行持久化存储,sklearn也提供了存储与引导数据的方法,该方法不仅可以存储数据还可以存储算法模型,用法参考PPT页16,将数据存储后每次运行时就可以使用相同的数据进行算法验证了。

 

3.4.2 数据预处理

PPT页17

 

旁白:数据集的标准化是最常见的要求。特征标准化指的是数据符合标准正态分布,即具有零均值和单位方差,许多学习算法中目标函数的基础都是假设所有的特征都是符合标准化的。如果某个特征的方差比其他特征大很多,那么该特征会主导最终的算法预测结果,导致无法从其他特征中进行学习。

PPT页18

 

旁白:鲁棒性原是统计学中的术语,现被用来标识系统在异常情况下的稳定性,越稳定鲁棒性越强,sklearn也提供了一种数据处理方式来增强鲁棒性。

PPT页19

      

旁白:归一化使得训练数据中各个属性对于目标函数的影响站在了统一的标准下,并且能加快收敛速度,这里需要注意的是归一化是将数据变为0到1之间的小数,会有数据的丢失,而标准化则是将数据按比例缩放,使数据都在一个特定的区间内,不会有数据丢失。

PPT页20

PPT页21

 

       旁白:我们很多时候面对的特征值不是数值型而是一些分类类型,如一个人的性别属性,分为男女,户籍可以是天津,北京等,如我们将性别作为被编码分类的对象,由于性别只有male和female两类,故male被编码为1,female被编码为0,参考PPT页20的运行输出结果,可以看到当再遇到male与female字符串时,数据都被处理为对应的唯一编码。

 

PPT页22

 

旁白:在实际应用中很多数据集的各个属性中都有丢失的数据,被编码成空值或其它特殊标识值,但大多数机器学习算法中要求每个数值都有意义,不完整的数据会导致最后的结果异常,所以我们采用填充算法将空值填充使其变得有意义。

3.4.3 集成算法

PPT页23

 

       旁白:假设你去随机问很多人同一个问题,然后将所有答案按照规则合并起来,通常这个群策群力的结果要比单一结果好很多,这个过程被称为群体智慧,而集成学习的思路也来自与此,如采用一组分类决策树,每一个都在随机训练集上做预测并得到了所有单一分组的预测值,然后通过投票等规则来整合结果完成预测。

该投票过程参考代码voteest.py。

      

votetest.py的内容:

 

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

data = load_iris()

X_train,X_test,y_train,y_test = train_test_split(data.data,data.target,random_state=33,test_size=0.25)

from sklearn.ensemble import RandomForestClassifier 

from sklearn.ensemble import VotingClassifier

from sklearn.linear_model import LogisticRegression    

from sklearn.svm import  SVC

log_clf   = LogisticRegression()      

rnd_clf   = RandomForestClassifier()    

svm_clf  = SVC(probability=True)

 

voting_clf = VotingClassifier(estimators=[('lr',log_clf),('rf',rnd_clf),('svc',       svm_clf)],voting='soft')

 

from sklearn.metrics import accuracy_score    

#将各个模型算法的准确率输出进行比对

for  clf   in    (log_clf,rnd_clf,svm_clf,voting_clf):     

       clf.fit(X_train,y_train)      

       y_pred   =clf.predict(X_test)   

       print(clf.__class__.__name__,       accuracy_score(y_test,     y_pred))      

 

Votetest.py运行结果输出:

 

LogisticRegression 1.0

RandomForestClassifier 0.9210526315789473

SVC 0.9473684210526315

VotingClassifier 0.9736842105263158

 

 

旁白:bagging又称为袋装,是一种根据均匀概率分布从数据集中重复抽样并可以有放回的算法,抽样样本集都和原始数据集同样大小,但由于抽样过程是有放回的,所以有些样本可能会在抽样样本集中被训练多次,而有些数据也可能从没被采集到,示例文件为baggingtest.py。

 

       baggingtest.py文件内容:

 

from sklearn.datasets import fetch_mldata

mnist = fetch_mldata('MNIST original')

from sklearn.ensemble import BaggingClassifier

from sklearn.neighbors import KNeighborsClassifier

from sklearn.model_selection import train_test_split

"""

max_samples 和 max_features 样本子集中样例和特征每次所占的比例

bootstrap 和 bootstrap_features 控制着样例和特征的抽取是有放回还是无放回的

"""

bagging = BaggingClassifier(KNeighborsClassifier(), max_samples=0.5, max_features=0.5,bootstrap=True,bootstrap_features=False)

 

X_train,X_test,y_train,y_test = train_test_split(mnist['data'],mnist['target'],random_state=33,test_size=0.25)

 

bagging.fit(X_train,y_train)

y_pred = bagging.predict(X_test)

print("bagging score : ",bagging.score(X_test,y_test))

 

旁白:boost又名提升,该算法描述的是一个迭代的过程,可以自适应地改变训练样本的分布,使基算法聚焦在那些很难区分的样本上,区别与bagging,提升算法给每个训练样本一个权值,并且在每一轮提升后自动调整权值,分类错误样本权值被增加,分类正确的样本权值被降低,典型的提升算法是adaboost,参考示例文件adaboosttest.py。

 

adaboosttest.py文件内容:

 

from sklearn.datasets import fetch_mldata

mnist = fetch_mldata('MNIST original')

from sklearn.ensemble import AdaBoostClassifier

from sklearn.model_selection import train_test_split

"""

base_estimator : AdaBoostClassifier默认的算法是DecisionTreeClassifier

"""

adaboost = AdaBoostClassifier( n_estimators = 10)

 

X_train,X_test,y_train,y_test = train_test_split(mnist['data'],mnist['target'],random_state=33,test_size=0.25)

 

adaboost.fit(X_train,y_train)

y_pred = adaboost.predict(X_test)

print("adaboost score : ",adaboost.score(X_test,y_test))

 

旁白:梯度提升算法GradientBoostingClassifier,既支持二分类又支持多分类问题,也可以用于回归问题,是一个准确高效的算法,其原理举例说明,某建筑物高50米,算法先用40米去拟合,这时损失有10米,接着我们用8米去拟合,发现损失还有2米,就这样一直迭代到设定的轮数,这个过程中距离标准的损失值也称为残差,残差的含义可以通过示例文件residualtest.py说明。

 

residualtest.py文件内容:

 

from sklearn.tree import DecisionTreeRegressor    

tree_reg1 =  DecisionTreeRegressor(max_depth=5)

tree_reg1.fit(X,y)

#利用残差继续迭代

y2 =y - tree_reg1.predict(X)   

tree_reg2 = DecisionTreeRegressor(max_depth=5) 

tree_reg2.fit(X, y2)

#继续迭代

y3 =y2 - tree_reg1.predict(X) 

ree_reg3 = DecisionTreeRegressor(max_depth=5)  

ree_reg3.fit(X,    y3)

 

 

猜你喜欢

转载自blog.csdn.net/yoki2009/article/details/88547741