#2.1.1 分类学习
##2.1.1.1 线性分类器(Linear Classifier)
线性分类器用于线性分类,常用LogisticRegression与SGDClassifier作为模型,逻辑回归模型计算时间长但模型性能高,随机梯度上升计算时间短但模型性能低,一般对于训练规模较大的模型,建议推荐SGDC法进行参数估计。
##2.1.1.2 支持向量机(分类)
支持向量机不仅可用于二分类问题,也可以用于多类别分类问题,支持向量机的优势在于可以筛选出对预测任务最为有效的少数样本,节省模型学习所需要的数据内存,同时也提高了模型的预测性能,但同时这种方法也需要付出更多的计算代价(CPU资源以及计算时间)
##2.1.1.3 朴素贝叶斯
朴素贝叶斯模型广泛应用于海量互联网文本分类任务,由于其特征独立假设,模型预估参数规模减少,节约了内存消耗和计算时间,也正因此,模型训练时无法将各个特征之间的联系考量在内,使得该模型在数据特征关联性较强的分类任务上性能不佳。
##2.1.1.4 K邻近分类
K近邻法很直观,没有参数训练过程,只是根据测试样本在训练数据中的分布直接做出分类决策,属于无参数模型中非常简单的一种,需要非常高的计算复杂度和内存消耗,一旦数据规模稍大,需要权衡更多计算时间的代价。
##2.1.1.5 决策树
决策树模型整体准确率不高,预测遇害者性能较好,预测生还者准确性不够,决策树优势在于直观,清晰可解释,方便可视化,同时也无需量化数据甚至标准化数据,仍属于有参数模型,需要花时间训练数据。
##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’)
>>>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)
找到体现最佳性能的特征筛选的百分比
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'), ('.', '.')]