LAMOST简介
郭守敬望远镜(LAMOST,大天区面积多目标光纤光谱天文望远镜)是一架新类型的大视场兼备大口径望远镜,即“王-苏反射施密特望远镜”。
它是由反射施密特改正板MA(大小为5.72米×4.40米,24块对角线长1.1米,厚度为25毫米的六角形平面子镜组成)、球面主镜MB(大小为6.67米×6.05米,37块对角线长为1.1米,厚度为75毫米的六角形球面子镜组成)和焦面构成。球面主镜及焦面固定在地基上,反射施密特改正板作为定天镜跟踪天体的运动,望远镜在天体经过中天前后时进行观测。天体的光经MA反射到MB,再经MB反射后成像在焦面上。焦面上放置的光纤,将天体的光分别传输到光谱仪的狭缝上,然后通过光谱仪后的CCD探测器同时获得大量天体的光谱。
反射施密特改正板MA 球面主镜MB 焦面板LAMOST应用薄镜面主动光学加拼接镜面主动光学技术,在曝光1.5小时内可以观测到暗达20.5等的天体,使其成为大口径兼大视场光学望远镜的世界之最。同时,采用并行可控的光纤定位技术,在5度视场,直径为1.75米的焦面上放置4000根光纤,同时获得4000个天体的光谱,使其成为世界上光谱获取率最高的望远镜。
LAMOST安放在中国科学院国家天文台兴隆观测站,该站地处燕山主峰南麓,位于河北省兴隆县连营寨(东经7小时50分,北纬40度23分),海拔960米。LAMOST在大规模光学光谱观测和大视场天文学研究方面,居于国际领先的地位。
国家天文台兴隆观测站(上述文字和图片来源于LAMOST官网)
LAMOST DR1 M矮星数据下载
LAMOST第一次巡天数据发布(DR1)包括有先导巡天和第一年巡天的光谱数据,观测时间自2011年10月24日开始,到2013年6月15日结束。其中LAMOST先导巡天自2011年10月24日开始、到2012年6月24日结束,共观测401个天区,获得547,868条信噪比大于10的恒星光谱和373,481颗恒星参数星表。2012年9月28日,LAMOST正式巡天启动,2013年6月15日圆满结束第一年巡天观测,共观测689个天区,获得1,173,928条信噪比大于10的恒星光谱和711,923颗恒星参数星表。 DR1释放光谱数共计220万,其中还包括108万颗恒星光谱参数星表。
LAMOST一期观测天区我们在LAMOST一期官网上就能够直接下载巡天结构化数据,通过data access->file download,点击OK同意数据政策,选择catalog目录下的dr1_m_stellar.csv.gz文件,解压后就是M矮星的数据集了(csv格式)。
同意数据政策 选择M矮星数据(csv格式)LAMOST DR1 M矮星数据探索
数据探索在机器学习中我们一般称为EDA(Exploratory Data Analysis)
1. 加载数据集
import pandas as pd
df = pd.read_csv('datalab/65470/dr1_m_stellar.csv', header = None)
df1 = df[0].str.split('|',expand=True) #去除分割线
df1.columns = df1.iloc[0] #将第一行复制为列头
df = df1.drop(index=[0]) #去掉第一行
df.head(5)
加载数据集
2. 数据概况
df.info()
数据集信息
根据上述信息,数据集大小为121522行32列,不包含空值,原始数据类型都是object,要进行数据类型转换。而根据官网给出的字段信息表,整理字段信息如下:
M dwarfs catalog
Field (unit) | Type | Comment |
---|---|---|
specId | long integer | Unique Spectra ID |
designation | varchar | Target Designation |
obsDate | float | Target Observation Date |
plateId | Integer | Plate ID |
lmjd | char | Local Modified Julian Day |
planId | char | Plan Name |
spId | integer | Spectrograph ID |
fiberId | integer | Fiber ID |
RA (degree) | float | Right Ascension |
Dec (degree) | float | Declination |
snru | float | Signal Noise Ratio of u filter |
snrg | float | Signal Noise Ratio of g filter |
snrr | float | Signal Noise Ratio of r filter |
snri | float | Signal Noise Ratio of i filter |
snrz | float | Signal Noise Ratio of z filter |
objType | varchar | Object Type |
class | varchar | Stellar Class |
subClass | varchar | Stellar Sub-Class |
magType | varchar | Target Magnitude Type |
mag1 (mag) | float | Associated Magnitude 1 |
mag2 (mag) | float | Associated Magnitude 2 |
mag3 (mag) | float | Associated Magnitude 3 |
mag4 (mag) | float | Associated Magnitude 4 |
mag5 (mag) | float | Associated Magnitude 5 |
mag6 (mag) | float | Associated Magnitude 6 |
mag7 (mag) | float | Associated Magnitude 7 |
tsource | varchar | Organization or person who submits input catalog |
fiberType | varchar | Fiber Type of target [Obj, Sky, F-std, Unused, PosErr, Dead] |
tfrom | varchar | Input catalog submitted by an organization or a person determined by the tsource |
tInfo | varchar | Target ID from SDSS, UCAC4, PANSTAR and other catalogue |
RV (km/s) | float | Heliocentric Radial Velocity |
RV_err (km/s) | float | Uncertainty of Heliocentric Radial Velocity |
ATCHA | integer | Magnetic Activity |
根据表中定义好的数据类型,将数据集中的数据做类型转换。
df["#obsid"] = df["#obsid"].astype("int")
df['obsdate'] = pd.to_datetime(df['obsdate'],errors='ignore')
df["spid"] = df["spid"].astype("int")
df["fiberid"] = df["fiberid"].astype("int")
df["objra"] = df["objra"].astype("float")
df["objdec"] = df["objdec"].astype("float")
df["snru"] = df["snru"].astype("float")
df["snrg"] = df["snrg"].astype("float")
df["snrr"] = df["snrr"].astype("float")
df["snri"] = df["snri"].astype("float")
df["snrz"] = df["snrz"].astype("float")
df["mag1"] = df["mag1"].astype("float")
df["mag2"] = df["mag2"].astype("float")
df["mag3"] = df["mag3"].astype("float")
df["mag4"] = df["mag4"].astype("float")
df["mag5"] = df["mag5"].astype("float")
df["mag6"] = df["mag6"].astype("float")
df["mag7"] = df["mag7"].astype("float")
df["rv"] = df["rv"].astype("float")
df["rv_err"] = df["rv_err"].astype("float")
df["ATCHA"] = df["ATCHA"].astype("int")
df.info()
类型转换后的数据集信息
接下来可视化数据集的描述和相关性,这里用到了seaborn来绘制热力图。
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.figure(figsize=(12,8))
sns.heatmap(df.describe().transpose(), annot=True, linecolor="w", linewidth=2)
plt.show()
数据集摘要
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.figure(figsize=(12,8))
sns.heatmap(df.corr(), annot=True, linecolor="w", linewidth=2)
plt.show()
相关性
3. 数字特征和类别特征
我们再根据数据类型将特征分为数字特征和类别特征,然后对类别特征查看unique分布。
import numpy as np
#数字特征
numeric_features = df.select_dtypes(include=[np.number])
print(numeric_features.columns)
#类别特征
categorical_features = df.select_dtypes(include=[np.object])
print(categorical_features.columns)
数字特征和类别特征
for fea in categorical_features:
print(df[fea].nunique())
类别特征的unique值分布
4. 数字特征分析
然后开始分析数值特征,用直方图来显示每个数字特征的分布情况。
import warnings
warnings.filterwarnings("ignore")
f = pd.melt(df, value_vars=numeric_features) #将数据集按数字特征分组
f.columns=['field','value'] #重命名列名field、value
g = sns.FacetGrid(f, col='field', col_wrap=4, sharex=False, sharey=False) #按field分图,每行4个
g = g.map(sns.distplot, "value") #使用直方图显示value
数值特征分析
我们再重新整理下每个数字特征代表的意义,做进一步的分析。
- obsid 观测id,取值为正整数,用于记录观测的id,对数据挖掘意义不大。
- spid 摄谱仪id,取值从1到16的正整数,可用于分类。
- fiberId 光纤id,取值从1到250的正整数,结合摄谱仪id使用。
- objra 赤经,取值为浮点型的正实数,结合赤纬定位目标。
- objdec 赤纬,取值为浮点型的正实数,结合赤经定位目标。
- snru snrg snrr snri snrz 目标五个波段的信噪比,数据挖掘的重点。
- mag1 mag2 mag3 mag4 mag5 mag6 mag7 目标七个波段对应的星等,按波段分别对应ugrizjh七个波段,数据挖掘的重点。
- rv 日心视向速度,单位是km/s,-9999代表不确定。
- rv_err 日心视向速度的不确定度。
- ATCHA 磁活动性,取值为0、1、-9999,0代表无磁活动,1的代表有磁活动,-9999代表不确定是否有磁活动,可用于分类。
(天文名词的中文翻译来源于 NADC 天文学名词数据库)
5. 类别特征分析
同样地对每个类别特征进行一番整理,以便进一步分析。
for cat_fea in categorical_features:
print(cat_fea + "的特征分布如下:")
print("{}特征有个{}不同的值".format(cat_fea, df[cat_fea].nunique()))
print(df[cat_fea].value_counts())
类别特征分析1
类别特征分析2
- designation 目标编号,采用了SDSS(斯隆数字巡天)的名字规则,J后面到+前面的数字代表以HMS(时分秒)为单位的赤经,+后面的数字则以DMS(度分秒)为单位的赤纬,不具数据挖掘条件。
- mjd 儒略日,主要是天文学上使用,可转化为公历。
- planid 观测计划编号,用于分类。
- objtype 分类,有16个类别,对数据挖掘意义不大。
- class 星体分类,通过光谱分析后的成果。分为 ‘STAR’(恒星), ‘GALAXY’(星系), ‘QSO’ (类星体), ‘Unknown’(不明)四大类。在M矮星数据中都是恒星类型。
- subclass 星体子分类,结合星体分类,可作为目标的预测值,是数据挖掘的核心。M矮星光谱分类基于可见光波段的光谱形态,分为M0到M9十类。
- magtype 星等类型,有23个类别,用于分类。
- tsource 已发布巡天目录的来源,可以是人或组织,备注用信息。
- fibertype 光纤类型,在M矮星中有两类,Obj代表光纤被分配到了目标上, F-std代表光纤用于获取通量校准标准星的光。
- tfrom 被确认过的巡天目录的来源,结合tsource 使用。
- t_info 在其他巡天目录的目标编号,比如SDSS, UCAC4, PANSTAR中,结合tfrom使用。
特征工程
对于特征开展进一步分析,并对于数据进行处理。
1. 异常处理
我们用箱线图分析下重点关注的数字特征(SNR和星等)对应预测值(星体子分类)的分布情况。
import itertools
columns = ['snrg','snrr','snri','snrz','snru','mag1','mag2','mag3','mag4','mag5','mag6','mag7']
length = len(columns)
plt.figure(figsize=(12,36))
for i,j in itertools.zip_longest(columns,range(length)):
plt.subplot(12,1,j+1)
sns.lvplot(x=df["subclass"],y=df[i])
不同波段SNR和星等和星体子分类
从数值分布来看,i波段(snri,mag3)和z波段(snrz,mag4)对星体子分类的影响比较明显。异常值则主要分布在snru字段中,从先验知识看这些异常值不影响预测,所以不用处理。
2. 数据分桶
对数字特征进行分桶,相当于将原本连续的数据维度引入了非线性,提示特征的表达能力。
bins=[0,10,15,20]
df1 = pd.cut(df['mag2'], bins)
df2 = df1.value_counts(ascending=True)
print(df2)
#ax = sns.countplot(y = df1, order = df2.index)
#for i,j in enumerate(df2):ax.text(100,i,j,fontsize=20)
对mag2分桶后的数据统计结果
由于需要分析的数据以线性为主,用不到数据分桶。
3. 降维
PCA/ LDA/ ICA
4. 标准归一化
标准化(转换为标准正态分布)
归一化(抓换到 [0,1] 区间)
5. 特征构造
构造统计量特征,报告计数、求和、比例、标准差等;
时间特征,包括相对时间和绝对时间,节假日,双休日等;
地理信息,包括分箱,分布编码等方法;
非线性变换,包括 log/ 平方/ 根号等;
6. 特征筛选
过滤式(filter)
包裹式(wrapper)
嵌入式(embedding)
网友评论