python 机器学习及实践 ——从零开始通往Kaggle竞赛之路学习笔记(一)

#2.1.1 分类学习

##2.1.1.1 线性分类器(Linear Classifier)

  1. 数据下载:导入pandas,numpy包,创建特征列表,使用pandas.read_csv读取数据
    #数据描述:原始数据样本由699条样本,每个样本有11列不同的数值,1列用于检索ID,9列与肿瘤相关的医学特征,以及一列表示肿瘤类型的数值,数据同时有16个缺失值,用?表示
  2. 数据预处理:将数据中?替换为标准缺失值表示,丢弃带有缺失值的数据
  3. 分割数据:使用sklearn.model_selection 中的 train_test_spilt 模块
  4. 标准化数据: from sklearn.preprocessing import StandardScaler
  5. 训练模型:LogisticRegression 以及SGDClassifier
  6. 模型预测:y_predict = sgdc.predict(x_test)
  7. 评价指标1:正确率 sgdc.score(x_test,y_test),
  8. 评价指标2:Recall(召回率),Precision(精确率),F1 measure(F1指标)
    from sklearn.metrics import classification_report
    classification_report(y_test,y_predict,target_names=)

线性分类器用于线性分类,常用LogisticRegression与SGDClassifier作为模型,逻辑回归模型计算时间长但模型性能高,随机梯度上升计算时间短但模型性能低,一般对于训练规模较大的模型,建议推荐SGDC法进行参数估计。

##2.1.1.2 支持向量机(分类)

  1. 数据下载:from sklearn.datasets import load_digits 导入图片集
    #数据描述:手写数字图片共有1797张图,每幅图片由8*8的像素矩阵表示,一般将2D图片像素矩阵逐行拼接成1D像素特征向量。
  2. 数据预处理:digits = load_digits()
  3. 分割数据:使用sklearn.model_selection 中的 train_test_spilt 模块
  4. 标准化数据: from sklearn.preprocessing import StandardScaler
    X_train = ss.fit_transform(X_train) X_test=ss.transform(X_test)
    注意:一定要先fit_transform训练数据,然后transform测试数据,我开始把两个都写成了fit_transform,然后系统报错“dimension dismatch”维度不匹配,先拟合x_train,找到标准对它进行归一化,然后直接归一化训练数据就可以,如果继续拟合,得到的标准不一样,会导致最后维度不匹配。
  5. 训练模型:from sklearn.svm import LinearSVC
  6. 模型预测:y_predict = lsvc.predict(x_test)
  7. 评价指标1:正确率 lsvc.score(x_test,y_test),
  8. 评价指标2:Recall(召回率),Precision(精确率),F1 measure(F1指标)
    from sklearn.metrics import classification_report
    classification_report(y_test,y_predict,target_names=digits.target_names.astype(str))

支持向量机不仅可用于二分类问题,也可以用于多类别分类问题,支持向量机的优势在于可以筛选出对预测任务最为有效的少数样本,节省模型学习所需要的数据内存,同时也提高了模型的预测性能,但同时这种方法也需要付出更多的计算代价(CPU资源以及计算时间)

