LAMOST一期巡天中M矮星的数据挖掘

204 阅读9分钟
本文已参与「新人创作礼」活动,一起开启掘金创作之路。

#LAMOST简介 **郭守敬望远镜(LAMOST,大天区面积多目标光纤光谱天文望远镜)**是一架新类型的大视场兼备大口径望远镜,即“王-苏反射施密特望远镜”。

它是由反射施密特改正板MA(大小为5.72米×4.40米,24块对角线长1.1米,厚度为25毫米的六角形平面子镜组成)、球面主镜MB(大小为6.67米×6.05米,37块对角线长为1.1米,厚度为75毫米的六角形球面子镜组成)和焦面构成。球面主镜及焦面固定在地基上,反射施密特改正板作为定天镜跟踪天体的运动,望远镜在天体经过中天前后时进行观测。天体的光经MA反射到MB,再经MB反射后成像在焦面上。焦面上放置的光纤,将天体的光分别传输到光谱仪的狭缝上,然后通过光谱仪后的CCD探测器同时获得大量天体的光谱。

image.png

image.png

image.png

LAMOST应用薄镜面主动光学加拼接镜面主动光学技术,在曝光1.5小时内可以观测到暗达20.5等的天体,使其成为大口径兼大视场光学望远镜的世界之最。同时,采用并行可控的光纤定位技术,在5度视场,直径为1.75米的焦面上放置4000根光纤,同时获得4000个天体的光谱,使其成为世界上光谱获取率最高的望远镜。

LAMOST安放在中国科学院国家天文台兴隆观测站,该站地处燕山主峰南麓,位于河北省兴隆县连营寨(东经7小时50分,北纬40度23分),海拔960米。LAMOST在大规模光学光谱观测和大视场天文学研究方面,居于国际领先的地位。

image.png

(上述文字和图片来源于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万颗恒星光谱参数星表。

image.png

LAMOST DR1 相关论文

我们在LAMOST一期官网上就能够直接下载巡天结构化数据,通过data access->file download,点击OK同意数据政策,选择catalog目录下的dr1_m_stellar.csv.gz文件,解压后就是M矮星的数据集了(csv格式)。

image.png

image.png


#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)

image.png

###2. 数据概况

df.info()

image.png

根据上述信息,数据集大小为121522行32列,不包含空值,原始数据类型都是object,要进行数据类型转换。而根据官网给出的字段信息表,整理字段信息如下:

M dwarfs catalog

Field (unit)TypeComment
specIdlong integerUnique Spectra ID
designationvarcharTarget Designation
obsDatefloatTarget Observation Date
plateIdIntegerPlate ID
lmjdcharLocal Modified Julian Day
planIdcharPlan Name
spIdintegerSpectrograph ID
fiberIdintegerFiber ID
RA (degree)floatRight Ascension
Dec (degree)floatDeclination
snrufloatSignal Noise Ratio of u filter
snrgfloatSignal Noise Ratio of g filter
snrrfloatSignal Noise Ratio of r filter
snrifloatSignal Noise Ratio of i filter
snrzfloatSignal Noise Ratio of z filter
objTypevarcharObject Type
classvarcharStellar Class
subClassvarcharStellar Sub-Class
magTypevarcharTarget Magnitude Type
mag1 (mag)floatAssociated Magnitude 1
mag2 (mag)floatAssociated Magnitude 2
mag3 (mag)floatAssociated Magnitude 3
mag4 (mag)floatAssociated Magnitude 4
mag5 (mag)floatAssociated Magnitude 5
mag6 (mag)floatAssociated Magnitude 6
mag7 (mag)floatAssociated Magnitude 7
tsourcevarcharOrganization or person who submits input catalog
fiberTypevarcharFiber Type of target [Obj, Sky, F-std, Unused, PosErr, Dead]
tfromvarcharInput catalog submitted by an organization or a person determined by the tsource
tInfovarcharTarget ID from SDSS, UCAC4, PANSTAR and other catalogue
RV (km/s)floatHeliocentric Radial Velocity
RV_err (km/s)floatUncertainty of Heliocentric Radial Velocity
ATCHAintegerMagnetic Activity

LAMOST DR1 M矮星数据信息描述

根据表中定义好的数据类型,将数据集中的数据做类型转换。

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()

image.png

接下来可视化数据集的描述和相关性,这里用到了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()

image.png

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()

image.png

###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)

image.png

for fea in categorical_features:
    print(df[fea].nunique())

image.png

###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

image.png

我们再重新整理下每个数字特征代表的意义,做进一步的分析。

  • 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 天文学名词数据库

天文名词解释:星等(magnitude)

###5. 类别特征分析 同样地对每个类别特征进行一番整理,以便进一步分析。

for cat_fea in categorical_features:
    print(cat_fea + "的特征分布如下:")
    print("{}特征有个{}不同的值".format(cat_fea, df[cat_fea].nunique()))
    print(df[cat_fea].value_counts())

image.png

image.png

  • 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])

image.png 从数值分布来看,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)

image.png 由于需要分析的数据以线性为主,用不到数据分桶。

###3. 降维 PCA/ LDA/ ICA

###4. 标准归一化 标准化(转换为标准正态分布) 归一化(抓换到 [0,1] 区间)

###5. 特征构造 构造统计量特征,报告计数、求和、比例、标准差等; 时间特征,包括相对时间和绝对时间,节假日,双休日等; 地理信息,包括分箱,分布编码等方法; 非线性变换,包括 log/ 平方/ 根号等;

###6. 特征筛选 过滤式(filter) 包裹式(wrapper) 嵌入式(embedding)