Python Machine Learning Blueprints@py版注释代码—Ch1-Python机器学习的生态系统

小白学python
非原创,汇总迁移
只想找个地儿存代码
《Python 机器学习实践指南》@Alexander
Ch1-Python机器学习的生态系统

# -*- coding: utf-8 -*-
#《Python 机器学习实践指南》@Alexander 1.2.1获取
# import requests
# r = requests.get(r"https://api.github.com/users/acobms/starred)
# r.json



#p6 code
import os
import pandas as pd
import requests

#ModuleNotFoundError: No module named 'requests'错误
#未安装requests,pip install requests  -i  http://pypi.douban.com/simple --trusted-host=pypi.douban.com

PATH = r'E:\Data mining & AI\10-Python\python egs/'
r = requests.get('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data')
with open(PATH + 'iris.data','w') as f:
    f.write(r.text)

os.chdir(PATH)
res = open(PATH + 'iris.data')
df = pd.read_csv(res,names=['sepal length','sepal width','petal length','petal width','class'])

df.head()
#在指定目录下生成文件

df['sepal length']
df.describe()
df.corr()

#——————b——————————python 可视化:matplotlib—b———————————————————
#p11,3-可视化
import matplotlib.pyplot as plt
plt.style.use("ggplot")#将风格设置为类似于R的ggplot,要求 matplotlib 1.41
#%matplotlib inline#设置插图,在记事本可见
import numpy as np

#https://blog.csdn.net/jy12301/article/details/79200225
# #1.1单个直方图,P13
# fig,ax = plt.subplots(figsize=(6,4))
# ax.hist(df['petal width'],color = 'black')
# ax.set_ylabel('Count',fontsize=12)
# ax.set_xlabel('Width',fontsize=12)
# plt.title('Iris Petal Width',fontsize=14,y=1.01)
# plt.show()

# # 1.2对每列生成直方图
# fig,ax = plt.subplots(2,2,figsize=(6,4))
# ax[0][0].hist(df['petal width'],color='black')
# ax[0][1].hist(df['petal length'],color='black')
# ax[1][0].hist(df['sepal width'],color='black')
# ax[1][1].hist(df['sepal length'],color='black')
# plt.show()

# #2.堆积条形图P17
# fig,ax=plt.subplots(figsize=(6,6))
# bar_width = .8
# labels = [x for x in df.columns if 'length' in x or 'width' in x]
# print(df['class'].unique())#列出所有可用的唯一类
# ver_y = [df[df['class']=='Iris-versicolor'][x].mean() for x in labels]
# vir_y = [df[df['class']=='Iris-virginica'][x].mean() for x in labels]
# set_y = [df[df['class']=='Iris-setosa'][x].mean() for x in labels]
# x = np.arange(len(labels))
# ax.bar(x,vir_y,bar_width,bottom=set_y,color='darkgrey')#x、y的值传给bar()方法
# ax.bar(x,set_y,bar_width,bottom=ver_y,color='blue')
# ax.bar(x,ver_y,bar_width,color='red')
# ax.set_xticks(x + (bar_width/2))#调用.set_xticklabels()方法传入想要显示的列名
# ax.set_xticklabels(labels,rotation = -70,fontsize=12)
# ax.set_title('Mean Feature Meausurement By Class',y=1.01)
# ax.legend(['Iris-virginica','Iris-setosa','Iris-versicolor'])
# plt.show()
#
# #3 散点图
# fig,ax=plt.subplots(figsize=(6,6))
# ax.scatter(df['petal width'],df['petal length'],color='blue')
# #scatter绘制散点图
# ax.set_xlabel('Width',fontsize=12)
# ax.set_ylabel('length',fontsize=12)
# ax.set_title('Petal Scatter plot')
# plt.show()
#
# #4 折线图,P16
# fig,ax=plt.subplots(figsize=(6,6))
# ax.plot(df['petal length'],color='blue')
# ax.set_xlabel('Specimen Number',fontsize=12)
# ax.set_ylabel('petal length',fontsize=12)
# ax.set_title('Petal length plot')
# plt.show()