##2.1.1.3 朴素贝叶斯

  1. 数据下载:from sklearn.datasets import fetch_20newsgroups 即时从网络下载数据
    #数据描述:该数据共有18846条新闻,文本数据没有被设定特征,也没有数字化的量度,因此需要提取特征进行分类
  2. 数据预处理:news = fetch_20newsgroups(subset='all)
  3. 分割数据:使用sklearn.model_selection 中的 train_test_spilt 模块
  4. 特征抽取:from sklearn.feature_extraction.text import CountVectorizer
  5. 训练模型:from sklearn.svm import MultinomialNB
  6. 模型预测:y_predict =mnb.predict(x_test)
  7. 评价指标1:正确率 lsvc.score(x_test,y_test)
  8. 评价指标2:Recall(召回率),Precision(精确率),F1 measure(F1指标)
    from sklearn.metrics import classification_report
    classification_report(y_test,y_predict,target_names=news.target_names)

朴素贝叶斯模型广泛应用于海量互联网文本分类任务,由于其特征独立假设,模型预估参数规模减少,节约了内存消耗和计算时间,也正因此,模型训练时无法将各个特征之间的联系考量在内,使得该模型在数据特征关联性较强的分类任务上性能不佳。

##2.1.1.4 K邻近分类

  1. 数据下载:from sklearn.datasets import load_iris 即时从网络下载数据
  2. 数据预处理:iris = load_iris()
    #数据描述:iris数据集共有150朵鸢尾数据样本,均匀分布在三个种类中,每个数据样本被4个不同的形状特征所描述。
  3. 分割数据:使用sklearn.model_selection 中的 train_test_spilt 模块
  4. 特征抽取:from sklearn.feature_extraction.text import CountVectorizer
  5. 训练模型:from sklearn.svm import MultinomialNB
  6. 模型预测:y_predict =mnb.predict(x_test)
  7. 评价指标1:正确率 lsvc.score(x_test,y_test)
  8. 评价指标2:Recall(召回率),Precision(精确率),F1 measure(F1指标)
    from sklearn.metrics import classification_report
    classification_report(y_test,y_predict,target_names=news.target_names)

K近邻法很直观,没有参数训练过程,只是根据测试样本在训练数据中的分布直接做出分类决策,属于无参数模型中非常简单的一种,需要非常高的计算复杂度和内存消耗,一旦数据规模稍大,需要权衡更多计算时间的代价。

##2.1.1.5 决策树

  1. 下载 titanic=pd.read_csv(‘http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt’)
    #数据描述:共有1313条乘客信息,有的完整有的缺失,有的是数值类型有的是字符串,因此需要进行数据处理
  2. 特征提取:首先提取三个特征[‘age’,‘pclass’,‘sex’],因为性别,年龄,舱位等级是决定幸免于否的关键因素 X=titanic[[‘pclass’,‘age’,‘sex’]],y=titanic[‘survived’]
  3. 通过X.info()观察数据,可以得到两个需要完成的数据处理任务:1)age这个数据列数据不齐,需要补全数据,重要点在于使用平均数或者中位数补全数据对模型偏离造成的影响最小 2)需要把类别型数据处理成数据型数据
  4. 补全数据:X[‘age’].fillna(X[‘age’].mean(),inplace=True)
    #fillna用于补全数据,用平均数补全
  5. 数据分割:from sklearn.model_select import train_test_split
  6. 特征转换:from sklearn.feature_extraction import DictVectorizer
    vec = DictVectorizer(sparse=False)
    #实现one-hot编码,为什么选用sparse=False???
    X_train = vec.fit_transform(X_train.to_dict(orient=‘record’))
    orient不同参数选择的区别见下链接
    https://blog.csdn.net/m0_37804518/article/details/78444110
    #这里采用record方式,生成列表,列表中是每一行数据形成的字典
  7. 分类器:from sklearn.tree import DecisionTreeClassfier
  8. from sklearn.metrics import classification_report
    classification_report(y_predict,y_test,target_names=[‘died’,‘survived’])

决策树模型整体准确率不高,预测遇害者性能较好,预测生还者准确性不够,决策树优势在于直观,清晰可解释,方便可视化,同时也无需量化数据甚至标准化数据,仍属于有参数模型,需要花时间训练数据。

##2.1.2.1 回归预测
预测问题的待预测目标是连续变量:房价,降水等
主要采用:线性回归器 from sklearn.linear_model import LinearRegression
梯度下降 from sklearn.linear_model import SGDRegressior
1 回归预测的评价标准:MAE,MSE
MAE 平均绝对误差 from sklearn.metrics import mean_squared_error
MSE 均方误差 from sklearn.metrics import mean_absolute_error
R-squared from sklearn.metrics import r2_score
2 使用MSE/MAE模块时需要反标准化

面对数据规模较大的任务,随机梯度法在分类和回归问题上都比较高效,在不损失过多性能的前提下,节省大量计算时间。

##2.1.2.2 支持向量机(回归)
改变三种核函数

from sklearn.svm import SVR
linear_svr = SVR(kernel=‘linear’)
poly_svr = SVR(kernel=‘poly’)
rbf_svr = SVR(‘kernel’=‘rbf’)

径向基核函数对特征进行非线性映射以后,支持向量机展现了最佳的回归性能。