#—————————————————————python 可视化:Seaborn库————————————————————
# import seaborn as sns #pip install seaborn
# sns.pairplot(df, hue="class")
# # plt.show()#加上显示图片

#为4个特征生成小提琴图
# fig,ax = plt.subplots(2,2,figsize=(6,4))
# sns.set(style='white', palette='muted')
# sns.violinplot(x=df['class'], y=df['sepal length'], ax=ax[0, 0])
# sns.violinplot(x=df['class'], y=df['sepal width'], ax=ax[0, 1])
# sns.violinplot(x=df['class'], y=df['petal length'], ax=ax[1, 0])
# sns.violinplot(x=df['class'], y=df['petal width'], ax=ax[1, 1])
# fig.suptitle('Violin Plots',fontsize=16, y=1.03)
# for i in ax.flat:
#     plt.setp(i.get_xticklables(), rotation=-90)
# fig.tight_layout()
# plt.show()
#copy代码,   https://blog.csdn.net/u013452217/article/details/80749721
# fig,ax = plt.subplots(2,2, figsize=(7,7))
# sns.set(style='white', palette='muted')
# sns.violinplot(x=df['class'], y=df['sepal length'], ax=ax[0,0])
# sns.violinplot(x=df['class'], y=df['sepal width'], ax=ax[0,1])
# sns.violinplot(x=df['class'], y=df['petal length'], ax=ax[1,0])
# sns.violinplot(x=df['class'], y=df['petal width'], ax=ax[1,1])
# fig.suptitle('Violin Plots', fontsize = 16, y=1.03)
# for i in ax.flat:
#     plt.setp(i.get_xticklabels(),rotation=-90)
# fig.tight_layout()
# plt.show()

#—————————————————————python  操纵和准备数据,map————————————————————
# Map方法,适用于序列数据,用特殊字符为原有的class进行编码,替换原有的class列
# print(df['class'])
# df['class'] = df['class'].map({'Iris-setosa':'SET','Iris-virginica':'VIR','Iris-versicolor':'VER'})
# print(df['class'])

#—————————————————————python  操纵和准备数据,apply————————————————————
#Apply方法,p21
# df['wide petal'] = df['petal width'].apply(lambda v:1 if v>=1.3 else 0)
# print(df)
# #创建了新的列petal width,如果>=平均值1.3,赋值为1,否则为0

# df['petal area'] = df.apply(lambda r:r['petal length']*r['petal width'], axis=1)
# #创建了新的列petal area,计算数据框的两列数据,计算面积
# print(df)

#—————————————————————python  操纵和准备数据,Applymap————————————————————
#Applymap方法,P22,对数据框所有单元执行一个函数
# df.applymap(lambda v:np.log(v) if isinstance(v,float) else v)
# print(df)
#常用于:根据一定条件标准转化或者格式化每一个单元

#—————————————————————python 操纵和准备数据,Groupby————————————————————
#Groupby方法,P23,基于所选择的类别对数据进行分组
# print(df.groupby('class').mean())
# print(df.groupby('class').describe())
# print(df.groupby('petal width')['class'].unique())
# #通过唯一相关类的花瓣宽度,对类别进行分组,如果数量增大,可考虑用apply方法分割为不同范围进行管理
# print(df.groupby('class')['petal width']
#       .agg({'delta':lambda x:x.max() - x.min(),'max':np.max, 'min':np.min}))
#自定义聚集函数,np函数来源于Numpy库,np.max和np.min计算结果,并返回两者之差的lambda函数,以字典方式传给 .agg()方法

#—————————————————————python 建模和评估,Statsmodels————————————————————
#Statsmodels库,pip install statsmodels
# fig, ax = plt.subplots(figsize=(7,7))
# ax.scatter(df['sepal width'][:50], df['sepal length'][:50])
# ax.set_ylabel('Sepal Length')
# ax.set_xlabel('Sepal Width')
# ax.set_title('Setosa Sepal Width vs. Sepal Length', fontsize=14, y=1.02)
# plt.show()
#构建简单的线性回归模型,为setosa中的'sepal length'和'sepal width'建模
# import statsmodels.api as sm
# y = df['sepal length'][:50]
# x = df['sepal width'][:50]
# X = sm.add_constant(x)
# results = sm.OLS(y,X).fit()
# print(results.summary())
#
# fig, ax = plt.subplots(figsize=(7,7))
# ax.plot(x, results.fittedvalues, label='regression line')
# ax.scatter(x, y, label='data point', color='r')
# ax.set_ylabel('Sepal Length')
# ax.set_xlabel('Sepal Width')
# ax.set_title('Setosa Sepal Width vs. Sepal Length', fontsize=14, y=1.02)
# ax.legend(loc=2)
# plt.show()


#—————————————————————python 建模和评估,scikit-learn————————————————————
# #scikit-learn库,P28
from sklearn.ensemble import RandomForestClassifier
# from sklearn.cross_validation import train_test_split
from sklearn.multiclass import OneVsOneClassifier
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split # 分割数据模块



clf = RandomForestClassifier(max_depth=5,n_estimators=10)
#选择了使用10个决策树的森林,每棵树最多允许5层判定深度,防止过拟合overfitting

X = df.ix[:,:4]
y = df.ix[:,4]
#创建x矩阵和y向量,x矩阵包含四个特征,最后一列为iris类别,成为因变量y向量

# X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=.3)
# clf.fit(X_train,y_train)#每个分类器都使用fit()方法
# y_pred = clf.predict(X_test)#测试数据是分类器未使用过的数据
# rf = pd.DataFrame(list(zip(y_pred,y_test)),columns=['predicted','actual'])
# rf['correct'] = rf.apply(lambda r: 1 if r['predicted'] == r['actual'] else 0, axis=1)
# # print(rf)
# # print(rf['correct'].sum()/rf['correct'].count())

# #判断哪些特征提供了最佳的预测能力
# f_importances = clf.feature_importances_
# f_names = df.columns[:4]
# f_std = np.std([tree.feature_importances_ for tree in
#                 clf.estimator_], axis=0)
# zz = zip(f_importances, f_names, f_std)
# zzs = sorted(zz, key=lambda x: x[0], reverse=True)
# imps = [x[0] for x in zzs]
# labels = [x[1] for x in zzs]
# errs  = [x[2] for x in zzs]
# plt.bar(range(len(f_importances), imps, color="r", yerr=errs), align="center")
# plt.xticks(range(len(f_importances), labels)

#SVM,支持向量机
clf = OneVsOneClassifier(SVC(kernel='linear'))
X = df.ix[:,:4]
y = np.array(df.ix[:,4]).astype(str)
#标签y进行格式改变,SVM无法像随机森林分类器,将标签解释为numpy 的字符串
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=.3)
clf.fit(X_train,y_train)
y_pred = clf.predict(X_test)
rf = pd.DataFrame(list(zip(y_pred,y_test)),columns=['predicted','actual'])
rf['correct'] = rf.apply(lambda r:1 if r['predicted'] == r['actual'] else 0,axis=1)
print(rf)
print(rf['correct'].sum()/rf['correct'].count())


#——————python 可视化:fig, ax = plt.subplots()画多表图的3中常见样例 & 自定义图表格式——————————
#https://blog.csdn.net/htuhxf/article/details/82986440
# fig, axes = plt.subplots(2, 2)
#
# data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
#
# data.plot.bar(ax=axes[1, 1], color='b', alpha=0.5)
# data.plot.barh(ax=axes[0, 1], color='k', alpha=0.5)
#
# plt.show()
#
# import numpy as np
# import matplotlib.pyplot as plt
#
# fig, ax1 = plt.subplots(1, 1)  # 做1*1个子图,等价于 " fig, ax1 = plt.subplot() ",等价于 " fig, ax1 = plt.subplots() "
#
# ax2 = ax1.twinx()  # 让2个子图的x轴一样,同时创建副坐标轴。
#
# # 作y=sin(x)函数
# x1 = np.linspace(0, 4 * np.pi, 100)
# y1 = np.sin(x1)
# ax1.plot(x1, y1)
#
# #  作y = cos(x)函数
# x2 = np.linspace(0, 4 * np.pi, 100)  # 表示在区间[0, 4π]之间取100个点(作为横坐标,“线段是有无数多个点组成的”)。
# y2 = np.cos(x2)
# ax2.plot(x2, y2)