##2.1.2.3 K近邻(回归)
关键是对K个近邻目标数值使用普通的算术平均算法还是同时考虑距离差异进行加权平均
uni_knr = KNeighborsRegressor(weight=‘uniform’)预测方式为平均回归
dis_knr = KNeighborsRegressor(weighs=‘distance’)距离加权回归
距离加权回归预测性能更好。

##2.1.2.4 回归树
回归树和决策树类似,但回归树叶节点数据类型不是离散型而是连续型,决策树每个叶节点依照训练数据表现的概率倾向决定了其最终的预测类别,而回归树的叶节点却是一个个具体的值,回归树的叶节点返回的是一团训练数据的均值,而非具体连续的预测值。

树模型可以解决非线性特征的问题,不要求对特征标准化和统一量化,即数值型和类别型都可以直接被应用在树模型的构建和预测上,树模型也可以直观地输出决策过程,使得预测结果具有可解释性。但缺点是容易过拟合,失去泛化能力,预测稳定性较差,有限时间内无法找到最优解。

##2.1.2.5 集成模型(回归)
极端随机森林:构建一棵树的分离节点时,不会任意选取特征而是先随机收集一部分特征,然后利用信息熵和基尼不纯性挑选最佳的节点特征。
from sklearn.ensemble import RandomForestRegressor,ExtraTreesRegressor,GradientBoostingRegressor
rfr = RandomForestRegressor()
etr = ExtraTreesRegressor()
gbr = GradientBoostingRegressor()

from sklearn.svm import SVR
linear_svr = SVR(kernel=‘linear’)
poly_svr = SVR(kernel=‘poly’)
rbf_svr = SVR(‘kernel’=‘rbf’)

  • np.sort(list(zip(etr.feature_importances_,boston.feature_names)),axis=0)
  • np.sort 排序
  • zip 用于将可迭代的对象打包成元组
  • python3中zip是打包成一个object,需要转成list才可以sort
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)          # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]

zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

##2.2.1.1 Kmeans
评判Kmeans
-有标记 ARI
from sklearn import metrics
metrics.adjusted_rand_score(y_test,y_pred)
-无标记 轮廓系数
from sklearn.metrics import silhouette_score
肘部观察法
由于kmeans模型最终期望所有数据点到所属类簇距离平方和趋于稳定,通过观察这个数值,找到拐点就是最佳的类簇数量。
from scipy.spatial.distance import cdist

##2.2.1.2特征降维PCA

from sklearn.decomposition import PCA

plt.scatter(px,py,c=colors[i],label=‘scatter’ + str(i) )
plt.legend()即可显示标注

##3.1.1.1 特征抽取
DictVecotorizer处理符号化文本字典
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()

纯字符串 没有用字典存储的
TfidVectorizer 考虑某一次会在当前文本频率同时还考虑包含这个词汇的文本条数(即找出有贡献的重要词汇)
CountVectorizer考虑每种词汇在该条训练文本的频率
Stop Words 停用词 如the,a

CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵,矩阵元素a**[i][j]** 表示j词在第i个文本下的词频。即各个词语出现的次数,通过get_feature_names()可看到所有文本的关键字,通过toarray()可看到词频矩阵的结果。(原文:https://blog.csdn.net/weixin_38278334/article/details/82320307?utm_source=copy )

##3.1.1.2 特征筛选
DictVecotorizer处理符号化文本字典
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()

纯字符串 没有用字典存储的
TfidVectorizer 考虑某一次会在当前文本频率同时还考虑包含这个词汇的文本条数(即找出有贡献的重要词汇)
CountVectorizer考虑每种词汇在该条训练文本的频率
Stop Words 停用词 如the,a

CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵,矩阵元素a**[i][j]** 表示j词在第i个文本下的词频。即各个词语出现的次数,通过get_feature_names()可看到所有文本的关键字,通过toarray()可看到词频矩阵的结果。(原文:https://blog.csdn.net/weixin_38278334/article/details/82320307?utm_source=copy )

特征筛选
fs = feature_selection.SelectPercentile(feature_selection.chi2,percentile=20)

  • SelectPercentile 保留用户指定的最高的百分比的特征
  • For classification: chi2 or f_classif

找到体现最佳性能的特征筛选的百分比
results = []
percentiles = range(1,100,2)
for i in percentiles:
fs = feature_selection.SelectPercentile(feature_selection.chi2,percentile=i)
X_train_fs = fs.fit_transfrom(X_train,y_train)
scores = cross_val_score(dt,X_train_fs,y_train,cv=5)
results = np.append(results,scores.mean())
opt = np.where(results==results.max())[0]#找到最佳百分比值

#画图
import pylab as pl
pl.plot(percentiles,results)
pl.xlabel(‘percentiles of features’)
pl.ylabel(‘accuracy’)
pl.show()

##3.1.2 模型正则化
##3.1.2.1线性回归
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train,y_train)
xx = np.linspace(0,26,100)
yy = regressor.predict(xx)
plt1 = plt.plot(xx,yy,label=‘degree=1’) #一次拟合

二项式回归
from sklearn.preprocessing import PolynomialFeatures
poly2 = PolynomialFeatures(degree = 2)
X_train_poly2 = poly2.fit_transform(X_train) #由x的训练值生成二项式特征
在建模过程中多次用到过sklearn.preprocessing.PolynomialFeatures,可以理解为专门生成多项式特征,并且多项式包含的是相互影响的特征集,比如:一个输入样本是2维的。形式如[a,b] ,则二阶多项式的特征集如下[1,a,b,a2,ab,b2]。
链接:https://www.jianshu.com/p/4ca64b3701cc
regressor_poly2 = LinearRegression()
regressor_poly2.fit(X_train_poly2,y_train)#放进去拟合的是生成的多项式特征以及y训练值
xx_poly2 = poly2.transform(xx)
yy_poly2 = regressor_poly2.predict(xx_poly2)
plt2 = plt.plot(xx,yy_poly2,label='degree=2)

##L1正则化 提高性能并且特征更加稀疏
from sklearn.linear_model import Lasso
lasso_poly4 = Lasso
lasso_poly4.fit(X_train_poly4,y_train)
##L2正则化 压制参数之间差异性,使得参数中大部分元素很小
from sklearn.linear_model import Ridge
ridge_poly4 = Ridge()
ridge_poly4.fit(X_train_poly4,y_train)

##3.1.3.1 留一验证 7:3
##3.1.3.2 交叉验证 五折交叉验证
分成五份,每次取一份作为测试集,四份作为训练集

##3.1.4.1 网格搜索

from sklearn.grid_search import GridSearchCV
gs = GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3)

Pipeline 用于简化系统搭建流程,将文本抽取与分类器串联

clf=Pipeline([('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())])

np.logspace(-2,1,4)#等比数列,取4个数
np.linspace(-2,1,4)#等差数列,取4个数
##3.1.4.2 并行搜索
只需把n_jobs改为-1代表使用该计算器所有CPU

gs = GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1)

##3.2.1 自然语言处理包(NLTK)
如何让计算机处理、生成甚至理解人类的自然语言。
1 使用词袋法(Bag-of-words)对示例文本进行特征化

sent1 = 'The cat is walking in the bedroom.'
sent2 = 'A dog is running across the kitchen.'
from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer()
sentences = [sent1,sent2]
print(count_vect.fit_transform(sentences).toarray())
print(count_vect.get_feature_names())

[[0 1 1 0 1 1 0 0 2 1]
 [1 0 0 1 0 1 1 1 1 0]]
['across', 'bedroom', 'cat', 'dog', 'in', 'is', 'kitchen', 'running', 'the', 'walking']

2 使用NLTK
!!有一个经常出现的错误,把pythonfile name命名为需要导入的包的名字,这样会导致导入包时报错,例如这里

module 'nltk' has no attribute 'word_tokenize'

然后这里还需要加上

nltk.download('all')

寻找词根

stemmer = nltk.stem.PorterStemmer()
stem_1 = [stemmer.stem(t) for t in tokens_1]

词性标注

pos_tag_1 = nltk.tag.pos_tag(tokens_1)
[('The', 'DT'), ('cat', 'NN'), ('is', 'VBZ'), ('walking', 'VBG'), ('in', 'IN'), ('the', 'DT'), ('bedroom', 'NN'), ('.', '.')]
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值