# ----------------------------------------pandas库 ----------------------------------------
#https://www.cnblogs.com/xiaoxuebiye/p/7223774.html
#导入数据
# pd.read_csv(filename):从CSV文件导入数据
# pd.read_table(filename):从限定分隔符的文本文件导入数据
# pd.read_excel(filename):从Excel文件导入数据
# pd.read_sql(query, connection_object):从SQL表/库导入数据
# pd.read_json(json_string):从JSON格式的字符串导入数据
# pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
# pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
# pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据

# 导出数据:
# df.to_csv(filename):导出数据到CSV文件
# df.to_excel(filename):导出数据到Excel文件
# df.to_sql(table_name, connection_object):导出数据到SQL表
# df.to_json(filename):以Json格式导出数据到文本文件
#
# 创建测试对象:
# pd.DataFrame(np.random.rand(20, 5)):创建20行5列的随机数组成的DataFrame对象
# pd.Series(my_list):从可迭代对象my_list创建一个Series对象
# df.index = pd.date_range('1900/1/30', periods=df.shape[0]):增加一个日期索引
#
# 查看、检查数据:
# df.head(n):查看DataFrame对象的前n行
# df.tail(n):查看DataFrame对象的最后n行
# df.shape():查看行数和列数
# http: // df.info() :查看索引、数据类型和内存信息
# df.describe():查看数值型列的汇总统计
# s.value_counts(dropna=False):查看Series对象的唯一值和计数
# df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数
#
# 数据选取:
# df[col]:根据列名,并以Series的形式返回列
# df[[col1, col2]]:以DataFrame形式返回多列
# s.iloc[0]:按位置选取数据
# s.loc['index_one']:按索引选取数据
# df.iloc[0, :]:返回第一行
# df.iloc[0, 0]:返回第一列的第一个元素
#
# 数据统计:
# df.describe():查看数据值列的汇总统计
# df.mean():返回所有列的均值
# df.corr():返回列与列之间的相关系数
# df.count():返回每一列中的非空值的个数
# df.max():返回每一列的最大值
# df.min():返回每一列的最小值
# df.median():返回每一列的中位数
# df.std():返回每一列的标准差
#
#
# 数据合并:
# df1.append(df2):将df2中的行添加到df1的尾部
# df.concat([df1, df2], axis=1):将df2中的列添加到df1的尾部
# df1.join(df2, on=col1, how='inner'):对df1的列和df2的列执行SQL形式的join
#
# 数据处理:
# df[df[col] > 0.5]:选择col列的值大于0.5的行
# df.sort_values(col1):按照列col1排序数据,默认升序排列
# df.sort_values(col2, ascending=False):按照列col1降序排列数据
# df.sort_values([col1, col2], ascending=[True, False]):先按列col1升序排列,后按col2降序排列数据
# df.groupby(col):返回一个按列col进行分组的Groupby对象
# df.groupby([col1, col2]):返回一个按多列进行分组的Groupby对象
# df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
# df.pivot_table(index=col1, values=[col2, col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
# df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
# data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
# data.apply(np.max, axis=1):对DataFrame中的每一行应用函数np.max
#
# 数据清理:
# df[df[col] > 0.5]:选择col列的值大于0.5的行
# df.sort_values(col1):按照列col1排序数据,默认升序排列
# df.sort_values(col2, ascending=False):按照列col1降序排列数据
# df.sort_values([col1, col2], ascending=[True, False]):先按列col1升序排列,后按col2降序排列数据
# df.groupby(col):返回一个按列col进行分组的Groupby对象
# df.groupby([col1, col2]):返回一个按多列进行分组的Groupby对象
# df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
# df.pivot_table(index=col1, values=[col2, col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
# df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
# data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
# data.apply(np.max, axis=1):对DataFrame中的每一行应用函数np.max
#
# 其它操作:
#
# 改列名:
# 方法1:a.columns = ['a', 'b', 'c']
#
# 方法2:a.rename(columns={'A': 'a', 'B': 'b', 'C': 'c'}, inplace=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值